如何在 CentOS 7 上安装和使用 Docker Compose

介绍

Docker是自动部署软件容器内的Linux应用程序的绝佳工具,但要真正充分利用其潜力,最好是您的应用程序的每个组件在其自己的容器中运行。

Docker 社区提出了一个受欢迎的解决方案,名为 Fig,它允许您使用单个 YAML 文件来编排您的所有 Docker 容器和配置. 这变得如此受欢迎,以至于 Docker 团队决定基于 Fig 源创建 _Docker Compose,现在已经被剥夺了。

在本教程中,您将安装最新版本的Docker Compose,以帮助您管理多容器应用程序,并探索软件的基本命令。

Docker 和 Docker 构成概念

使用 Docker Compose 需要组合一堆不同的 Docker 概念,所以在我们开始之前,让我们花一分钟的时间来审查所涉及的各种概念。

Docker 图片

每个Docker容器都是Docker图像的本地实例,你可以将Docker图像视为一个完整的Linux安装。通常,一个最小的安装只包含运行图像所需的最少的包。这些图像使用主机系统的内核,但由于它们在Docker容器内运行,并且只能看到自己的文件系统,所以在Ubuntu主机上运行像CentOS这样的发行版(或者反之亦然)是完全可能的。

大多数 Docker 图像都通过 Docker Hub进行分发,该图像由 Docker 团队维护。 最受欢迎的开源项目都有相应的图像上传到 Docker 注册表中,您可以使用它来部署软件。

Docker 图像之间的通信

Docker 容器与主机隔离,这意味着默认情况下,主机没有访问 Docker 容器内部的文件系统,也没有通过网络与它进行通信的任何方式。

Docker 有三种主要方法来处理此问题. 第一种最常见的方法是要有 Docker 指定环境变量,这些变量将被设置在 Docker 容器内部。

另一种常用的方法是 Docker 数据量

指定内部卷仅意味着,对于您为特定 Docker 容器指定的文件夹,当容器被删除时,数据将继续存在,例如,如果您想确保您的日志文件仍然存在,则可以指定内部 /var/log 卷。

