如何在 Ubuntu 18.04 上安装 Docker Compose
作者Tony Tran, Melissa Anderson
Docker 是一个很好的工具,可以在软件容器中自动部署 Linux 应用程序,但要充分利用它的潜力,应用程序的每个组件都应该在自己的独立容器中运行。对于有很多组件的复杂应用来说,协调所有的容器一起启动、通信和关闭并不容易,很快就会难以为继。 对此,Docker 社区曾提出一个很受欢迎的解决方案,叫做 Fig,它允许你使用一个 YAML 文件来协调所有的 Docker 容器和配置。这个方案变得很流行,以至于 Docker 团队决定在 Fig 源码的基础上制作 Docker Compose,目前 Fig 已经废弃了。 Docker Compose 使用户更容易协调 Docker 容器的进程,包括启动、关闭和设置容器内的链接和卷。在本教程中,你将安装最新版本的 Docker Compose 来管理多容器应用。
前期准备
要学习这篇文章,你需要一台具备以下条件的 Ubuntu 18.04 服务器。
- 一个具有 sudo 权限的非 root 用户。
- 按照 Ubuntu 18.04 安装好的 Docker。
注意:本教程将指导你安装Docker Compose v1,它使用
docker-compose
命令。从Docker Compose v2开始,Docker已经转向使用compose
CLI 插件命令,而不再使用原来的docker-compose
。虽然安装方式不同,但一般来说,实际的用法是将docker-compose
调用中的连字符去掉,变成docker compose
。关于完整的兼容性细节,请查看Docker官方文档中关于新的compose
和旧的docker-compose
的命令兼容性的 内容。
第1步 - 安装 Docker Compose
尽管你可以从 Ubuntu 的官方仓库中安装 Docker Compose,但它比最新版本落后了几个小版本,所以你要从 Docker 的 GitHub 仓库中安装 Docker Compose。下面的命令与你在“发布”页面找到的命令略有不同。首先通过使用 -o
标记指定输出文件,而不是重定向输出,这种语法可以避免遇到使用 sudo
时引起的权限被拒绝错误。
检查当前的版本,如果有必要,在下面的命令中更新它。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
接下来设置权限。
$ sudo chmod +x /usr/local/bin/docker-compose
然后你将通过检查版本来验证安装是否成功:
$ docker-compose --version
它将打印出你安装的版本。
Output
docker-compose version 1.29.2, build 5becea4c
安装好 Docker Compose,你已经准备好运行一个“Hello World”的示例了。
第2步 - 使用 Docker Compose 运行一个容器
公共 Docker 注册中心,即Docker Hub,包括一个用于演示和测试的 Hello World 镜像。它说明了使用 Docker Compose 运行一个容器所需的最小配置:一个调用单个镜像的 YAML 文件: 首先,你要为 YAML 文件创建一个目录,并 cd 到其中:
$ mkdir hello-world
$ cd hello-world
然后,你将创建 YAML 文件:
$ nano docker-compose.yml
将以下内容放入文件,保存文件,并退出文本编辑器: docker-compose.yml
my-test:
image: hello-world
YAML 文件中的第一行作为容器名称的一部分。第二行指定使用哪个镜像来创建容器。当你运行 docker-compose
命令时,它将按照你指定的名字 hello-world
寻找一个本地镜像。有了这个,你就可以保存并退出该文件。
你可以用 docker images
命令手动查看你系统上的镜像。
$ docker images
当完全没有本地镜像时,只会显示列标题:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
现在你仍然在 ~/hello-world
目录下,你将执行以下命令:
$ docker-compose up
第一次运行该命令时,如果本地没有名为 hello-world
的镜像,Docker Compose 将从 Docker Hub 公共仓库中提取它:
Output
Pulling my-test (hello-world:latest)...
latest: Pulling from library/hello-world
c04b14da8d14: Downloading [==================================================>] c04b14da8d14: Extracting [==================================================>] c04b14da8d14: Extracting [==================================================>] c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
. . .
注意:如果你遇到关于 Docker 套接字的权限错误,这意味着你在设置 Docker 时跳过了将你的用户名加入 docker 组这一步。回过头来完成该步骤,就可以在没有 sudo
的情况下运行 docker 命令。
拉出镜像后,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 of docker-compose up
. . .
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
. . .
Docker 容器只有在命令处于活跃状态时才会运行,所以一旦 hello
运行完毕,容器就停止了。因此,当你查看活动进程时,会出现列标题,但 hello-world
容器不会被列出,因为它没有在运行。
$ docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
你可以通过使用 -a
标记来查看容器信息,这是你在下一步所需要的,它会显示所有的容器,而不仅仅是活跃的容器。
$ docker ps -a
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06069fd5ca23 hello-world "/hello" 35 minutes ago Exited (0) 35 minutes ago drunk_payne
它显示了你在使用完容器后需要移除的容器信息。
第3步 - 移除镜像(可选)
为了避免使用不必要的磁盘空间,你将需要删除本地镜像。要做到这一点,你需要使用 docker rm
命令删除所有引用该镜像的容器,后面加上容器 ID 或名称。下面,你使用的是你刚刚运行的 docker ps -a
命令中的容器 ID 。请确保用你的容器的ID代替:
$ docker rm 06069fd5ca23
一旦所有引用该镜像的容器都被移除,你就可以移除该镜像了。
$ docker rmi hello-world
结语
现在你已经安装了 Docker Compose,通过运行 Hello World 的例子测试了你的安装,并删除了测试镜像和容器。 虽然 Hello World 的例子验证了你的安装,不过注意,这个简单的配置并没有显示出 Docker Compose 的一个主要好处——能够同时启动和关闭一组 Docker 容器。