Docker 创建称为容器的打包应用程序。每个容器都提供一个类似于虚拟机(VM)的隔离环境。与 VM 不同,Docker 容器不运行完整的操作系统。它们共享您主机的内核并在软件级别进行虚拟化。
Docker 基础
Docker 已成为软件开发人员和系统管理员的标准工具。这是一种在不影响系统其余部分的情况下快速启动应用程序的巧妙方法。您可以使用单个docker run
命令启动新服务。
容器封装了运行应用程序所需的一切,从操作系统包依赖项到您自己的源代码。您将容器的创建步骤定义为Dockerfile
. Docker 使用 Dockerfile 来构建镜像。
镜像定义了容器中可用的软件。这大致相当于使用操作系统 ISO 启动 VM。如果你创建了一个镜像,任何 Docker 用户都可以使用docker run
.
Docker 是如何工作的?
容器利用操作系统内核特性来提供部分虚拟化的环境。可以使用诸如chroot
. 这将使用指定的根目录而不是系统根目录启动进程。但是直接使用内核特性是繁琐、不安全且容易出错的。
Docker 是容器的生产、分发和使用的完整解决方案。现代 Docker 版本由几个独立的组件组成。首先,有 Docker CLI,这是您在终端中与之交互的内容。CLI 将命令发送到Docker 守护程序。这可以在本地或远程主机上运行。守护进程负责管理容器及其创建的镜像。
最后一个组件称为容器运行时。运行时调用内核功能来实际启动容器。Docker 与符合OCI 规范的运行时兼容。 这个开放标准允许不同容器化工具之间的互操作性。
刚开始使用时,您无需过多担心 Docker 的内部工作原理。docker
在您的系统上安装将为您提供构建和运行容器所需的一切。
为什么这么多人使用Docker?
容器之所以如此受欢迎,是因为它们解决了软件开发中的许多常见挑战。一次容器化并随处运行的能力减少了开发环境和生产服务器之间的差距。
使用容器让您确信每个环境都是相同的。如果您有新的团队成员,他们只需要docker run
设置自己的开发实例。启动服务时,您可以使用 Docker 映像部署到生产环境。在真实的环境将当地的情况完全一致,避免了“它的工作原理在我的机器”的情况。
Docker 比成熟的虚拟机更方便。VM 是通用工具,旨在支持所有可能的工作负载。相比之下,容器是轻量级的、自给自足的,更适合一次性用例。由于 Docker 共享主机的内核,因此容器对系统性能的影响可以忽略不计。容器启动时间几乎是瞬时的,因为您只是启动进程,而不是整个操作系统。
入门
Docker 可用于所有流行的 Linux 发行版。它还可以在 Windows 和 macOS 上运行。按照适用于您的平台的 Docker 设置说明启动并运行它。
您可以通过启动一个简单的容器来检查您的安装是否正常工作:
码头工人运行你好世界
这将使用基本hello-world
图像启动一个新容器。该图像发出一些解释如何使用 Docker 的输出。然后容器退出,将您送回终端。
创建图像
运行后hello-world
,您就可以创建自己的 Docker 映像了。Dockerfile 描述了如何通过安装所需的软件和复制文件来运行您的服务。这是一个使用 Apache Web 服务器的简单示例:
来自 httpd:最新
运行回声“LoadModule headers_module modules/mod_headers.so”>> /usr/local/apache2/conf/httpd.conf
复制 .htaccess /var/www/html/.htaccess
复制 index.html /var/www/html/index.html
复制 css/ /var/www/html/css
该FROM
行定义了基本图像。在这种情况下,我们从官方 Apache 映像开始。Docker 将 Dockerfile 中的其余指令应用到基础镜像之上。
该RUN
阶段在容器内运行命令。这可以是容器环境中可用的任何命令。我们正在启用headers
Apache 模块,.htaccess
文件可以使用它来设置路由规则。
最后几行将工作目录中的 HTML 和 CSS 文件复制到容器映像中。您的图像现在包含运行网站所需的一切。
现在,您可以构建图像:
docker build -t my-website:v1 。
Docker 将使用您的 Dockerfile 来构建镜像。当 Docker 运行您的每条指令时,您将在终端中看到输出。
该-t
命令中标记您的图像与给定的名称(my-website:v1
)。这使得将来更容易参考。标签有两个组成部分,用冒号隔开。第一部分设置图像名称,而第二部分通常表示其版本。如果省略了冒号,多克尔将默认使用latest
的标签版本。
将.
在命令的末尾告诉泊坞窗使用Dockerfile在本地工作目录。这也设置了构建上下文,允许您使用工作目录中的文件和文件夹以及COPY
Dockerfile 中的说明。
创建映像后,您可以使用docker run
以下命令启动容器:
docker run -d -p 8080:80 我的网站:v1
我们在这里使用了一些额外的标志docker run
。该-d
标志使 Docker CLI 与容器分离,允许它在后台运行。端口映射是用 定义的-p
,因此主机上的端口 8080 映射到容器中的端口 80。如果您localhost:8080
在浏览器中访问,您应该会看到您的网页。
Docker 镜像由层组成。Dockerfile 中的每条指令都会创建一个新层。您可以使用高级构建功能来引用多个基础图像,丢弃早期图像中的中间层。
图像注册表
拥有映像后,您可以将其推送到注册表。注册表提供集中存储,以便您可以与他人共享容器。默认注册表是Docker Hub。
当您运行引用图像的命令时,Docker 首先检查它是否在本地可用。如果不是,它会尝试从 Docker Hub 中拉取它。您可以使用以下docker pull
命令手动拉取镜像:
码头工人拉httpd:最新
如果要发布映像,请创建一个Docker Hub帐户。运行docker login
并输入您的用户名和密码。
接下来,使用您的 Docker Hub 用户名标记您的图像:
码头工人标签我的形象:最新 码头工人集线器用户名/我的形象:最新
现在,您可以推送您的图像:
docker push docker-hub-username/my-image:latest
其他用户将能够拉取您的映像并使用它启动容器。
如果您需要私有图像存储,您可以运行您自己的注册表。一些第三方服务还 提供 Docker 注册表作为 Docker Hub 的替代方案。
管理您的容器
Docker CLI 有几个命令可以让您管理正在运行的容器。以下是一些最有用的知识:
列出容器
docker ps
向您展示所有正在运行的容器。添加-a
标志也会显示停止的容器。
停止和启动容器
要停止容器,请运行docker stop my-container
. 替换my-container
为容器的名称或 ID。您可以从ps
命令中获取此信息。停止的容器用 重新启动docker start my-container
。
只要它们的主进程保持活动状态,容器通常就会运行。重启策略控制容器停止或主机重启时发生的情况。传递--restart always
到docker run
使容器在停止后立即重新启动。
获取壳
您可以在运行一个命令使用的容器docker exec my-container my-command
。当您想要手动调用独立于容器主进程的可执行文件时,这很有用。
-it
如果您需要交互式访问,请添加该标志。这让您可以通过运行进入 shell docker exec -it my-container sh
。
监控日志
Docker 自动收集发送到容器标准输入和输出流的输出。该docker logs my-container
命令将在终端内显示容器的日志。该--follow
标志设置连续流,以便您可以实时查看日志。
清理资源
旧的容器和图像会很快堆积在您的系统上。用于docker rm my-container
按 ID 或名称删除容器。
图像的命令是docker rmi my-image:latest
. 传递图像的 ID 或完整的标签名称。如果您指定了标签,则在没有分配更多标签之前,不会删除图像。否则,给定的标签将被删除,但图像的其他标签将保持可用。
可以使用docker prune
命令进行批量清理。这为您提供了一种简单的方法来删除所有停止的容器和冗余图像。
图形化管理
如果终端不是你的东西,你可以使用第三方工具 为 Docker 设置图形界面。Web 仪表板可让您快速监控和管理您的安装。它们还可以帮助您远程控制容器。
持久数据存储
默认情况下,Docker 容器是短暂的。容器停止后,对容器文件系统所做的更改不会持续存在。在以基本命令启动的容器中运行任何形式的文件存储系统都是不安全的docker run
。
有几种不同的方法来管理持久数据。最常见的是使用 Docker Volume。卷是挂载到容器文件系统中的存储单元。卷中的任何数据在其链接的容器停止后都将保持不变,让您将来可以连接另一个容器。
维护安全
Docker 化的工作负载比它们的裸机工作负载更安全,因为 Docker 在操作系统和您的服务之间提供了一些分离。尽管如此,Docker 是一个潜在的安全问题,因为它通常运行root
并可能被利用来运行恶意软件。
如果您仅将 Docker 作为开发工具运行,则默认安装通常可以安全使用。生产服务器和带有网络暴露守护进程套接字的机器应该在上线之前进行加固。
审核您的 Docker 安装以识别潜在的安全问题。有可用的自动化工具可以帮助您找到弱点并提出解决方案。您还可以扫描单个容器映像以查找可能从内部被利用的问题。
使用多个容器
该docker
命令一次仅适用于一个容器。您通常希望聚合使用容器。Docker Compose是一种工具,可让您在 YAML 文件中以声明方式定义容器。您可以使用单个命令启动它们。
当您的项目依赖于其他服务(例如依赖于数据库服务器的 Web 后端)时,这会很有帮助。您可以在自己的容器中定义这两个容器,docker-compose.yml
并从自动联网的简化管理中受益。
这是一个简单的docker-compose.yml
文件:
版本:“3”
服务:
应用程序:
图像:应用服务器:最新
端口:
- 8000:80
数据库:
图像:数据库服务器:最新
卷:
- 数据库数据:/数据
卷:
数据库数据:
这定义了两个容器(app
和database
)。为数据库创建了一个卷。这被安装到/data
容器中。应用服务器的端口 80 在主机上公开为 8000。运行docker-compose up -d
以启动这两项服务,包括网络和卷。
使用 Docker Compose,您可以编写可与他人共享的可重用容器定义。您可以将 a 提交docker-compose.yml
到您的版本控制中,而不是让开发人员记住docker run
命令。
还有其他方法可以运行多个容器。Docker App 是一种新兴的解决方案,它提供了另一个抽象级别。在生态系统的其他地方,Podman 是 Docker 的替代品,可让您在终端内创建容器的“pod”。
容器编排
Docker 通常不会在生产中按原样运行。现在更常见的是使用编排平台,例如Kubernetes或 Docker Swarm 模式。这些工具旨在处理多个容器副本,从而提高可扩展性和可靠性。
Docker 只是更广泛的容器化运动中的一个组成部分。Orchestrator使用相同的容器运行时技术来提供更适合生产的环境。使用多个容器实例允许滚动更新以及跨机器分发,使您的部署更能适应变化和中断。常规docker
CLI 以一台主机为目标,并与单个容器一起使用。
一个强大的容器平台
Docker 为您提供了使用容器所需的一切。它已成为软件开发和系统管理的关键工具。主要好处是提高了单个服务的隔离性和可移植性。
熟悉 Docker 需要了解基本的容器和镜像概念。您可以应用这些来创建将工作负载容器化的专用映像和环境。