共享卷将 Docker 容器中的文件夹映射到主机上的文件夹中,这样您就可以在 Docker 容器和主机之间轻松共享文件(https://andsky.com/tech/tutorials/how-to-share-data-between-docker-containers)。

Docker 允许不同 Docker 容器通过链接进行通信,以及端口转发,允许您将端口从 Docker 容器内部转发到主机服务器上的端口。

前提条件

为了遵循这篇文章,您将需要以下内容:

一旦这些在场,你将准备跟随。

步骤 1 – 安装 Docker Compose

要获得最新版本,请使用 Docker docs并从Docker GitHub 存储库中安装Docker Compose。

查看 当前版本,如果需要,请在下面的命令中更新它:

1sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

接下来,设置权限以使二进制可执行:

1sudo chmod +x /usr/local/bin/docker-compose

然后,通过检查版本来验证安装是否成功:

1docker-compose --version

这将打印您安装的版本:

1[secondary_label Output]
2docker-compose version 1.23.2, build 1110ad01

现在你已经安装了 Docker Compose,你已经准备好运行一个Hello World示例。

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

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

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

1mkdir hello-world

然后更换到目录:

1cd hello-world

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

1vi docker-compose.yml

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

1[label docker-compose.yml]
2my-test:
3  image: hello-world

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

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

要手动查看系统上的图像,请使用docker 图像命令:

1docker images

当根本没有本地图像时,只显示列标题:

1[secondary_label Output]
2REPOSITORY TAG IMAGE ID CREATED SIZE

现在,当你还在~/hello-world目录中时,执行以下命令来创建容器:

1docker-compose up

第一次运行命令时,如果没有名为Hello-world的本地图像,Docker Compose 将从 Docker Hub 公共存储库中提取它:

1[secondary_label Output]
2Pulling my-test (hello-world:)...
3latest: Pulling from library/hello-world
41b930d010525: Pull complete
5. . .

拉下图像后,docker-compose 创建一个容器,附加并运行 Hello程序,这反过来确认安装似乎正在运作:

1[secondary_label Output]
2. . .
3Creating helloworld_my-test_1...
4Attaching to helloworld_my-test_1
5my-test_1 | 
6my-test_1 | Hello from Docker.
7my-test_1 | This message shows that your installation appears to be working correctly.
8my-test_1 | 
9. . .

然后它会打印一个解释它做了什么:

 1[secondary_label Output]
 2. . .
 3my-test_1  | To generate this message, Docker took the following steps:
 4my-test_1  |  1. The Docker client contacted the Docker daemon.
 5my-test_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 6my-test_1  |     (amd64)
 7my-test_1  |  3. The Docker daemon created a new container from that image which runs the
 8my-test_1  |     executable that produces the output you are currently reading.
 9my-test_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
10my-test_1  |     to your terminal.
11. . .

Docker 容器只在命令活跃时运行,所以一旦你好完成运行,容器就会停止运行,因此,当您查看活跃过程时,将出现列头,但不会列出你好容器,因为它没有运行:

1docker ps
1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

使用a标志来显示所有容器,而不仅仅是活跃的容器:

1docker ps -a
1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
350a99a0beebd hello-world         "/hello"            3 minutes ago Exited (0) 3 minutes ago hello-world_my-test_1

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

步骤 3 – 学习 Docker 构成命令

为了让您开始使用 Docker Compose,本节将讨论docker-compose工具支持的通用命令。

您可以在一台机器上运行多个 Docker 容器组 - 只需为每个容器创建一个目录,为每个目录创建一个 docker-compose.yml 文件。

到目前为止,您已经自行运行了docker-compose up,您可以使用CTRL-C来关闭容器,这允许在终端窗口中显示调试消息,但这并不理想;在生产中运行时,如果docker-compose更像服务,则更强大。

1docker-compose up -d

docker-compose现在将转向背景。

若要显示您的 Docker 容器组(既已停止,也正在运行),请使用以下命令:

1docker-compose ps -a

如果一个容器被阻止,则状态将列为退出,如下示例所示:

1[secondary_label Output]
2        Name Command State Ports
3------------------------------------------------
4hello-world_my-test_1   /hello Exit 0

一个运行容器将显示Up:

1[secondary_label Output]
2     Name Command State Ports      
3---------------------------------------------------------------
4nginx_nginx_1 nginx -g daemon off;   Up 443/tcp, 80/tcp

若要阻止一个应用程序组的所有运行 Docker 容器,请在同一个目录中发出下列命令,即您启动 Docker 组的 docker-compose.yml 文件:

1docker-compose stop

<$>[注] 注: 如果您需要更强硬地关闭事物,也可以使用docker-compose kill

在某些情况下,Docker容器会将其旧信息存储在内部卷中. 如果您想从零开始,您可以使用rm命令完全删除组成您的容器组的所有容器:

1docker-compose rm

如果您尝试从包含 Docker 容器和.yml 文件的目录以外的目录中使用这些命令,则会返回错误:

1[secondary_label Output]
2ERROR:
3        Can't find a suitable configuration file in this directory or any
4        parent. Are you in the right directory?
5
6        Supported filenames: docker-compose.yml, docker-compose.yaml

本节涵盖了如何使用 Docker Compose 操纵容器的基本知识. 如果您需要对容器获得更大的控制权,您可以访问 Docker 容器的文件系统,并从容器内部的命令提示工作,这是下一节所描述的过程。

步骤 4 – 访问 Docker 容器文件系统

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

Hello World示例在运行后退出,因此要测试docker exec,请启动一个将继续运行的容器。

创建一个名为nginx的新目录并进入它:

1mkdir ~/nginx
2cd ~/nginx

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

1vi docker-compose.yml

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

1[label ~/nginx/docker-compose.yml]
2nginx:
3  image: nginx

将文件保存并退出,以以下命令作为背景流程启动 Nginx 容器:

1docker-compose up -d

Docker Compose将下载 Nginx 图像,容器将在背景中启动。

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

1docker ps

你会看到一些类似于以下的东西:

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

如果你想对这个容器内部的文件系统进行更改,你会采取它的ID(在这个例子中,b86b6699714c),并使用docker exec来启动容器内部的壳:

1docker exec -it b86b6699714c /bin/bash

t选项打开一个终端,而i选项使其互动。

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

1root@b86b6699714c:/#

但是,请记住,除非你在一个被保存为数据量的一部分的目录中,否则你的更改将在容器重新启动后消失。

结论

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

虽然Hello World示例证实了您的安装,但简单的配置并不显示Docker Compose的主要好处之一 - 能够同时将一组Docker容器带到顶部和底部。 要查看Docker Compose在行动中的力量,请参阅 如何通过Nginx、Let's Encrypt和Docker Compose保护一个容器化Node.js应用程序如何在Ubuntu 16.04上使用Docker和Docker Compose配置持续集成测试环境

Published At
Categories with 技术
Tagged with
comments powered by Disqus