Docker入门六部曲——Swarm

原文链接:http://www.dubby.cn/detail.html?id=8738

准备工作

  • 安装Docker(版本最低1.13)。
  • 安装好Docker Compose,上一篇文章介绍过的。
  • 安装好Docker Machine,上一篇文章也提到了,Mac和Windows已经预先安装了,但是Linux需要你自己安装。如果是Windows10,那么请使用Docker Toolbox。
  • 阅读完Docker入门六部曲——基本引导。
  • 阅读完Docker入门六部曲——容器。
  • 阅读完Docker入门六部曲——服务。
  • 确保你已经按照前几篇所介绍的,把你的镜像push到远端仓库了。
  • 确保你的镜像可以正常的部署。
  • 按照Docker入门六部曲——服务介绍的,写出了你的docker-compose.yml文件。

介绍

Docker入门六部曲——服务我们已经足额会了定义服务,并且伸缩服务的容量。

这一篇,你可以看到如何把应用部署到集群中去,运行在多个机器上。Swarm可以帮助我们在多容器,多机器上部署服务。

理解Swarm集群

Swarm就是一个运行着Docker的集群。并且,你还可以使用Docker名来控制这个集群,但是你只能对swarm manager下达命令。集群中的机器可以是真实的物理机,也可以是虚拟机。加入swarm之后,他们都是一个节点。

Swarm manager可以使用不同的策略来运行容器,例如“最空节点”策略——选择使用率最低的节点来运行容器;或者“全局”策略——每一个节点至少有一个镜像的容器。你可以在Compose文件里指定策略。

Swarm manager就是在这个集群中,你可以执行命令,或者授权其他工作节点加入的那个管理节点。工作节点就是那些只提供资源,但不能授权其他节点加入集群的节点。

配置你的swarm

一个swarm集群由很多个机器组成,不管是虚拟机还是物理机都可以。最简单的方式就是执行docker swarm init来开启一个swarm节点,并且把当前执行命令的节点作为管理节点,然后在其他机器上执行docker swarm join来加入这个swarm集群。

本地虚拟机(Mac,Linux,Windows7,Windows8)

为了简单,我们用虚拟机来完成swarm集群配置吧。你需要安装VirtualBox。

然后使用docker-machine来创建几个虚拟机:

$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2

这个需要下载镜像,如果网络不好,请耐心等待。

现在,你本地已经有了两个虚拟机了,分别是myvm1和myvm2(可以使用docker-machine ls查看)。我们准备把myvm1作为管理节点,myvm2作为工作节点。

我们可以使用docker-machine ssh来登录虚拟机或者发送命令。我们先把myvm1初始化成管理节点吧:

$ docker-machine ssh myvm1 "docker swarm init"
Swarm initialized: current node  is now a manager.

To add a worker to this swarm, run the following command:

  docker swarm join \
  --token  \
  :

执行失败,提示要加--advertise-addr
使用docker-machine ls查看虚拟机,然后拷贝myvm1的ip,指定端口2377,例如:

docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"

初始化成功后,会返回一个提示信息,告诉你怎么加入这个集群。把这个命令拷贝下来,然后去myvm2执行:

$ docker-machine ssh myvm2 "docker swarm join \
--token  \
:"

This node joined a swarm as a worker.

注意:反斜线不能丢。

使用docker-machine ssh myvm1可以登录到myvm1上,使用docker node ls可以查看当前swarm集群中的所有节点:

docker@myvm1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd     myvm2               Ready               Active              
rihwohkh3ph38fhillhhb84sk *   myvm1               Ready               Active              Leader

执行exit退出登录,返回原来的机器。当然也可以直接发送命令:

docker-machine ssh myvm1 "docker node ls"

部署应用

你一定没有想到,最难的部分已经被你度过去了。现在我们只需要重复上一篇文章的的步骤就可以了。不过要记住,我们只可以在myvm1上执行dokcer命令,因为他才是管理节点。

把之前的docker-compose.yml拷贝过来。使用docker-machine scp上传到myvm1上:

docker-machine scp docker-compose.yml myvm1:~

我们要开始使用swarm来部署啦!同样还是docker stack deploy

docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

结束了!

我们来查看一下容器吧:

$ docker-machine ssh myvm1 "docker stack ps getstartedlab"

ID            NAME        IMAGE              NODE   DESIRED STATE
jq2g3qp8nzwx  test_web.1  username/repo:tag  myvm1  Running
88wgshobzoxl  test_web.2  username/repo:tag  myvm2  Running
vbb1qbkb0o2z  test_web.3  username/repo:tag  myvm2  Running
ghii74p9budx  test_web.4  username/repo:tag  myvm1  Running
0prmarhavs87  test_web.5  username/repo:tag  myvm2  Running

注意:DESIRED 和STATE,第一次执行命令部署时,需要从远端仓库下载镜像,所以如果网络不好的话,会过一段时间才会是Running。

访问集群

你可以使用myvm1和myvm2任意一个ip来访问这个集群。这个集群内部的网络是共享的,而且是负载均衡的。可以使用docker-machine ls查看ip。然后在浏览器中打开,不断的刷新,你会看到5个容器的id,因为是负载均衡的。

网络示意图:
Docker入门六部曲——Swarm_第1张图片

伸缩应用

和上一篇文章的一样,你只需要修改docker-compose.yml,然后重新执行docker stack deploy就可以了,swarm会自动帮你调整。

你也可以再创建几个虚拟机,然后加入集群。再使用docker stack deploy重新部署,swarm就会把新的节点利用起来了。

清扫战场

如果你想把应用给下掉:

docker-machine ssh myvm1 "docker stack rm getstartedlab"

如果想让工作节点脱离swarm集群:docker-machine ssh myvm2 "docker swarm leave"

如果关闭管理节点:docker-machine ssh myvm1 "docker swarm leave --force"

你可能感兴趣的:(docker,Docker最佳实践)