介绍
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 容器内部转发到主机服务器上的端口。
前提条件
为了遵循这篇文章,您将需要以下内容:
- CentOS 7 服务器,设置为具有 sudo 特权的非根用户(参见 CentOS 7 上的初始服务器设置详细信息)
- Docker 与 [CentOS 7 上如何安装和使用 Docker]的步骤 1 和步骤 2 的指示一起安装(https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-centos-7)
一旦这些在场,你将准备跟随。
步骤 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配置持续集成测试环境。