介绍
Docker是一个伟大的工具,但要真正充分利用它的潜力,如果你的应用程序的每个组件在其自己的容器中运行它是最好的。 对于具有大量组件的复杂应用程序,协调所有容器以一起启动和关闭(更不用说彼此交谈)可能很快变得笨拙。
Docker社区想出了一个叫做流行的解决方案图 ,它允许您使用一个YAML文件,以协调所有的Docker容器和配置。 这变得如此受欢迎,以至于Docker团队最终决定根据Fig源创建自己的版本。 他们把它叫做Docker Compose 。 简而言之,它使得处理Docker容器的编排过程(例如启动,关闭和设置容器内链接和卷)非常容易。
在本文结束时,您将安装Docker和Docker Compose,并基本了解Docker Compose的工作原理。
Docker和Docker组成概念
使用Docker Compose需要将一组不同的Docker概念组合在一起,因此在开始之前,让我们花一点时间回顾一下所涉及的各种概念。 如果你已经熟悉Docker的概念,如卷,链接和端口转发,那么你可以继续下一步。
Docker镜像
每个Docker容器是Docker镜像的本地实例。 你可以把Docker镜像想象成一个完整的Linux安装。 通常,最小安装只包含运行映像所需的最少软件包。 这些映像使用主机系统的内核,但是由于它们在Docker容器中运行,并且只能看到自己的文件系统,所以在Ubuntu主机上运行像CentOS这样的分发是完全可能的(反之亦然)。
最Docker图像经由分布式Docker集线器 ,其由Docker队保持。 最流行的开源项目有一个相应的图像上传到Docker注册表,您可以使用它来部署软件。 如果可能,最好抓住“官方”图像,因为它们是由Docker团队保证遵循Docker最佳实践。
Docker镜像之间的通信
默认情况下,Docker容器与主机隔离,这意味着默认情况下主机不能访问Docker容器内的文件系统,也没有任何通过网络与其通信的方式。 不用说,这使得在默认情况下难以配置和使用在Docker容器中运行的映像。
Docker有三个主要方法来解决这个问题。 第一个也是最常见的是Docker指定要在Docker容器中设置的环境变量。 然后,在Docker容器中运行的代码将在启动时检查这些环境变量的值,并使用它们来正确配置。
另一种常用的方法是一种泊坞数据量 。 Docker卷有两种类型 - 内部和共享。 默认情况下,Docker容器会默认运行,这意味着每次容器关闭或重新启动时,它不会保存其数据 - 它本质上会恢复到容器启动时的状态。 这对于测试和开发是有好处的,因为你可以保证在每次运行Docker容器时使用相同的环境,但是如果你希望下一次仍然有WordPress安装中的博客文章你重新启动Docker。 (幸运的是,官方DockerWordPress和MariaDB的图像的创造者在照顾着这个问题对我们来说,更多的部署Wordpress和PHPMyAdmin中有Docker Compose在Ubuntu 14.04条)。它的Ubuntu 14.04写的,但步骤可以轻松适应CentOS 7。
指定内部卷仅意味着对于为特定Docker容器指定的文件夹,数据将在重新启动之间持久保存。 例如,如果你想确保你的日志文件挂在各家之间围绕重新启动您可以指定一个内部/var/log
卷。
共享卷将Docker容器中的文件夹映射到主机上的文件夹。 这使您可以轻松地分享Docker容器和主机,我们将中探索之间的文件Docker的数据量的文章 。
与Docker容器通信的第三种方式是通过网络。 Docker允许通过不同的Docker容器之间的通信links
端口转发,还有,让你从Docker容器内转发端口的端口主机服务器上。 例如,您可以创建一个链接,以允许您的WordPress和MariaDB Docker容器相互通信和端口转发,以将WordPress公开到外部世界,以便用户可以连接到它。
先决条件
要遵循本文,您需要以下内容:
- CentOS 7Droplet
- 使用sudo特权的非root用户(见在CentOS 7初始服务器设置的详细信息)
第1步 - 安装Docker
首先,如果你还没有安装Docker。 安装Docker的最快方法是下载并安装他们的安装脚本(系统会提示您输入sudo密码)。
wget -qO- https://get.docker.com/ | sh
上述命令下载并执行由Docker团队编写的小型安装脚本。 如果你不信任的第三方脚本或者想要了解什么脚本正在做检查中的说明更多的细节DigitalOceanDocker教程或码头自身的安装文件 。
与Docker的工作是一个痛苦,如果您的用户没有正确配置,使您的用户添加到docker
用下面的命令组。
sudo usermod -aG docker $(whoami)
注销并从服务器登录以激活新组。
设置Docker在启动时自动启动:
sudo systemctl enable docker.service
最后,启动Docker服务:
sudo systemctl start docker.service
注意:要了解更多有关如何使用Docker, 阅读如何使用的Docker节如何安装和使用Docker:入门 。
第2步 - 安装Docker Compose
现在你已经安装了Docker,让我们继续安装Docker Compose。 首先,安装python-pip
作为前提条件:
sudo yum install epel-release
sudo yum install -y python-pip
然后你可以安装Docker Compose:
sudo pip install docker-compose
您还需要升级在CentOS 7你的Python包拿到docker-compose
成功运行:
sudo yum upgrade python*
第3步 - 使用Docker Compose运行容器
公众Docker注册表,Docker中心,包括一个简单的Hello World形象。 现在我们已经安装了Docker Compose,让我们用这个非常简单的例子来测试它。
首先,为我们的YAML文件创建一个目录:
mkdir hello-world
然后切换到目录:
cd hello-world
现在使用您喜欢的文本编辑器创建YAML文件(我们将使用nano):
nano docker-compose.yml
将以下内容放入文件,保存文件,然后退出文本编辑器:
my-test:
image: hello-world
第一行将用作容器名称的一部分。 第二行指定用于创建容器的图像。 该图像将从官方Docker Hub存储库下载。
尽管仍然在~/hello-world
目录,执行以下命令来创建容器:
docker-compose up
输出应以以下内容开始:
Output of docker-compose upCreating 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 |
输出然后解释Docker正在做什么:
- Docker客户端联系了Docker守护进程。
- Docker守护进程从Docker Hub中提取了“hello-world”映像。
- Docker守护程序从该映像创建了一个新容器,该容器运行可执行文件,该文件将生成您当前正在读取的输出。
- Docker守护程序将该输出流传输到Docker客户端,后者将其发送到您的终端。
如果进程不退出就其本身而言,按CTRL-C
这个简单的测试没有显示Docker Compose的一个主要优点 - 能够同时带来一组Docker容器上下。 该如何与Docker ComposeUbuntu上安装WordPress和phpMyAdmin的14.04文章展示了如何使用Docker Compose运行三个容器为一个应用程序组。 它是为Ubuntu 14.04编写的,但步骤可以轻松地适应CentOS 7。
第4步 - 学习Docker编写命令
让我们在命令docker-compose
工具支持。
该docker-compose
命令对每个目录的基础。 你可以在一台机器上运行Docker容器的多个组-只是使每个容器一个目录和一个docker-compose.yml
其目录中每个容器文件。
到目前为止,我们已经运行docker-compose up
我们自己的,并使用CTRL-C
将其关闭。 这允许在终端窗口中显示调试消息。 这并不理想,虽然,在生产中运行时,你会希望有docker-compose
的行为更像是一个服务。 一个简单的方法做,这是只是添加-d
选项,当您up
您的会话:
docker-compose up -d
docker-compose
现在将叉到后台。
要显示您的一组Docker容器(已停止和当前正在运行),请使用以下命令:
docker-compose ps
例如,下面显示了helloworld_my-test_1
容器被停止:
Output of `docker-compose ps` Name Command State Ports
-----------------------------------------------
helloworld_my-test_1 /hello Exit 0
运行的容器将呈现Up
的状态:
Output of `docker-compose ps` Name Command State Ports
---------------------------------------------------------------
nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp
要停止所有正在运行的Docker容器应用程序组,发出在同一目录下面的命令docker-compose.yml
用于启动Dockergroup文件:
docker-compose stop
注: docker-compose kill
也可以,如果你需要关闭下来更有力。
在某些情况下,Docker容器会将其旧信息存储在内部卷中。 如果您想从头开始,你可以使用rm
命令来完全删除所有使你的容器组容器:
docker-compose rm
如果试图从任何比包含Docker容器和目录的目录中这些命令.yml
文件,它会抱怨,而不是看你的容器:
Output from wrong directory 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, fig.yml, fig.yaml
第5步 - 访问Docker容器文件系统(可选)
如果你需要在命令提示符下运行一个容器内,可以使用docker exec
命令。
它运行后的Hello World!例如退出,所以我们需要开始一个容器,将继续运行,这样我们就可以使用docker exec
访问文件系统的容器。 让我们来看看Nginx的图像从Docker Hub。
为其创建一个新目录并更改为:
mkdir ~/nginx && cd $_
创建一个docker-compose.yml
在我们的新目录中的文件:
nano docker-compose.yml
并粘贴在以下内容中:
nginx:
image: nginx
保存文件并退出。 我们只需要使用以下命令启动Nginx容器作为后台进程:
docker-compose up -d
将下载Nginx映像,然后容器将在后台启动。
现在,我们需要的CONTAINER ID
的容器。 正在运行的所有容器的列表:
docker ps
您将看到类似于以下内容的内容:
Output of `docker ps`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
注意:只有在运行容器与上市docker ps
命令。
如果我们想做出改变这个容器内的文件系统,我们会采取其ID(在这个例子中e90e12f70418
),并使用docker exec
启动容器内的外壳:
docker exec -it e90e12f70418 /bin/bash
在-t
选项打开一个终端,而-i
选项,可以互动。 在/bin/bash
选项打开的bash shell到正在运行的容器。 请务必使用容器的ID。
您将看到类似于以下内容的容器的bash提示:
root@e90e12f70418:/#
从这里,您可以从命令提示符工作。 但是,请记住,除非您位于作为数据卷一部分保存的目录中,否则您的更改将在容器重新启动后立即消失。 另一个警告是,大多数Docker镜像是用非常少的Linux安装创建的,因此您使用的某些命令行实用程序和工具可能不存在。
结论
很好,所以涵盖了Docker Compose的基本概念,以及如何安装和运行它。 退房的部署Wordpress和使用的phpMyAdmin撰写Docker在Ubuntu 14.04教程如何部署Docker Compose的应用程序更复杂的例子。 它是为Ubuntu 14.04编写的,但步骤可以轻松地适应CentOS 7。
对于对配置选项的完整列表docker-compose.yml
文件指撰写文件引用 。