介绍
Docker 是一个很棒的工具,但要真正充分利用它的潜力,最好是应用程序的每个组件都在自己的容器中运行。 对于具有大量组件的复杂应用程序,编排所有容器以一起启动和关闭(更不用说相互交谈)很快就会变得笨拙。
Docker 社区提出了一个名为 Fig 的流行解决方案,它允许您使用单个 YAML 文件来编排所有 Docker 容器和配置。 这变得如此流行,以至于 Docker 团队最终决定基于 Fig 源制作自己的版本。 他们称之为 Docker Compose。 简而言之,它使处理 Docker 容器的编排过程(例如启动、关闭和设置容器内链接和卷)变得非常容易。
在本文结束时,您将安装 Docker 和 Docker Compose,并基本了解 Docker Compose 的工作原理。
Docker 和 Docker Compose 概念
使用 Docker Compose 需要将一堆不同的 Docker 概念组合在一起,所以在开始之前,让我们花一点时间来回顾一下所涉及的各种概念。 如果您已经熟悉卷、链接和端口转发等 Docker 概念,那么您可能希望继续并跳到下一部分。
泊坞窗图像
每个 Docker 容器都是 Docker 映像的本地实例。 您可以将 Docker 映像视为完整的 Linux 安装。 通常,最小安装仅包含运行映像所需的最少软件包。 这些映像使用主机系统的内核,但由于它们在 Docker 容器内运行并且只能看到自己的文件系统,因此完全可以在 Ubuntu 主机上运行像 CentOS 这样的发行版(反之亦然)。
大多数 Docker 镜像是通过由 Docker 团队维护的 Docker Hub 分发的。 大多数流行的开源项目都有一个相应的镜像上传到 Docker Registry,您可以使用它来部署软件。 如果可能,最好获取“官方”镜像,因为 Docker 团队保证它们遵循 Docker 最佳实践。
Docker 镜像之间的通信
Docker 容器默认与主机隔离,这意味着默认情况下主机无法访问 Docker 容器内的文件系统,也无法通过网络与其进行通信。 不用说,默认情况下,这使得配置和使用在 Docker 容器中运行的映像变得困难。
Docker 有三种主要的方法来解决这个问题。 第一个也是最常见的方法是让 Docker 指定将在 Docker 容器中设置的环境变量。 然后,在 Docker 容器中运行的代码将在启动时检查这些环境变量的值,并使用它们来正确配置自己。
另一种常用的方法是Docker数据卷。 Docker 卷有两种形式——内部卷和共享卷。
指定内部卷只是意味着对于您为特定 Docker 容器指定的文件夹,数据将在容器被删除时保留。 例如,如果你想确保你的日志文件挂在你周围,你可以指定一个内部 /var/log
卷。
共享卷将 Docker 容器内的文件夹映射到主机上的文件夹。 这使您可以轻松地在 Docker 容器和主机之间共享文件,我们将在 Docker 数据卷文章 中进行探讨。
与 Docker 容器通信的第三种方式是通过网络。 Docker 允许不同 Docker 容器之间通过 links
进行通信,以及端口转发,允许您将 Docker 容器内部的端口转发到主机服务器上的端口。 例如,您可以创建一个链接以允许您的 WordPress 和 MariaDB Docker 容器相互通信并通过端口转发将 WordPress 暴露给外部世界,以便用户可以连接到它。
先决条件
要阅读本文,您将需要以下内容:
- Ubuntu 14.04 液滴
- 具有 sudo 权限的非 root 用户(Initial Server Setup with Ubuntu 14.04 解释了如何设置。)
第 1 步 — 安装 Docker
首先,如果你还没有安装 Docker。 安装 Docker 的最快方法是下载并安装其安装脚本(系统会提示您输入 sudo 密码)。
wget -qO- https://get.docker.com/ | sh
上面的命令下载并执行了一个由 Docker 团队编写的小型安装脚本。 如果您不信任第三方脚本或想了解有关脚本执行的更多详细信息,请查看 DigitalOcean Docker 教程 或 Docker 自己的 安装文档 中的说明。
如果您的用户配置不正确,使用 Docker 会很痛苦,因此请使用以下命令将您的用户添加到 docker
组。
sudo usermod -aG docker $(whoami)
注销并从您的服务器登录以激活您的新组。
注意:要了解更多关于如何使用Docker,请阅读如何安装和使用Docker:入门中的如何使用Docker部分。
第 2 步 — 安装 Docker Compose
现在您已经安装了 Docker,让我们继续安装 Docker Compose。 首先,安装 python-pip
作为先决条件:
sudo apt-get -y install python-pip
然后你可以安装 Docker Compose:
sudo pip install docker-compose
第 3 步 — 使用 Docker Compose 运行容器
公共 Docker 注册表 Docker Hub 包含一个简单的 Hello World 映像。 现在我们已经安装了 Docker Compose,让我们用这个非常简单的例子来测试它。
首先,为我们的 YAML 文件创建一个目录:
mkdir hello-world
然后切换到目录:
cd hello-world
现在使用您喜欢的文本编辑器创建 YAML 文件(我们将使用 nano):
nano docker-compose.yml
将以下内容放入文件中,保存文件,然后退出文本编辑器:
码头工人-compose.yml
my-test: image: hello-world
第一行将用作容器名称的一部分。 第二行指定使用哪个图像来创建容器。 该图像将从官方 Docker Hub 存储库下载。
在 ~/hello-world
目录下,执行以下命令创建容器:
docker-compose up
输出应以以下内容开头:
Output of docker-compose upCreating helloworld_my-test_1... Attaching to helloworld_my-test_1 my-test_1 | my-test_1 | Hello from Docker. my-test_1 | This message shows that your installation appears to be working correctly. my-test_1 |
然后输出解释了 Docker 正在做什么:
- Docker 客户端联系了 Docker 守护进程。
- Docker 守护进程从 Docker Hub 中提取了“hello-world”镜像。
- Docker 守护程序从该映像创建了一个新容器,该容器运行生成您当前正在读取的输出的可执行文件。
- Docker 守护程序将该输出流式传输到 Docker 客户端,后者将其发送到您的终端。
如果进程没有自行退出,请按 CTRL-C
。
这个简单的测试没有显示 Docker Compose 的主要优点之一——能够同时启动和关闭一组 Docker 容器。 How To Install Wordpress and PhpMyAdmin with Docker Compose on Ubuntu 14.04 文章展示了如何使用 Docker Compose 将三个容器作为一个应用程序组运行。
第 4 步 — 学习 Docker Compose 命令
让我们回顾一下 docker-compose
工具支持的命令。
docker-compose
命令在每个目录的基础上工作。 您可以在一台机器上运行多组 Docker 容器——只需为每个容器创建一个目录,并在其目录中为每个容器创建一个 docker-compose.yml
文件。
到目前为止,我们一直在自己运行 docker-compose up
并使用 CTRL-C
将其关闭。 这允许在终端窗口中显示调试消息。 但是,这并不理想,当在生产环境中运行时,您会希望 docker-compose
更像是一种服务。 一种简单的方法是在 up
会话时添加 -d
选项:
docker-compose up -d
docker-compose
现在将分叉到后台。
要显示您的 Docker 容器组(已停止和当前正在运行),请使用以下命令:
docker-compose ps
例如,以下显示 helloworld_my-test_1
容器已停止:
Output of `docker-compose ps` Name Command State Ports ----------------------------------------------- helloworld_my-test_1 /hello Exit 0
正在运行的容器将显示 Up
状态:
Output of `docker-compose ps` Name Command State Ports --------------------------------------------------------------- nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp
要停止应用程序组的所有正在运行的 Docker 容器,请在与用于启动 Docker 组的 docker-compose.yml
文件相同的目录中发出以下命令:
docker-compose stop
笔记: docker-compose kill
is also available if you need to shut things down more forcefully.
在某些情况下,Docker 容器会将其旧信息存储在内部卷中。 如果您想从头开始,可以使用 rm
命令完全删除构成容器组的所有容器:
docker-compose rm
如果您从包含 Docker 容器和 .yml
文件的目录以外的目录尝试这些命令中的任何一个,它会抱怨并且不会显示您的容器:
Output from wrong directory Can't find a suitable configuration file in this directory or any parent. Are you in the right directory? Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml
第 5 步 — 访问 Docker 容器文件系统(可选)
如果需要在容器内的命令提示符下工作,可以使用 docker exec
命令。
Hello World! 示例在运行后退出,因此我们需要启动一个将继续运行的容器,然后我们可以使用 docker exec
访问容器的文件系统。 让我们看一下来自 Docker Hub 的 Nginx 镜像。
为它创建一个新目录并更改为它:
mkdir ~/nginx && cd $_
在我们的新目录中创建一个 docker-compose.yml
文件:
nano docker-compose.yml
并粘贴以下内容:
~/nginx/docker-compose.yml
nginx: image: nginx
保存文件并退出。 我们只需要使用以下命令将 Nginx 容器作为后台进程启动:
docker-compose up -d
Nginx 镜像将被下载,然后容器将在后台启动。
现在我们需要容器的 CONTAINER ID
。 正在运行的所有容器的列表:
docker ps
您将看到类似于以下内容的内容:
Output of `docker ps`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
注意: 只有 running 容器使用 docker ps
命令列出。
如果我们想更改此容器内的文件系统,我们将获取其 ID(在本例中为 e90e12f70418
)并使用 docker exec
在容器内启动一个 shell:
docker exec -it e90e12f70418 /bin/bash
-t
选项打开一个终端,-i
选项使其交互。 /bin/bash
选项为正在运行的容器打开一个 bash shell。 请务必使用容器的 ID。
您将看到容器的 bash 提示,类似于:
root@e90e12f70418:/#
从这里,您可以在命令提示符下工作。 但是请记住,除非您位于作为数据卷的一部分保存的目录中,否则您的更改将在容器重新启动后立即消失。 另一个需要注意的是,大多数 Docker 镜像都是用非常少的 Linux 安装创建的,所以你习惯的一些命令行实用程序和工具可能不存在。
结论
太好了,这涵盖了 Docker Compose 的基本概念以及如何安装和运行它。 查看 在 Ubuntu 14.04 上使用 Docker Compose 部署 Wordpress 和 PHPMyAdmin 教程,了解如何使用 Docker Compose 部署应用程序的更复杂示例。
有关 docker-compose.yml
文件的配置选项的完整列表,请参阅 Compose 文件参考 。