- 本文讲解如何搭建docker-swarm集群,以及利用docker命令和portainer web管理工具来管理我们的服务集群,服务管理内容有:集群网络的管理与分配讲解,服务的创建,服务实例数的伸缩,服务滚动升级与回滚,集群节点分区,服务指定节点区域部署,服务状态的管理等等
本文内容有
- 搭建docker-swarm集群
- 管理集群中的机器节点
- Docker网络管理
- Docker swarm 服务Service管理
- 安装portainer管理工具及汉化
- 使用protainer对swarm集群进行可视化管理
原文地址
Dockerswarm官方教程
Docker Network 官方教程
Docker Swarm Service 官方教程
swarm 是docker官方提供的用于搭建容器服务集群的工具,从Docker 1.12 版本开始,swarm就集成到Docker中了,也就是说,新版本的docker安装完成后,默认就已经可以使用swarm了,swarm由docker官方开发并提供原生支持。
docker提供了服务容器化支持,而swarm则是进一步提供了管理整体服务容器能力的一套工具集,将以前单个独立的容器服务们进行了一个统一协调管理。
准备5台虚拟机如下
192.168.56.22 #管理节点1
192.168.56.23 #管理节点2
192.168.56.24 #管理节点3
192.168.56.25 #工作节点1
192.168.56.26 #工作节点2
登录到各个节点上执行命令,为各个节点设置主机名
hostnamectl set-hostname 192.168.56.22(manager) #管理节点1上执行
hostnamectl set-hostname 192.168.56.23(manager) #管理节点2上执行
hostnamectl set-hostname 192.168.56.24(manager) #管理节点3上执行
hostnamectl set-hostname 192.168.56.25(worker) #工作节点1上执行
hostnamectl set-hostname 192.168.56.26(worker) #工作节点2上执行
docker swarm init --advertise-addr ip地址
查看节点加入token及示例
docker swarm join-token [OPTIONS] (worker|manager)
eg. docker swarm join-token manager
#查看管理节点加入命令
加入工作节点到集群
docker swarm join --token SWMTKN-1-16ike2j01apbzkezzetlo595zb1g28nlcqw7m8ji6cdhdnw122-2damfdsog35oio872se9hy72s 192.168.56.22:2377
加入管理节点到集群
docker swarm join --token SWMTKN-1-16ike2j01apbzkezzetlo595zb1g28nlcqw7m8ji6cdhdnw122-80ki4l2ktno9w5azsz3rt2fps 192.168.56.22:2377
**注意:**如果加入集群失败,请检查机器间网络连通性以及防火墙端口是否已经打开
管理节点降级为工作节点
docker node demote manager1
工作节点升级为管理节点
docker node promote worker1
2377是集群管理端口,2375是docker服务监听端口
iptables防火墙
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 2375 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp --dport 4789 -j ACCEPT
service iptables save
firewalld防火墙
firewall-cmd --zone=public --add-port=2377/tcp --permanent #TCP port 2377 用于集群管理节点间通信
firewall-cmd --zone=public --add-port=2375/tcp --permanent #docker服务开启TCP远程管理容器功能,portainer可以使用该端口管理主机上的容器
firewall-cmd --zone=public --add-port=7946/tcp --permanent #TCP 和 UDP 端口号 7946 用于节点间通信
firewall-cmd --zone=public --add-port=4789/tcp --permanent #UDP port 4789 for overlay network traffic,也就是说docker如果使用overlay网络,该端口会用于主机间网络数据包的传输
firewall-cmd --reload
docker主机开启TCP远程管理端口2375
每台主机都开启一下,方便管理
vi /lib/systemd/system/docker.service
#ExecStart后添加【 -H tcp://0.0.0.0:2375 】
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
#执行命令使它生效
systemctl daemon-reload
service docker restart
#查看端口是否已经监听成功
netstat -nlp |grep 2375
在管理节点上查看所有节点信息
docker node ls
更改节点的availablity状态
swarm集群中node的availability状态可以为 active或者drain,其中:
active node可以接受来自manager节点的任务分派;
Pause: 集群中该Node不可以被指派新的Task,但是其他已经存在的Task保持运行
drain node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)
禁用管理节点部署服务,仅保留其管理节点的能力,避免业务服务影响管理节点
docker node update --availability drain [NODE_ID]
节点退出集群
docker swarm leave [-f] #加上-f就是强制退出
在管理节点上删除其他节点
docker node rm [节点ID]
给Node添加/删除标签元数据
例如:我们需要把基础服务和业务服务拆分到不同的机器上部署,可以对部署基础服务的机器打标签
base
docker node update --label-add deploy-module=base
删除节点上的标签
docker node update --label-rm deploy-module=base
bridge 桥接网络模式
- 为容器分配独立IP,具有很好的网络隔离性,服务不会跟宿主机上的服务发送端口冲突问题
- 主机和容器间通过桥接的方式进行通信
- 只能单机使用,不适合跨主机docker服务间通信
host 主机本地网络模式
- docker容器共享主机的ip、端口号等等网络资源,如果单机部署
- 只能单机使用,不适合跨主机docker服务间通信
- 这种网络模式效率最高
overlay 集群网络模式
- 多节点集群下统一分配服务独立ip
- 跨机器节点上的docker服务间能互相通信
- 支持主机节点和集群网络内的节点间互相通信
- 支持节点间加密通信 注:windows机器节点不支持加密通信
#创建自定义集群网络
docker network create -d overlay my-overlay
#创建可以与主机上其他docker服务通信的集群网络
docker network create -d overlay --attachable my-attachable-overlay
创建网络时,还可以指定ip地址范围、子网、网关等配置
#创建加密通信且可以与主机上其他docker服务通信的集群网络
docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
默认情况下,发布端口的群集服务会使用路由网格进行发布。当您连接到任何群集节点上的已发布端口时(无论它是否正在运行给定服务),您都将透明地重定向到正在运行该服务的工作器。实际上,Docker充当了集群服务的负载均衡器。使用路由网格的服务以虚拟IP(VIP)模式运行。甚至在每个节点上运行的服务(通过
--mode global
标志)也使用路由网格。使用路由网格时,无法保证客户端请求哪些Docker节点服务。要绕过路由网格,可以通过将标志设置为来使用DNS循环(DNSRR)模式启动服务。您必须在服务之前运行自己的负载平衡器。在Docker主机上对服务名称进行DNS查询会返回运行该服务的节点的IP地址列表。配置您的负载平衡器以使用此列表并平衡节点之间的流量。
--endpoint-mode``dnsrr
macvlan 容器网络本地化模式
- 允许直接访问容器内的ip进行通信
- 需要宿主机网络开启混杂模式
- 支持主机节点和集群网络内的节点间互相通信
- 性能高,不需要网络桥接转发数据包,与网卡直连
注意: 以下所有命令都需要在管理节点上运行,工作节点不参与管理
创建服务
docker service create --replicas 2 --network my-attachable-overlay --name nginx --publish published=80,target=80 nginx
该nginx服务使用上面创建的overlay网络模式,且部署2个实例
服务实例数的动态伸缩
docker service scale [SERVICE_NAME]=3
#或者
docker service update --replicas=3 frontend
服务版本发布
docker service update --force --update-parallelism 1 --update-delay 15s --image linuxserver/nginx nginx
服务版本回滚
docker service update --rollback nginx
#或者
docker service rollback nginx
指定分区部署服务和均匀分布服务到某些节点
#指定带某标签的节点部署
docker service update --constraint node.labels.type==base nginx #把nginx部署在基础服务节点上
#指定优先某分区节点部署
docker service update --placement-pref 'spread=node.labels.type' nginx #指定nginx需要均匀的分布在所有base节点上
指定服务网络模式
docker service update --network-add my-attachable-overlay nginx
移除服务网络模式
docker service update --network-rm my-attachable-overlay nginx
查看服务日志
docker service logs nginx --tail 111 -f
查看所有服务
docker service ls
查看某服务下的任务状态
docker service ps nginx
删除服务
docker service rm [SERVICE_NAME]
mkdir -p /data/workspace/service/portainer/data
mkdir -p /data/workspace/service/portainer/public
wget http://www.danyuanblog.com/file-gateway/mediaDownload.do?mediaId=5ec04f7b4c63637cd6ab5763 #下载汉化包
unzip public.zip #解压汉化包
mv public/* /data/workspace/service/portainer/public/ #移动汉化内容到需要挂载的资源目录下
docker run -d --restart always --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /data/workspace/service/portainer/data:/data -v /data/workspace/service/portainer/public:/public portainer/portainer
访问地址:http://192.168.56.22:9000
打开web后台
初次进入设置管理员登录密码,然后登录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9qmRgfE-1589663881385)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589662278830069192.png)]
进入后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRXPFtYp-1589663881401)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589662351411086467.png)]
添加节点到protainer中
点击菜单: 端点 --> 添加端点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qbPJOXAj-1589663881405)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589662572103078013.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drhNSewL-1589663881410)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589662488794083232.png)]
管理节点
进入某个管理节点: 首页 --> 点击某个管理节点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5r6oaHv-1589663881415)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589662865359066177.png)]
点击 Swarm菜单,进入到swarm集群节点管理界面,点击进入修改某个节点的状态、标签等信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtGbsoDb-1589663881419)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589663053513004207.png)]
查看/管理某个节点上容器列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9H1PcR9z-1589663881421)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589663109079010474.png)]
查看/管理某个节点上服务列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1L9NYhLv-1589663881422)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589663166578030115.png)]
管理服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LdccMUwp-1589663881424)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589663468555098274.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xx2RLOeT-1589663881427)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589663280960054683.png)]
服务编排管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvmajQu6-1589663881428)(http://www.danyuanblog.com/file-gateway//ueditor/jsp/upload/image/20200517/1589663533391011978.png)]