swarm运行Docker Engine的多个主机组成的集群。
自从1.12版本 开始,集群管理和编排功能已经集成进 Docker Engine 当 Docker Engine 初始化了一个 swarm 或者加入到一个存在的 swarm 时,它就启动了 swarm mode。
没启动 swarm mode 时,docker 执行的是容器命令;运行 swarm mode 后,docker 增加了编排 service 的能力。
Docker 允许在同一个 docker 主机上既运行 swarm service,又运行单独的容器。
实践Docker swarm
实验环境
swarm-node1 192.168.64.10
swarm-node2 192.168.64.20
swarm-node3 192.168.64.30
修改hosts文件
解析每个主机的节点
[root@node1 ~]# vim /etc/hosts
并上传到node2和node3
[root@node1 ~]# scp /etc/hosts node2:/etc/
[root@node1 ~]# scp /etc/hosts node3:/etc/
关闭selinux并从启生效
[root@node1 ~]# vim /etc/selinux/config
[root@node1 ~]# reboot
这个命令可以返回selinux的状态
[root@node1 ~]# getenforce
生成密钥对
每台都要互通
node1免密登录node2 node3
[root@node1 ~]# ssh-keygen -t rsa
[root@node1 ~]# ssh-copy-id -i node2
[root@node1 ~]# ssh-copy-id -i node3
node2免密登录node1 node3
[root@node1 ~]# ssh-keygen -t rsa
[root@node1 ~]# ssh-copy-id -i node1
[root@node1 ~]# ssh-copy-id -i node3
node3免密登录node1 node2
[root@node1 ~]# ssh-keygen -t rsa
[root@node1 ~]# ssh-copy-id -i node1
[root@node1 ~]# ssh-copy-id -i node2
防火墙开放端口
2377远程执行命令的端口
[root@node1 ~]# firewall-cmd --add-port={2377,7946,4789}/tcp --permanent
[root@node1 ~]# firewall-cmd --add-port={7946,4789}/udp --permanent
[root@node1 ~]# firewall-cmd --reload
查看路由转发的状态
[root@node1 ~]# sysctl -a | grep ip_forward
部署一个私有仓库镜像
[root@node1 ~]# docker search registry
[root@node1 ~]# docker pull registry:2
做一个私有仓库
[root@node1 ~]# docker run -dit -p 5000:5000 --restart always -v /opt/data/registry:/var/lib/registry --name registry registry:2
测试:
[root@node1 ~]# curl node1:5000/v2/_catalog
把镜像打包
[root@node1 ~]# docker tag httpd:latest 192.168.64.10:5000/httpd
[root@node1 ~]# docker tag busybox:latest 192.168.64.10:5000/busybox
修改启动脚本
[root@node1 ~]# vim /usr/lib/systemd/system/docker.service
三台都从新加载并从启
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker
并上传到node2 node3上
[root@node1 ~]# scp /usr/lib/systemd/system/docker.service node2://usr/lib/systemd/system/docker.service
[root@node1 ~]# scp /usr/lib/systemd/system/docker.service node3://usr/lib/systemd/system/docker.service
把镜像上传到仓库并检查
[root@node1 ~]# docker push 192.168.64.10:5000/httpd:latest
[root@node1 ~]# docker push 192.168.64.10:5000/busybox:latest
[root@node1 ~]# curl node1:5000/v2/_catalog
下载一个镜像试试
[root@node2 ~]# docker pull 192.168.64.10:5000/httpd
部署swarm
帮助:
[root@node1 ~]# docker --help
init 初始化一个集群 adver发布一个地址
[root@node1 ~]# docker swarm init --advertise-addr 192.168.64.10
把node2 node3加入集群
[root@node2 ~]# docker swarm join --token SWMTKN-1-0fw2z76azpa3hw71bvavyiy662uff8ng83k935r6t4ui63bwhr-e3s6ujfr5s2n8f5321xbewxi4 192.168.64.10:2377
[root@node3 ~]# docker swarm join --token SWMTKN-1-0fw2z76azpa3hw71bvavyiy662uff8ng83k935r6t4ui63bwhr-e3s6ujfr5s2n8f5321xbewxi4 192.168.64.10:2377
提升
node1是leader可以管理每一个节点
[root@node1 ~]# docker node promote node2
降级
[root@node1 ~]# docker node demote node2
做一个可视化工具
[root@node1 ~]# docker search visualizer
[root@node1 ~]# docker pull dockersamples/visualizer
打个标签传到私有仓库里
[root@node1 ~]# docker tag dockersamples/visualizer:latest 192.168.64.10:5000/visualizer
[root@node1 ~]# docker push 192.168.64.10:5000/visualizer
启动可视化容器
[root@node1 ~]# docker run -dit -p 8888:8080 -e HOST=192.168.64.10 -e PORT=8080 -v /var/run/docker.sock 192.168.64.10:5000/visualizer:latest
访问8888端口
跑服务
帮助:
创建一个服务
[root@node1 ~]# docker service create --name web_server 192.168.64.10:5000/httpd
查看跑了多少服务
[root@node1 ~]# docker service ls
查看当前的任务
[root@node1 ~]# docker service ps web_server
扩展到五个任务三台节点随机跑
[root@node1 ~]# docker service scale web_server=5
减少任务
加几个就有几个
[root@node1 ~]# docker service scale web_server=3
去除工作节点 运行的任务会自动跑到别的节点
[root@node1 ~]# docker node update --availability drain node1
把node2关机
删掉某一个容器
[root@node3 ~]# docker rm -f web_server.1.sq1rydjabbdm8w7xevhlwqrf6
公布一个节点
[root@node3 ~]# docker service update --publish-add 8080:80 web_server
访问节点