搭建Docker-swarm

    技术2022-07-11  95

    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

    访问节点

    Processed: 0.011, SQL: 9