介绍
Docker是一个很棒的工具,但要真正充分利用其潜力,最好让您的应用程序的每个组件运行在其自己的容器中。
Docker 社区提出了一个受欢迎的解决方案,名为 Fig,允许您使用单个 YAML 文件来编排您的所有 Docker 容器和配置. 这变得如此受欢迎,以至于 Docker 团队最终决定基于 Fig 源创建自己的版本。
到本文结束时,您将安装 Docker 和 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 容器和主机之间轻松共享文件,我们将在 Docker 数据卷文章中探讨。
Docker 允许不同 Docker 容器通过链接
进行通信,以及端口转发,允许您将端口从 Docker 容器内部转发到主机服务器上的端口。
前提条件
为了遵循这篇文章,您将需要以下内容:
- Ubuntu 14.04 Droplet
- 具有 sudo 特权的非根用户(Initial Server Setup with Ubuntu 14.04)(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-14-04)解释了如何设置此功能。
步骤 1 - 安装 Docker
首先,如果您尚未安装Docker,安装Docker的最快方法是下载并安装其安装脚本(您将被要求提供一个sudo密码)。
1wget -qO- https://get.docker.com/ | sh
上面的命令下载并执行由Docker团队编写的小型安装脚本. 如果您不信任第三方脚本或想要更多有关脚本正在做的事情的详细信息,请查看DigitalOcean Docker教程(https://andsky.com/tech/tutorials/how-to-install-and-use-docker-getting-started)或Docker自己的 安装文档中的说明。
如果您的用户没有正确配置,使用 Docker 工作会很痛苦,所以使用以下命令将您的用户添加到docker
组中。
1sudo usermod -aG docker $(whoami)
登出并登录您的服务器以激活您的新组。
<$>[注]
注: 若要了解有关如何使用 Docker 的更多信息,请参阅 如何安装和使用 Docker:启动的如何使用 Docker
部分。
步骤 2 – 安装 Docker Compose
现在你已经安装了Docker,让我们继续安装Docker Compose。 首先,安装‘python-pip’作为先决条件:
1sudo apt-get -y install python-pip
然后您可以安装 Docker Compose:
1sudo pip install docker-compose
步骤 3 — 使用 Docker Compose 运行容器
公共 Docker 注册表,Docker Hub,包含一个简单的 Hello World 图像. 现在我们已经安装了 Docker Compose,让我们用这个非常简单的例子来测试它。
首先,为我们的 YAML 文件创建一个目录:
1mkdir hello-world
然后更换到目录:
1cd hello-world
现在使用您最喜欢的文本编辑器创建YAML文件(我们将使用nano):
1nano docker-compose.yml
将以下内容放入文件中,保存文件,然后退出文本编辑器:
1[label docker-compose.yml]
2my-test:
3 image: hello-world
第一行将作为容器名称的一部分使用。第二行将指定使用哪个图像来创建容器。
虽然仍在~/hello-world
目录中,请执行以下命令来创建容器:
1docker-compose up
输出应该从以下开始:
1[secondary_label Output of docker-compose up]
2Creating helloworld_my-test_1...
3Attaching to helloworld_my-test_1
4my-test_1 |
5my-test_1 | Hello from Docker.
6my-test_1 | This message shows that your installation appears to be working correctly.
7my-test_1 |
然后输出解释了Docker正在做什么:
- Docker 客户端联系了 Docker 示威者.
2 Docker 示威者从 Docker Hub 中提取了
问候世界
图像。 3 Docker 示威者从该图像中创建了一个新的容器,该容器运行了正在阅读的输出。 4 Docker 示威者将该输出流到 Docker 客户端,将其发送到您的终端。
如果进程不会自行退出,请按CTRL-C
。
这个简单的测试没有显示 Docker Compose 的主要好处之一 - 能够同时将一组 Docker 容器带上下。
步骤 4 – 学习 Docker 构成命令
让我们来谈谈docker-compose
工具支持的命令。
您可以在一台机器上运行多组 Docker 容器 - 只需为每个容器创建一个目录,并为其目录中的每个容器创建一个 'docker-compose.yml' 文件。
到目前为止,我们一直在自行运行docker-compose
并使用CTRL-C
来关闭它,这允许在终端窗口中显示调试消息,但这并不理想,在生产中运行时,您将希望docker-compose
更像是一个服务。
1docker-compose up -d
docker-compose
现在将转向背景。
若要显示您的 Docker 容器组(既已停止,也正在运行),请使用以下命令:
1docker-compose ps
例如,以下示例显示helloworld_my-test_1
容器已停止:
1[secondary_label Output of `docker-compose ps`]
2 Name Command State Ports
3-----------------------------------------------
4helloworld_my-test_1 /hello Exit 0
运行容器将显示Up
状态:
1[secondary_label Output of `docker-compose ps`]
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 from wrong directory]
2 Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?
3
4 Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml
步骤 5 — 访问 Docker 容器文件系统(可选)
如果您需要在容器内部工作命令提示,您可以使用docker exec
命令。
示例 Hello World! 在运行后退出,所以我们需要启动一个将继续运行的容器,以便我们可以使用docker exec
访问容器的文件系统。
创建一个新的目录,并转换为它:
1mkdir ~/nginx && cd $_
在我们的新目录中创建一个 docker-compose.yml
文件:
1nano docker-compose.yml
然后在下列情况下吃:
1[label ~/nginx/docker-compose.yml]
2nginx:
3 image: nginx
我们只需要启动 Nginx 容器作为背景过程,使用以下命令:
1docker-compose up -d
将下载 Nginx 图像,然后在背景下启动容器。
现在我们需要对集装箱的CONTAINER ID
列出正在运行的所有集装箱:
1docker ps
你会看到一些类似于以下的东西:
1[secondary_label Output of `docker ps`]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
<$>[注]
注: 只有 running 容器列出了 docker ps
命令。
如果我们想对该容器内部的文件系统进行更改,我们会采取其ID(在本例中e90e12f70418
)并使用docker exec
来启动容器内部的壳:
1docker exec -it e90e12f70418 /bin/bash
t
选项打开一个终端,而 i
选项使其互动。 /bin/bash
选项打开了运行容器的 bash shell。
您将看到类似于此容器的 bash 提示:
1root@e90e12f70418:/#
但是,请记住,除非您是在数据量的一部分中保存的目录中,否则您的更改将在容器重新启动后消失。
结论
很棒,所以它涵盖了Docker Compose的基本概念,以及如何安装和运行它。 查看 在Ubuntu 14.04上使用Docker Compose部署Wordpress和PHPMyAdmin教程,以了解如何使用Docker Compose部署应用程序的更复杂示例。
对于 docker-compose.yml
文件的完整配置选项列表,请参阅 Compose file reference。