Docker Machine,Compose和Swarm:它们如何协同工作

在过去的一年中,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值