理解Docker入门-容器技术
了解Docker容器的概念。
在当今的技术领域中,”它在我的系统上可以运行” 是开发人员经常使用的短语。但是有很多情况下,开发人员系统上运行的应用程序在测试人员或生产环境中无法运行,这就导致了混乱。
Docker 就是为了解决这类问题而引入的。💯
为什么选择Docker?
让我向您讲述一下我个人对Docker的重要性的体验。
我与我的团队一起开发了一个全栈项目,其中我需要在前端使用Angular,在后端使用Node.js,并使用MySQL作为 database。在使用多种技术开发此应用程序时,我们遇到了许多问题。
- 第一个问题是操作系统的兼容性。由于我在使用多种技术,我必须确保所有技术与我使用的操作系统兼容。有时Angular的版本与我所使用的操作系统版本不兼容,因此我不得不多次更改操作系统版本。
- 由于我所构建的应用程序的架构随时间改变,我遇到了软件和库的版本和依赖关系的升级问题。在确定我使用的所有技术的稳定版本之前,我遇到了许多兼容性问题。即使升级应用程序中使用的单个工具也是一项冒险行为。
- 后来,我有更多的开发人员在我的应用程序上工作。由于技术栈很重,他们需要运行多个命令几个小时来设置与应用程序兼容的环境。我不得不检查和评估每个开发人员的环境,以确保与我使用的技术版本没有不匹配的情况。
- 最后,如果有任何开发人员不熟悉我用来构建应用程序的操作系统,那么他/她将很难在应用程序上工作。
所有这些都使得按时开发、构建和发布应用程序变得困难。这就是Docker的用武之地。它解决了我刚才提到的所有问题。
Docker是什么?
Docker是一个容器化平台,可以将应用程序及其依赖项打包到一个容器中,使应用程序能够在任何环境中无缝运行,无论是开发、测试还是生产环境。
它是一个旨在通过使用容器来更轻松地创建、部署和运行应用程序的工具。Docker容器是轻量级的 alternatives,并且它使用主机操作系统。与虚拟机不同,您无需在容器中预分配任何RAM。
它是一个面向开发人员、系统管理员和企业的开源平台,用于构建、发布和运行分布式应用程序。
要了解更多关于Docker内部工作原理的信息,请查看 Docker architecture。
Docker镜像、容器、Dockerfile
Docker镜像
Docker镜像是运行应用程序所需的模板。它包含应用程序代码、库、工具、依赖关系等。
Docker镜像是只读的不可变文件,有时也被称为快照。您不会直接启动或运行Docker镜像;您通过它构建一个容器。当从Docker镜像创建容器时,它在镜像层之上创建一个容器层。
必须有一个基础Docker镜像,用于通过对基础镜像进行一些修改来创建多个其他Docker镜像。
Docker Hub 是几乎所有技术栈的Docker镜像仓库。您可以从DockerHub上拉取Docker镜像并开始构建容器。
Docker容器
Docker容器是可执行的软件包,包含执行应用程序所需的所有依赖项。使用Docker容器,应用程序可以在不同的计算机环境中高效运行。
以下是Docker容器的特点:
- 轻量级
- 最小开销(CPU/IO/网络)
- 更快的部署
- 易于扩展
- 减少存储消耗
- 可移植,在任何地方运行
- 最小基础操作系统
- 应用程序隔离
Dockerfile
Dockerfile是一个定义需要执行的所有任务的shell脚本。通过docker文件,您可以创建一个docker镜像;通过docker镜像,您可以创建一个docker容器。
安装Docker
Docker可以轻松安装在各种Linux平台、Windows或macOS上。请查看这篇关于在Ubuntu、CentOS、Debian和Windows上的安装指南。
此外,Docker Desktop也可用于Windows和Mac机器。它是一个可执行的应用程序,非常容易安装,并有助于在Windows和Mac环境中构建和容器化应用程序。
Docker版本和定价
Docker有两个版本:
- 社区版(CE)
- 企业版(EE)
Docker社区版是开源的,可以免费使用。Docker CE旨在“自助”方法中,DevOps工程师们可以自行容器化他们的应用程序。
Docker企业版有三个版本-基本版、标准版和高级版。基本版提供了docker平台、支持和认证,而标准版和高级版则在基本版功能上增加了容器管理和docker安全扫描功能。
大多数技术人员免费使用Docker。但如果您需要高级功能,可以使用Docker的付费版本。定价根据功能如存储库管理、CI/CD功能、用户管理、开发者工具和支持选项等而定。
以下是Docker的计划详情:
现在您已经了解了Docker的基本知识,让我给您展示一个非常简单的Docker示例。
Docker Hello World容器
我将从DockerHub上拉取一个hello-world docker image并构建镜像以创建一个运行应用程序的Docker容器。此镜像包含一个简单的应用程序,用于从Docker打印一个Hello消息。
首先,我需要在我的Ubuntu机器上拉取hello-world的Docker镜像。
注意:这假设Docker已经安装。如果尚未安装,请查看installation guide。
yaoweibin@yaoweibin:~$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
检查是否已拉取docker镜像。
yaoweibin@yaoweibin:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 7 months ago 13.3kB
kubernetesui/dashboard v2.0.0-beta8 eb51a3597525 8 months ago 90.8MB
yaoweibin_mongodb latest 095d17727ca0 12 months ago 325MB
运行以下命令创建一个容器并执行应用程序。
yaoweibin@yaoweibin:〜$ docker run hello-world
您好,来自Docker的问候!
此消息表明您的安装似乎正常工作。
为了生成此消息,Docker执行了以下步骤:
1. Docker客户端与Docker守护程序取得联系。
2. Docker守护程序从Docker Hub拉取了“hello-world”镜像。
(amd64)
3. Docker守护程序从该镜像创建了一个新容器,该容器运行生成您当前正在阅读的输出的可执行文件。
4. Docker守护程序将该输出流式传输给Docker客户端,后者将其发送到您的终端。
要尝试更有野心的事情,您可以运行一个带有Ubuntu的容器:
$ docker run -it ubuntu bash
使用免费的Docker ID共享图像,自动化工作流程等:
https://hub.docker.com/
有关更多示例和想法,请访问:
https://docs.docker.com/get-started/
现在,列出所有的Docker容器。您可以看到hello-world容器在1分钟前运行。
yaoweibin@yaoweibin:〜$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a1056caffc4 hello-world “/hello” 1分钟前 已退出 (0) 1分钟前 zealous_bose
b0095c1e5536 yaoweibin_mongodb “/bin/sh -c usr/bin/…” 12个月前 已退出 (0) 12个月前 mongo_container
开始探索Docker;尝试这些基本的链接_11。
在Docker容器中运行Nginx
在这里,我将向您展示如何在容器内部部署Nginx。
下面的命令在本地查找Nginx镜像。由于没有本地镜像可用,它从docker hub拉取Nginx docker镜像。然后使用Nginx docker镜像创建一个名为nginx_yaoweibin的容器,并在端口80上运行Nginx。
yaoweibin@yaoweibin: 〜$ docker run –name nginx_yaoweibin -p 80:80 -d nginx
无法找到图像“nginx:latest”的本地副本
正在从库存中拉取最新版
bf5952930446:拉取完成
ba755a256dfe:拉取完成
c57dd87d0b93:拉取完成
d7fbf29df889:拉取完成
1f1070938ccd:拉取完成
摘要:sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2
状态:已下载更新的图像nginx:latest
fdad18387b27b48b8f2e14f8641791cc4d5edf667cc664198b67579cd76a5162
当您列出系统上可用的Docker镜像时,您可以看到已拉取了Nginx Docker镜像。
yaoweibin@yaoweibin: 〜$ docker images
仓库 标签 图像ID 创建大小
nginx 最新版 08393e824c32 4天前 132MB
hello-world 最新版 bf756fb1ae65 7个月前 13.3kB
kubernetesui / dashboard v2.0.0-beta8 eb51a3597525 8个月前 90.8MB
yaoweibin_mongodb 最新版 095d17727ca0 12个月前 325MB
运行以下命令以列出所有正在运行的容器。您可以看到容器nginx_yaoweibin正在0.0.0.0:80上运行。
yaoweibin@yaoweibin: 〜$ docker ps -a
容器ID 图像 命令 创建状态 端口 名称
fdad18387b27 nginx “/ docker-entrypoint …” 58秒前 启动32秒 0.0.0.0:80->80/tcp nginx_yaoweibin
1a1056caffc4 hello-world “/hello”一个小时前退出(0)一个小时前 zealous_bose
b0095c1e5536 yaoweibin_mongodb “/bin/sh -c usr/bin/…” 12个月前退出(0)12个月前 mongo_container
打开浏览器并输入0.0.0.0:80,你可以看到nginx在容器中正常运行。
常见的Docker用例
配置简化:Docker可以在任何平台上运行,借助其配置而无需实际的虚拟机开销。
它允许你将配置文件放入代码中,并传递环境变量以适应不同的环境。因此,一个Docker镜像可以在不同的环境中使用。
代码管理:代码在从开发到生产的过程中经过不同的环境。
每个环境都与其他环境有细微的差别。Docker通过提供一致的环境消除了这种差别,使开发和编码变得更加舒适。
Docker镜像是不可变的,从开发到生产的应用环境没有任何变化的优势。
提高开发生产力:在开发生态系统中,两个重要目标是使开发环境尽可能接近生产环境,并尽快交付高质量的代码。
Docker允许代码在反映生产环境的容器中运行,与虚拟机不同,Docker在内存容量方面的开销较小,这有助于运行多个服务。
通过使用Docker的共享卷,可以使应用代码从主机可用于容器。这使得开发人员可以从自己的平台和编辑器中编辑源代码,这将反映在Docker内部运行的环境中。
应用隔离:有时可能需要应用程序隔离,例如需要不同apache和不同依赖项的服务器。
在不同的容器中运行API服务器是一个更好的选择。
调试能力:Docker提供了许多与容器配合使用的工具,可以在容器内部和不同的容器之间插入检查点,这在测试应用程序时非常重要。
快速部署:Docker容器可以很快创建,因为容器不是启动操作系统,而是直接运行应用程序。
一旦设置完成,它们能够给你带来安心,一旦代码运行成功,它将在所有环境中正常工作。
结论
凭借其丰富的优势,Docker正在成为IT基础设施中有价值的补充。希望上述内容能给您一个关于它的想法。如果您对在线课程感兴趣,我建议您参加Docker Mastery online course。