介绍
Docker 是在软件容器中自动部署 Linux 应用程序的出色工具,但要充分利用其潜力,应用程序的每个组件都应在其自己的容器中运行。 对于具有大量组件的复杂应用程序,编排所有容器以一起启动、通信和关闭可能很快变得笨拙。
Docker 社区提出了一个名为 Fig 的流行解决方案,它允许您使用单个 YAML 文件来编排所有 Docker 容器和配置。 这变得如此流行,以至于 Docker 团队决定基于 Fig 源制作 Docker Compose,该源现已弃用。 Docker Compose 使用户可以更轻松地编排 Docker 容器的流程,包括启动、关闭以及设置容器内链接和卷。
在本教程中,我们将向您展示如何安装最新版本的 Docker Compose,以帮助您管理 Debian 9 服务器上的多容器应用程序。
先决条件
要阅读本文,您将需要:
- 一个 Debian 9 服务器和一个具有 sudo 权限的非 root 用户。 这个 使用 Debian 9 的初始服务器设置教程 解释了如何设置它。
- 使用 How To Install and Use Docker on Debian 9 的 Step 1 和 Step 2 的说明安装 Docker
注意: 尽管先决条件给出了在 Debian 9 上安装 Docker 的说明,但只要安装了 Docker,本文中的 docker
命令应该可以在其他操作系统上运行。
第 1 步 — 安装 Docker Compose
虽然我们可以从官方 Debian 存储库安装 Docker Compose,但它比最新版本落后了几个小版本,所以我们将从 Docker 的 GitHub 存储库安装它。 下面的命令与您在 Releases 页面上找到的命令略有不同。 通过使用 -o
标志首先指定输出文件而不是重定向输出,此语法避免了在使用 sudo
时遇到权限被拒绝错误。
我们将检查 当前版本 并在必要时在以下命令中更新它:
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
接下来我们将设置权限:
sudo chmod +x /usr/local/bin/docker-compose
然后我们将通过检查版本来验证安装是否成功:
docker-compose --version
这将打印出我们安装的版本:
Outputdocker-compose version 1.22.0, build f46880fe
现在我们已经安装了 Docker Compose,我们准备运行一个“Hello World”示例。
第 2 步 — 使用 Docker Compose 运行容器
公共 Docker 注册表 Docker Hub 包含一个 Hello World 映像,用于演示和测试。 它说明了使用 Docker Compose 运行容器所需的最低配置:一个调用单个图像的 YAML 文件。 我们将创建这个最小配置来运行我们的 hello-world
容器。
首先,我们将为 YAML 文件创建一个目录并移入其中:
mkdir hello-world cd hello-world
然后,我们将创建 YAML 文件:
nano docker-compose.yml
将以下内容放入文件中,保存文件,然后退出文本编辑器:
码头工人-compose.yml
my-test: image: hello-world
YAML 文件中的第一行用作容器名称的一部分。 第二行指定使用哪个图像来创建容器。 当我们运行 docker-compose up
命令时,它会以我们指定的名称 hello-world
查找本地图像。 有了这个,我们将保存并退出文件。
我们可以使用 docker images
命令手动查看系统上的图像:
docker images
当根本没有本地图像时,仅显示列标题:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
现在,仍然在 ~/hello-world
目录中,我们将执行以下命令:
docker-compose up
第一次运行命令时,如果没有名为 hello-world
的本地镜像,Docker Compose 将从 Docker Hub 公共存储库中拉取它:
OutputPulling my-test (hello-world:)... latest: Pulling from library/hello-world 9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc Status: Downloaded newer image for hello-world:latest . . .
拉取镜像后,docker-compose
创建一个容器,附加并运行 hello 程序,这反过来又确认安装似乎正在运行:
Output. . . Creating 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 | . . .
然后它打印出它做了什么的解释:
Output To generate this message, Docker took the following steps: my-test_1 | 1. The Docker client contacted the Docker daemon. my-test_1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. my-test_1 | (amd64) my-test_1 | 3. The Docker daemon created a new container from that image which runs the my-test_1 | executable that produces the output you are currently reading. my-test_1 | 4. The Docker daemon streamed that output to the Docker client, which sent it my-test_1 | to your terminal.
Docker 容器仅在命令处于活动状态时才会运行,因此一旦 hello
完成运行,容器就会停止。 因此,当我们查看活动进程时,会出现列标题,但不会列出 hello-world
容器,因为它没有运行:
docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
我们可以通过使用 -a
标志查看下一步需要的容器信息。 这会显示所有容器,而不仅仅是活动容器:
docker ps -a
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 06069fd5ca23 hello-world "/hello" 35 minutes ago Exited (0) 35 minutes ago hello-world_my-test_1
这将显示我们在完成后删除容器所需的信息。
第 3 步 — 删除图像(可选)
为避免使用不必要的磁盘空间,我们将删除本地映像。 为此,我们需要使用 docker rm
命令删除所有引用图像的容器,然后是 CONTAINER ID
或 NAME
。 下面,我们使用刚刚运行的 docker ps -a
命令中的 CONTAINER ID
。 请务必替换容器的 ID:
docker rm 06069fd5ca23
删除所有引用该图像的容器后,我们可以删除该图像:
docker rmi hello-world
结论
我们现在已经安装了 Docker Compose,通过运行 Hello World 示例测试了我们的安装,并删除了测试镜像和容器。
虽然 Hello World 示例确认了我们的安装,但简单的配置并未显示 Docker Compose 的主要优点之一——能够同时启动和关闭一组 Docker 容器。 要了解 Docker Compose 的强大功能,您可能想查看这个实际示例,如何在 Ubuntu 16.04 上使用 Docker 和 Docker Compose 配置持续集成测试环境。