docker swarm 配置
2017-04-21 22:16
225 查看
Docker1.12以后的swarmkit
Docker 1.12 在 2016 年 7 月 28 日正式 GA,除了大量的在使用上的改进和 bug 修复外,最引人瞩目的是Docker原生支持了 Swarm 模式,而不是将Swarm作为一个容器对集群进行管理。而docker1.12的操作命令并不向下兼容,于是过去所有创建swarm集群的文档都不能参考了。
4.1 几个概念
4.1.1 节点类型
docker-swarm 把节点分为manager和worker,顾名思义,manager是管理节点,worker是工作节点。
4.1.2 service
区别于旧的swarm管理容器,新的docker-swarm抽象了一个service的概念,有点类似于kubernates的pod,它是管理的最小单元。一个service是一个以上的容器的集合。
4.2 搭建swarm环境
仍然使用前面的节点服务来测试,第1、2节的工作还是需要有效的。
4.2.1 在node-1节点创建swarm环境
$ docker swarm init --advertise-addr 192.168.33.201 Swarm initialized: current node (9vpgoqj65y3kqo52jj3y6gcnj) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-2at6h0j885ttz6zzxxdca7rerj0dkcnq5tbqv729u0ty2tvtzz-2g85bb2vug886wxit8rbpcisy \ 192.168.33.201:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.1
2
3
4
5
6
7
8
9
10
他是使用Raft来管理节点的。事实上,如果你只有一个外网地址(即除了lo和docker网络等虚拟网络之外没有其他网络接口),可以直接执行:
docker swarm init
4.2.2 将node-2节点加入到创建的swarm cluster
在node-2 执行:$ docker swarm join \ --token SWMTKN-1-2at6h0j885ttz6zzxxdca7rerj0dkcnq5tbqv729u0ty2tvtzz-2g85bb2vug886wxit8rbpcisy \ 192.168.33.201:2377 This node joined a swarm as a worker.1
2
3
4
4.2.3 在更多节点加入swarm cluster
token没有记录下来?没关系,在node-1执行如下命令查看完整的命令提示:$ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-2at6h0j885ttz6zzxxdca7rerj0dkcnq5tbqv729u0ty2tvtzz-2g85bb2vug886wxit8rbpcisy \ 192.168.33.201:23771
2
3
4
5
6
如果要加入的是manager节点,则如下查看:
$ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-2at6h0j885ttz6zzxxdca7rerj0dkcnq5tbqv729u0ty2tvtzz-37rg2khjxgk1iis6dfds48b0s \ 192.168.33.201:23771
2
3
4
5
6
4.3 集群管理
4.3.1 查看集群节点
在manager节点:$ docker node list ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 9vpgoqj65y3kqo52jj3y6gcnj * test1 Ready Active Leader dc5t7rc04a69rzuahky6qh53x test2 Ready Active e4k1fjd93ukncipzy9cer0lcg test3 Ready Active1
2
3
4
5
可以看到,一共有三个节点,node-1自身已经是一个worker了,他的MANAGER是Leader。
该命令只有在manager节点才有权限使用,如果你想在node-3上使用,则需要让node-3成为manager。。
一种方法是让node-3先从cluster重新以manager身份加入cluster。
$ docker swarm leave Node left the swarm.1
2
注意:有时自己退出重新加入,反复操作,会让manager混乱,导致一些问题。如,test3已经leave,但manager看到它还是Reading状态,无法删除掉。
docker node rm test3只能删除down状态的节点, 加上
--force不是那么好使。
4.3.2 节点角色转换
接上,将node-3转换为manager最简单的方法是,角色提权:是在manager中把node-3的角色提升为manager:vagrant@test1:~$ docker node promote test3 Node test3 promoted to a manager in the swarm. vagrant@test1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 5awz4cd6auchp0knq0iljfudh test2 Ready Active a02rv4zuex14p03erer1h6zkz * test1 Ready Active Leader cq9q1su8ipkp9w80sabv16mmz test3 Ready Active Reachable1
2
3
4
5
6
7
与之相反的就是降权:
一种方法是在manager中把node-3的角色提升为manager:
vagrant@test1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 5awz4cd6auchp0knq0iljfudh test2 Ready Active a02rv4zuex14p03erer1h6zkz * test1 Ready Active Leader cq9q1su8ipkp9w80sabv16mmz test3 Ready Active1
2
3
4
5
从安全性考虑,一个集群应该指定多个manager。但需要注意的是,如果一个manager宕机,那么另一个manager需要接管服务,需要至少有三个以上存活的节点。
4.3.3 删除节点
docker node rm [node_id]1
如果节点状态是
Down,可以直接删除,否则可以增加
--force开关强制删除。
4.3.4 manager容灾测试
再增加一个node-4,并将node-3提权为manager。vagrant@test1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 2n3x7y0oaez6pdoxq91r5lng9 test4 Ready Active 77pnoup6clbxgwfd58dp9reu4 test2 Ready Active 84n1fg849v49i2ezobmps5vwg * test1 Ready Active Leader 8v5r3wb9sujlluqda6jv981ut test3 Ready Active Reachable1
2
3
4
5
6
关闭node-1,在node-3检查节点:
vagrant@test3:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 2n3x7y0oaez6pdoxq91r5lng9 test4 Ready Active 77pnoup6clbxgwfd58dp9reu4 test2 Ready Active 84n1fg849v49i2ezobmps5vwg test1 Ready Active Unreachable 8v5r3wb9sujlluqda6jv981ut * test3 Ready Active Leader1
2
3
4
5
6
此时test3接管Leader了。
启动node-1,检查节点:
vagrant@test1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 2n3x7y0oaez6pdoxq91r5lng9 test4 Ready Active 77pnoup6clbxgwfd58dp9reu4 test2 Ready Active 84n1fg849v49i2ezobmps5vwg * test1 Ready Active Reachable 8v5r3wb9sujlluqda6jv981ut test3 Ready Active Leader1
2
3
4
5
6
node-1已经变成了Reachable。
4.4 使用入门
4.4.1 创建service
折腾了半天,办点正事吧。vagrant@test1:~$ docker service create --name web1 nginx bojkn65bzwpv2az82y3p7qssv vagrant@test1:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES vagrant@test1:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND bojkn65bzwpv web1 0/1 nginx #稍等片刻 vagrant@test1:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND bojkn65bzwpv web1 1/1 nginx1
2
3
4
5
6
7
8
9
10
11
REPLICAS 表示一共指定了1个副本,开始启动了0个,启动完成后,变成1/1。
4.4.2 查看服务中的容器
vagrant@test1:~$ docker service ps web1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 3tu8qr42a74tzudu8xta46u9h web1.1 nginx test2 Running Running 3 minutes ago1
2
3
4.4.3 调整容器副本
我们可以把web1服务中的容器多启动几个副本,如6个:vagrant@test1:~$ docker service scale web1=6 web1 scaled to 6 vagrant@test1:~$ docker service ps web1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 3tu8qr42a74tzudu8xta46u9h web1.1 nginx test2 Running Running 4 minutes ago chy2qbqz3pbboyxxz90gb9vxb web1.2 nginx test3 Running Preparing 12 seconds ago 2ae4vz4lx8zcpacjepdzcxx5y web1.3 nginx test1 Running Preparing 13 seconds ago dfg1pul4brwa8xqutls2dddm1 web1.4 nginx test4 Running Preparing 13 seconds ago 2o39qlezex2ddk8ie0bzs9drv web1.5 nginx test4 Running Preparing 13 seconds ago bsduc9qvegikjs8fj94k4ogi8 web1.6 nginx test2 Running Running 6 seconds ago vagrant@test1:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND bojkn65bzwpv web1 2/6 nginx1
2
3
4
5
6
7
8
9
10
11
12
13
其中的
2/6以及前面看到的列表信息状态可以看出,我们指定了6个副本,目前
web1.1和
web1.6已经启动完成,其他还在Preparing。
6个副本中分别在test1启动了1个、test2启动了2个、test3启动了1个、test4启动了2个。
过一会再刷新:
vagrant@test1:~$ docker service ps web1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 3tu8qr42a74tzudu8xta46u9h web1.1 nginx test2 Running Running 7 minutes ago chy2qbqz3pbboyxxz90gb9vxb web1.2 nginx test3 Running Preparing 3 minutes ago 2ae4vz4lx8zcpacjepdzcxx5y web1.3 nginx test1 Running Preparing 3 minutes ago dfg1pul4brwa8xqutls2dddm1 web1.4 nginx test4 Running Running 9 seconds ago 2o39qlezex2ddk8ie0bzs9drv web1.5 nginx test4 Running Running 9 seconds ago bsduc9qvegikjs8fj94k4ogi8 web1.6 nginx test2 Running Running 3 minutes ago vagrant@test1:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND bojkn65bzwpv web1 4/6 nginx1
2
3
4
5
6
7
8
9
10
11
最终会完全启动。
vagrant@test1:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND bojkn65bzwpv web1 6/6 nginx1
2
3
处理scale子命令,还可以使用update子命令完成同样的工作:
vagrant@test1:~$ docker service update web1 --replicas=3 web1 vagrant@test1:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND bojkn65bzwpv web1 2/3 nginx1
2
3
4
5
4.5 负载均衡
多个副本容器启动后, swarm集群的service:公共的端口会暴露在每一个swarm集群中的节点服务器上.
请求公共端口时,会负载均衡到所有的sevice实例上.
负载均衡模式有两种,vip和dnsrr,可以在出啊构建服务时指定:
vagrant@test1:~$ docker service create --name web1 --replicas=6 --endpoint-mode=dnsrr nginx 4dx616zii0vgrz4s5oi2rwgsp1
2
如果使用vip模式,应该有VirtualIP:
$ docker service inspect --format='{{.Endpoint.VirtualIPs}}' web1 []1
2
怎么木有?你可能忘记在创建服务时发布端口了。
vagrant@test1:~$ docker service create --name web1 --replicas=6 -p 8888:80 nginx 8qlkxx7v643z7aenfrmfnksxk vagrant@test1:~$ docker service inspect --format='{{.Endpoint.VirtualIPs}}' web1 [{9h4hrcm7bv1ijdpzpyezy4pld 10.255.0.6/16}]1
2
3
4
5
可以直接访问”http://10.255.0.6:8080“吗?no,它只是为容器间通信的,你可以访问任一台节点的IP:
http://192.168.33.201:8888
4.6 启动时指定副本数
vagrant@test1:~$ docker service create --name nginx1 --replicas 2 nginx c79881b02bd7zrfg74a9qp8ji vagrant@test1:~$ docker service ps nginx1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1ghmia00xkxucrisadlwyitv9 nginx1.1 nginx test3 Running Running 5 seconds ago 193mdx2xcja4qv8s9ssakt8w1 nginx1.2 nginx test4 Running Running 6 seconds ago1
2
3
4
5
6
4.7 swarm网络
由于容器在不同的docker主机上,swarm是如何保证网络层的互通呢?swarm是使用overlay网络来解决这个问题的。vagrant@test1:~$ docker network ls NETWORK ID NAME DRIVER SCOPE 180d624cf798 bridge bridge local 4d225a25b2b4 docker_gwbridge bridge local 6c1889cd666a host host local 9h4hrcm7bv1i ingress overlay swarm 839e8db03b09 none null local1
2
3
4
5
6
7
其中的swarm是缺省创建的overlay网络。
你可以自己创建网络来管理一组服务的互通。
vagrant@test1:~$ docker network create --driver overlay test 17wzxz29pxdf6are8an6u0ep2 vagrant@test1:~$ docker network ls |grep test 17wzxz29pxdf test overlay swarm1
2
3
4
在指定子网启动服务
vagrant@test1:~$ docker service create --network test --name myservice hello-world 5kz0imiep9fztvsev0c101568 vagrant@test1:~$ docker service ps myservice ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 6zww5ci2jhnvy05aj68ohb3do myservice.1 hello-world test2 Running Preparing 5 seconds ago1
2
3
4
5
通过
docker service inspect myservice返回的json中
Networks元素可以看到网络信息,Target正是前面创建的test接口的id:
"Networks": [ { "Target": "17wzxz29pxdf6are8an6u0ep2" } ]1
2
3
4
5
你只要保证你启动的多个服务在同一个网络接口,就可以保证他们之间互相通信。
4.8 小结
swarmkit的引入,在docker中引入了三个子命令:docker swarm——swarm集群搭建 docker service——服务管理 docker node——集群节点管理1
2
3
4.8.1 docker swarm 子命令
查看子命令 vagrant@test1:~$ docker swarm –helpinit 初始化swarm集群 join 将当前节点加入到集群中 join-token 管理加入token update 动态更新swarm配置 leave 当前节点主动退出集群(仅限worker节点)1
2
3
4
5
4.8.2 docker service 子命令
查看子命令 vagrant@test1:~$ docker service –helpcreate 创建服务 inspect 显示服务详情 ps 列出服务中的容器 ls 列出所有服务及简介 rm 删除服务 scale 调整服务的副本数 update 动态更新服务配置1
2
3
4
5
6
7
4.8.3 docker node 子命令
查看子命令 vagrant@test1:~$ docker node –helpdemote 管理节点为指定子节点降权 inspect 显示节点详情 ls 列出集群中的节点 promote 管理节点为指定子节点提权 rm 删除一个节点 ps 列出指定子节点中running的容器 update 动态更新节点配置1
2
3
4
5
6
7
4.8 使用帮助
本节实际上只是给出了查看帮助的方法。想了解某个命令的使用,只需要在子命令后面加上--help即可,逐级深入。如想了解
docker node的子命令
rm,则是:
vagrant@test1:~$ docker node rm --help Usage: docker node rm [OPTIONS] NODE [NODE...] Remove one or more nodes from the swarm Aliases: rm, remove Options: --force Force remove an active node --help Print usage
相关文章推荐
- docker swarm 集群及可视化界面的安装及配置
- docker swarm集群TLS配置
- docker 基础安装配置以及swarm 基本操作使用
- Docker Swarm入门(二)配置选项与基本运行环境要求
- docker1.12+ swarm中 volume的nfs配置
- swarm+zookeeper配置docker集群
- docker swarm 集群及可视化界面的安装及配置 推荐
- Docker-swarm 集群部署及swarm集群管理节点的高可用配置
- Docker集群实验环境布署--swarm【6 配置上层Nginx代理,让任意Docker client访问得到高可用的管理API】
- ECS配置Docker-swarm
- docker swarm集群TLS配置
- 如何配置一个 Docker Swarm 原生集群
- Swarm创建docker集群:服务发现-配置文件法
- docker swarm 集群及可视化界面的安装及配置
- docker系列-06.docker搭建ELK,集成filebeat客户端配置使用(二)
- Docker镜像仓库Harbor之搭建及配置
- 【Docker】 Swarm简单介绍
- 基于docker搭建跨主机的spark集群并配置notebook(一)
- 在Docker Swarm模式下,Docker应用如何实现服务发现
- Docker中mysql修改配置导致无法启动的docker容器