如何在CentOS7上安装和使用DockerCompose

来自菜鸟教程
跳转至:导航、​搜索

介绍

Docker 是在软件容器中自动部署 Linux 应用程序的好工具,但要真正充分利用其潜力,最好是应用程序的每个组件都在自己的容器中运行。 对于具有大量组件的复杂应用程序,编排所有容器以一起启动和关闭(更不用说相互交谈)很快就会变得笨拙。

Docker 社区提出了一个名为 Fig 的流行解决方案,它允许您使用单个 YAML 文件来编排所有 Docker 容器和配置。 这变得如此流行,以至于 Docker 团队决定基于 Fig 源制作 Docker Compose,该源现已弃用。 Docker Compose 使用户可以更轻松地编排 Docker 容器的流程,包括启动、关闭以及设置容器内链接和卷。

在本教程中,您将安装最新版本的 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 容器之间通过 links 进行通信,以及端口转发,允许您将 Docker 容器内部的端口转发到主机服务器上的端口。 例如,您可以创建一个链接以允许您的 WordPress 和 MariaDB Docker 容器相互通信,并使用端口转发将 WordPress 暴露给外部世界,以便用户可以连接到它。

先决条件

要阅读本文,您将需要以下内容:

  • CentOS 7 服务器,使用具有 sudo 权限的非 root 用户设置(有关详细信息,请参阅 CentOS 7 上的初始服务器设置)
  • 使用 如何在 CentOS 7 上安装和使用 Docker 的步骤 1 和步骤 2 中的说明安装 Docker

一旦这些都到位,您将准备好跟进。

第 1 步 — 安装 Docker Compose

为了获得最新版本,请在 Docker 文档 的引导下,从 Docker 的 GitHub 存储库中的二进制文件安装 Docker Compose。

检查当前版本,如有必要,在以下命令中更新:

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.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.23.2, build 1110ad01

现在您已经安装了 Docker Compose,您可以运行“Hello World”示例了。

第 2 步 — 使用 Docker Compose 运行容器

公共 Docker 注册表 Docker Hub 包含一个简单的“Hello World”映像,用于演示和测试。 它说明了使用 Docker Compose 运行容器所需的最低配置:一个调用单个图像的 YAML 文件。

首先,为我们的 YAML 文件创建一个目录:

mkdir hello-world

然后切换到目录:

cd hello-world

现在使用您喜欢的文本编辑器创建 YAML 文件。 本教程将使用 Vi:

vi docker-compose.yml

进入插入模式,按i,然后将以下内容放入文件中:

码头工人-compose.yml

my-test:
  image: hello-world

第一行将是容器名称的一部分。 第二行指定使用哪个图像来创建容器。 当您运行命令 docker-compose up 时,它将查找指定名称的本地图像,hello-world

有了这个,点击 ESC 离开插入模式。 输入 :x 然后 ENTER 保存并退出文件。

要手动查看系统上的图像,请使用 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
1b930d010525: Pull complete
. . .

拉取镜像后,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. . .
my-test_1  | 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
50a99a0beebd        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                       hello-world_my-test_1

现在您已经测试了运行容器,您可以继续探索一些基本的 Docker Compose 命令。

第三步——学习 Docker Compose 命令

为了让您开始使用 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 -a

如果容器停止,State 将被列为 Exited,如下例所示:

Output        Name            Command   State    Ports
------------------------------------------------
hello-world_my-test_1   /hello    Exit 0        

正在运行的容器将显示 Up

Output     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 文件的目录以外的目录尝试这些命令中的任何一个,它将返回错误:

OutputERROR:
        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

本节介绍了如何使用 Docker Compose 操作容器的基础知识。 如果您需要更好地控制容器,您可以访问 Docker 容器的文件系统并在容器内的命令提示符下工作,该过程将在下一节中描述。

第 4 步 — 访问 Docker 容器文件系统

为了在容器内的命令提示符下工作并访问其文件系统,您可以使用 docker exec 命令。

“Hello World”示例在运行后退出,因此要测试 docker exec,请启动一个将继续运行的容器。 出于本教程的目的,请使用 Docker Hub 中的 Nginx 映像

创建一个名为 nginx 的新目录并移入其中:

mkdir ~/nginx
cd ~/nginx

接下来,在新目录中创建一个 docker-compose.yml 文件并在文本编辑器中打开它:

vi docker-compose.yml

接下来,将以下行添加到文件中:

~/nginx/docker-compose.yml

nginx:
  image: nginx

保存文件并退出。 使用以下命令将 Nginx 容器作为后台进程启动:

docker-compose up -d

Docker Compose 将下载 Nginx 映像,容器将在后台启动。

现在您将需要容器的 CONTAINER ID。 使用以下命令列出所有正在运行的容器:

docker ps

您将看到类似于以下内容的内容:

Output of `docker ps`CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b86b6699714c        nginx               "nginx -g 'daemon of…"   20 seconds ago      Up 19 seconds       80/tcp              nginx_nginx_1

如果您想更改此容器内的文件系统,您将获取其 ID(在此示例中为 b86b6699714c)并使用 docker exec 在容器内启动一个 shell:

docker exec -it b86b6699714c /bin/bash

-t 选项打开一个终端,-i 选项使其交互。 /bin/bash 为正在运行的容器打开一个 bash shell。

然后,您将看到容器的 bash 提示,类似于:

root@b86b6699714c:/#

从这里,您可以在容器内的命令提示符下工作。 但是请记住,除非您位于作为数据卷的一部分保存的目录中,否则您的更改将在容器重新启动后立即消失。 此外,请记住,大多数 Docker 映像都是通过非常少的 Linux 安装创建的,因此您习惯使用的一些命令行实用程序和工具可能不存在。

结论

您现在已经安装了 Docker Compose,通过运行“Hello World”示例测试了您的安装,并探索了一些基本命令。

虽然“Hello World”示例确认了您的安装,但简单的配置并未显示 Docker Compose 的主要优点之一——能够同时启动和关闭一组 Docker 容器。 要了解 Docker Compose 的强大功能,请查看 如何使用 Nginx、Let's Encrypt 和 Docker Compose 保护容器化 Node.js 应用程序如何使用 Docker 配置持续集成测试环境和 Ubuntu 16.04 上的 Docker Compose。 尽管这些教程是针对 Ubuntu 16.04 和 18.04 的,但这些步骤可以适用于 CentOS 7。