介绍
Docker是一个很好的工具,用于在软件容器中自动部署Linux应用程序,但要充分利用其潜力,应用程序的每个组件都应该在自己的单独容器中运行。 对于具有大量组件的复杂应用程序,编排所有容器以启动,通信和关闭可能很快变得难以处理。
Docker社区提出了一个名为Fig的流行解决方案,它允许您使用单个YAML文件来编排所有Docker容器和配置。 这变得如此受欢迎,以至于Docker团队决定基于Fig源制作Docker Compose ,现在已弃用。 Docker Compose使用户可以更轻松地编排Docker容器的进程,包括启动,关闭和设置容器内链接和卷。
在本教程中,我们将向您展示如何安装最新版本的Docker Compose以帮助您管理多容器应用程序。
先决条件
要阅读本文,您需要一台具有以下内容的Ubuntu 18.04服务器:
- 具有sudo权限的非root用户 ( 使用Ubuntu 18.04的初始服务器设置说明了如何设置它。)
- Docker安装了Ubuntu 18.04上如何安装和使用Docker的 第1步和第2步的说明
一旦这些到位,您就可以随时跟进了。
注意:尽管前提条件提供了在Ubuntu 18.04上安装Docker的说明,但只要安装了Docker,本文中的docker
命令就可以在其他操作系统上运行。
第1步 - 安装Docker Compose
虽然我们可以从官方的Ubuntu存储库安装Docker Compose,但它是最新版本背后的几个次要版本,所以我们将从Docker的GitHub存储库安装Docker Compose。 以下命令与您在“ 版本”页面上找到的命令略有不同。 通过使用-o
标志首先指定输出文件而不是重定向输出,此语法可避免遇到使用sudo
时导致的权限被拒绝错误。
我们将检查当前版本 ,如有必要,请在以下命令中进行更新:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/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.21.2, build a133471
现在我们已经安装了Docker Compose,我们已准备好运行“Hello World”示例。
第2步 - 使用Docker Compose运行容器
公共Docker注册表Docker Hub包含一个用于演示和测试的Hello World图像。 它说明了使用Docker Compose运行容器所需的最小配置:调用单个映像的YAML文件:
首先,我们将为YAML文件创建一个目录并移入其中:
mkdir hello-world
cd hello-world
然后,我们将创建YAML文件:
nano docker-compose.yml
将以下内容放入文件,保存文件,然后退出文本编辑器:
my-test:
image: hello-world
YAML文件中的第一行用作容器名称的一部分。 第二行指定用于创建容器的图像。 当我们运行命令docker-compose up
,它将按我们指定的名称hello-world
查找本地图像。 有了这个,我们将保存并退出该文件。
我们可以使用docker images
命令手动查看系统上的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)...
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-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 up1. 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
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 drunk_payne
这将显示我们完成后删除容器所需的信息。
第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配置持续集成测试环境 (注意:本文适用于Ubuntu 16.04而不是18.04)