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 node3node2免密登录node1 node3
[root@node1 ~]# ssh-keygen -t rsa [root@node1 ~]# ssh-copy-id -i node1 [root@node1 ~]# ssh-copy-id -i node3node3免密登录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 --helpinit 初始化一个集群 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访问节点