在过去的一年中,Docker一直在努力工作,以创建易于使用的工具来设置容器主机(机器),管理链接在一起的多个容器(组成),并将容器主机视为集群(群集)。
尽管这些工具很简单,但它们功能非常强大,在您运行并在您喜欢的基础架构即服务之上部署大量容器之前,还需要进行一些计划。 我将尝试阐明为什么它们非常适合您的工具带,应该在哪里使用以及如何开始使用它们。
这三个工具现在被整齐地打包到了Docker Toolbox中 。 在继续下一步之前,请确保已安装该文件。
Docker机器
我们将从工具箱中看到的第一个工具是Docker Machine,它将帮助您在许多最流行的“基础架构即服务”平台上创建容器主机。 当然,您可以使用两个最受欢迎的桌面虚拟化平台:VMware Fusion和VirtualBox,但它还支持其他平台,例如AWS,Azure,DigitalOcean,Exoscale,Google Compute Engine,OpenStack,RackSpace,SoftLayer,VMware vSphere和vCloud空气。
让我们从启动容器主机并在本地桌面上运行开始。 当您安装Docker Toolbox时,您还安装了VirtualBox,因此我们可以使用它来创建一个Linux VM,以在其中运行我们的容器。 要创建容器主机,只需运行以下命令:
$ docker-machine create --driver virtualbox containerhost
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env containerhost
该命令将告诉Docker Machine使用VirtualBox驱动程序创建一个名为“ containerhost”的容器主机。 现在,我们有一个地方来运行我们的容器! 让我们通过运行以下命令来配置终端以连接到它:
eval "$(docker-machine env containerhost)"
如果您习惯使用Docker Toolbox的前身Boot2Docker,则上述命令类似于熟悉的boot2docker shellinit
。
在评估Docker Machine env变量之后,您现在可以运行常规Docker命令,例如docker run,pull,ps,rm等。尝试一下!
Docker撰写
现在我们已经启动并运行了一个容器主机,我们将集中精力在其上实际运行一些有用的容器。 我们将为此使用Docker Compose。 它实际上是基于Docker在2014年进行的首次收购而建立的,这家名为Orchard的公司创建了一个名为Fig的多容器管理工具。Docker和Orchard的新加入的团队继续Orchard所做的出色工作,最后将其重命名为Docker Compose于去年年底发布。
Docker Compose通过一种简单的方式将应用程序描述为可以协同工作的多个容器,应如何链接它们以及应向最终用户公开哪些端口。 Docker容器环境在“ docker-compose.yml”文件中定义; 让我们看一个例子,并分解一下:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
在这里,我们有一个使用两个容器构建的应用程序。 第一个容器称为“ web”,它将根据我们在当前工作目录中拥有的Dockerfile构建。 如果您已经有一个用于容器映像的Dockerfile但尚未将其推送到注册表中,那就太好了。 在此可以找到该示例的完整Dockerfile和必要的应用程序文件。
下一行显示哪些端口将在主机上公开,以及哪些流量将转发到容器中。 第三部分显示了我们将一个Docker卷装载到包含应用程序代码的容器中。 最后,我们将链接到另一个容器,称为“ redis”,该容器将使用Docker Hub中的标准官方Redis映像。
现在运行此命令,我们发出以下命令:
$ docker-compose up
这将读取docker-compose.yml并创建我们在其中定义的应用程序环境,首先从Dockerfile构建Web应用程序,然后拉下redis映像。 Docker Compose还将Web容器链接到redis容器。 它看起来像这样:
$ docker-compose up
Pulling redis (redis:latest)...
<snip>
Creating compose_redis_1...
Building web...
Step 0 : FROM python:2.7
2.7: Pulling from python
<snip>
Successfully built b88dd767cf97
Creating compose_web_1...
Attaching to compose_redis_1, compose_web_1
<snip>
redis_1 | 1:M 11 Sep 21:21:56.463 # Server started, Redis version 3.0.3
<snip>
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1 | * Restarting with stat
你有它! 您已成功使用Docker Compose创建了一个包含两个服务的容器化环境:一个是面向外部的Web服务,另一个是持久层。 现在,让我们看一下网页以验证应用程序正在运行。
要查找您的容器主机的IP,请运行以下命令:
$ docker-machine ip containerhost
192.168.99.101
由于我们还确保在容器主机上打开端口5000并将其链接到容器,因此您现在应该能够连接到http://192.168.99.101:5000。 您应该看到消息“ Hello World! 我被看过1次。” 现在,您正在访问一个网站,该网站将命中计数器值存储在单独的容器化键值存储中,并在网站上的每个新命中检索该值并将其返回给您。 太棒了!
好了,现在我们已经解释了Docker Compose的基础知识,是时候深入探讨下一个主题了。
码头工人
最后,让我们看一下当前Docker Toolbox中最有趣的工具Docker Swarm。 到目前为止,您要做的是使用一个容器主机并运行一个或两个容器,这对于测试或本地开发非常有用。 借助Docker Swarm,我们现在将把小型测试环境转变为更大的集群容器主机设置,可用于将您的操作扩展到更有用的功能。 这有点高级,将涉及服务发现,群集和远程管理等内容。
让我们从清理我们的环境开始,这样我们就不会在运行大量事务时遇到任何问题。 通过运行以下命令停止并删除当前的本地容器主机:
$ docker-machine stop containerhost
exit status 1
$ docker-machine rm containerhost
Successfully removed containerhost
现在让我们开始创建一个新的新鲜容器宿主,我们将在短时间内使用它:
$ docker-machine create -d virtualbox local
这为我们创建了一个名为“ local”的新容器主机。 通过运行以下命令为您的终端获取正确的连接信息:
eval "$(docker-machine env local)"
现在,我们需要生成所谓的“发现令牌”,该令牌将用于配置并确保您的节点属于正确的集群:
$ docker run swarm create
<snip>
Status: Downloaded newer image for swarm:latest
8d7dc66346a3e0d999ed38dd29ed0d38
最后一行是您的发现令牌,将与我的发现令牌不同。 发现令牌实际上是使用Docker的公共发现服务创建的。 您可以通过转到https://discovery.hub.docker.com/v1/clusters/YOURTOKENHERE之类的地址来找到它保留在群集中的信息。 您将对所有新的swarm成员(包括我们这样创建的Swarm Master)使用此新令牌:
$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://YOURTOKENHERE swarm-master
现在,我们将创建两个第一个Swarm节点:
$ docker-machine create -d virtualbox --swarm --swarm-discovery token://YOURTOKENHERE swarm-agent-00
$ docker-machine create -d virtualbox --swarm --swarm-discovery token://YOURTOKENHERE swarm-agent-01
现在,您还可以关闭并删除“本地”容器主机。 我们将不再需要它。
现在,确保您的外壳指向Swarm Master:
eval $(docker-machine env --swarm swarm-master)
您现在拥有一个Swarm Master和两个在本地运行的Swarm节点。 让我们看看它是什么样的:
$ docker info
Containers: 4
Images: 3
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 3
swarm-agent-00: 192.168.99.104:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.022 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.1 (TCL 6.3); master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015, provider=virtualbox, storagedriver=aufs
swarm-agent-01: 192.168.99.105:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.022 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.1 (TCL 6.3); master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015, provider=virtualbox, storagedriver=aufs
swarm-master: 192.168.99.103:2376
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.022 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.1 (TCL 6.3); master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015, provider=virtualbox, storagedriver=aufs
CPUs: 3
Total Memory: 3.065 GiB
Name: 054cb8519400
这太酷了! 只需几分钟的工作,您现在就可以完全控制一组容器主机。 我认为那真是太棒了!
您现在可以尝试像平常一样运行容器。 有时客户端需要一段时间才能使用容器的唯一ID进行响应,因此只需等待它返回即可:
$ docker run -d redis 0d7af2492be35cc9c7593f6d677185c6c44f3a06898258585c7d2d2f9aa03c2e
$ docker run -d nginx 0babf055abf9b487b6bafd4651386075f8d6f46ce9f192849bc32345997438ea
现在,通过查看容器的给定名称,列出容器以查看它们是在不同群集主机上进行调度的:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0babf055abf9 nginx "nginx -g 'daemon off" 10 seconds ago Up 10 seconds 80/tcp, 443/tcp swarm-agent-01/grave_jones
0d7af2492be3 redis "/entrypoint.sh redis" 37 seconds ago Up 37 seconds 6379/tcp swarm-agent-00/furious_fermat
极好的工作! 现在,您拥有一个由您控制的容器主机集群,可以用来调度整个容器。
不幸的是,Docker Compose和Docker Swarm之间的集成目前还不完整。 但是正在努力使它们在不久的将来适当地兼容。 您可以在这里关注工作 。
在此之前,请为可以在新创建的集群上运行的有趣的应用程序带来乐趣!
翻译自: https://www.javacodegeeks.com/2015/09/docker-machine-compose-swarm-how-they-work-together.html