Docker三剑客之Docker Swarm

共 7876字,需浏览 16分钟

 ·

2024-05-16 19:55



 


一、环境


docker安装:







sudo apt install docker.io


主机分配:





























操作系统 主机名 主机IP docker版本
debian 12 (bookworm) fs3(管理节点) 192.168.1.95 v20.10.24
debian 12 (bookworm) fs1(工作节点) 192.168.1.91 v20.10.24
debian 12 (bookworm) fs0(工作节点) 192.168.1.92 v20.10.24

开放端口:


2377/tcp:集群管理通信


7946/tcp、7946/udp:集群中各节点之间的通信


4789/udp:overlay网络使用


二、创建集群


2.1 创建管理节点


在管理节点fs3上创建集群,使用命令如下:







sudo docker swarm init --advertise-addr 192.168.1.95


其中--advertise-addr用于配置一个IP地址,集群中其它节点使用此IP地址与管理节点通信,执行命令后输出如下:













# 输出Swarm initialized: current node (vjs13uolge09ts9xpzm3tx09p) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.




 2.2 将工作节点加入集群


分别在fs1和fs0工作节点上执行下列指令:






sudo docker swarm join --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377



如果要加入管理节点,则使用下列指令:






sudo docker swarm join-token manager --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377



 注意:该token有效期为24小时。如果token已过期,则可以使用一下命令重新获取:


docker swarm join-token worker

 可使用docker info 查看当前集群的详细信息



 使用docker node ls 查看当前集群中各节点信息:



 其中*表示当前位于此节点。


 2.3 集群网络


当在管理节点使用docker swarm init初始化一个docker集群时,docker默认会创建两个网络:



  • overlay驱动的网络:名称为ingress,该网络用于处理集群中各个服务之间的控制与数据传输(当创建网络服务service时,如果没有指定自定义的overlay网络,则默认使用ingress网络)。


  • bridge驱动的网络:名称为docker_gwbridge,该网络用于维护集群中各个节点之间的连接。



可以使用docker network ls查看集群网络


 


三、集群管理可视化


 集群搭建好之后,我们使用portainer实现docker可视化管理界面。


portainer分两种部署模式:单机部署和集群部署


3.1 单机部署


我们可以将portainer部署在docker集群的管理节点中。此时,portainer可以通过管理节点的docker进程实现对docker集群的可视化。具体步骤为:

























#在管理节点拉去portainer镜像docker pull portainer/portainer-ce:latest
#启动portainer容器
docker run \ -p 8000:8000 \ -p 9443:9443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ --name my-portainer \ -d \ --privileged=true \ --restart=always \ portainer/portainer-ce:latest
# --privileged=true用于赋予该容器root权限




当然也可以尝试使用docker-compose编排一个容器。这里不再赘述。


在浏览器中输入https://192.168.1.2:9443,进入portainer环境创建页面。


3.2 集群部署



  • 在管理节点下载部署文件







curl -L https://downloads.portainer.io/ce2-19/portainer-agent-stack.yml -o portainer-agent-stack.yml


文件内容如下:











































version: '3.2'
services: agent: image: portainer/agent:2.19.4 volumes: - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes networks: - agent_network deploy: mode: global placement: constraints: [node.platform.os == linux]
portainer: image: portainer/portainer-ce:2.19.4 command: -H tcp://tasks.agent:9001 --tlsskipverify ports: - "9443:9443" - "9000:9000" - "8000:8000" volumes: - portainer_data:/data networks: - agent_network deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager]
networks: agent_network: driver: overlay attachable: true
volumes: portainer_data:





此时需要对agent部分增加一个端口挂载配置,否则后面创建环境时会因为连接失败导致无法创建环境:
















































version: '3.2'
services: agent: image: portainer/agent:2.19.4 volumes: - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes ports: - "9001:9001" networks: - agent_network deploy: mode: global placement: constraints: [node.platform.os == linux]
portainer: image: portainer/portainer-ce:2.19.4 command: -H tcp://tasks.agent:9001 --tlsskipverify ports: - "9443:9443" - "9000:9000" - "8000:8000" volumes: - portainer_data:/data networks: - agent_network deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager]
networks: agent_network: driver: overlay attachable: true
volumes: portainer_data:






  •  在管理节点部署portainer集群







docker stack deploy -c portainer-agent-stack.yml portainer



 可以看到创建了一个网络和两个服务器:



  1. portainer_agent_network


  2. portainer_agent


  3. portainer_portainer



 在集群中任意节点查看网络,可以看到所有节点上都创建了一个overlay驱动的网络portainer_agent_network。也就是在集群的各个节点创建该网络portainer_agent_network。




  •  在管理节点查看服务



docker service ls



  •  在管理节点查看容器



docker ps



  •  在工作节点查看容器




 注意:


  与管理节点不同的是,工作简单值创建了portainer/agent容器,它是由管理节点在集群中创建的副本容器。



  • 在浏览器中输入https://192.168.1.95:9443,进入portainer界面




 与单机部署模式不同的是,在选择环境类型时,我们应该选择集群模式。即,勾选Docker Swarm 选项卡:



 然后选择agent方式配置环境连接。当然默认情况,系统默认创建一个portainer集群环境:




  •  进入该环境查看详细信息





  •  进入集群页面,可以看到我们在管理节点上部署的portainer容器根据服务的副本配置,在工作节点上也建立了相同的portainer容器副本。



 



 


3.3 portainer密码重置


查看portainer是否正常远行:


docker ps


 停止docker容器:


docker stop 5ca33ade99b4


 查看portainer容器挂载信息:


docker inspect 5ca33ade99b4

找到容器挂载路径



 进入到该路径下查看内容:



 执行下列命令,重置管理员密码:






docker run --rm -v /var/lib/docker/volumes/portainer_data/_data:/data portainer/helper-reset-password




 启动docker后,使用上图输出密码即可正常登录portainer管理界面。



 


四、部署容器集群


以创建busybox镜像容器为例,创建docker容器集群


 4.1 拉去镜像


在管理节点中使用命令拉拉取镜像。


docker pull busybox

4.2创建网络


在管理节点创建一个overlay驱动的网络。


docker network create -d overlay --attachable busybox_overlay_network

注意:


   在集群环境创建overlay驱动网络时,一定要带参数 --attachable,方便集群容器或单机容器与运行在其它节点中的容器建立通信。


4.3 创建服务器


在管理节点中创建服务


docker service create -td --name busybox_service --network busybox_overlay_network --replicas=2 busybox


  • --replicas=2表示需要创建两个busybox容器的副本。


  • --network busybox_overlay_network表示使用我们在上面创建的网络。



 4.4 进入portainer查看busybox集群



 在容器列表页面可以看到busybox容器集群。可以看到两个busybox容器分别位于dedian-fs0和debian-fs1节点,IP地址分别为10.0.2.3和10.0.2.4。


 


 4.5 不同节点间容器通信


对应busybox容器集群的情况如下

















主机 容器IP地址
debian-fs0 10.0.2.4
debian-fs1 10.0.2.3

 进入到debian-fs0主机的busybox容器,ping位于debian-fs1主机中的busybox容器,可以ping通,反之相同。



 4.6 集群扩展


前面在创建busybox容器集群是,设置其副本数量为2 --replicas=2,现在通过portainer将副本数量修改为3。



 五、集群之负载均衡


5.1 无状态服务负载均衡


以nginx为例,实现无状态服务负载均衡。



  • 拉取nginx镜像



docker pull nginx


  • 被nginx服务创建overlay驱动的网络



docker network create -d overlay --attachable nginx_overlay_network


  • 创建服务



docker service create -td --name nginx_service --network nginx_overlay_network --replicas=3 -p 8080:80 nginx

执行命令后等3分钟,再进portainer查看,发现nginx服务中三个节点已经处于runing状态。




  •  查看三台主机节点的nginx服务默认发布页面



 



 


 



  •  验证负载均衡功能



分别修改节点中的index.html页面方便区分来自不同容器的响应。







echo "server 192.168.1.95" > index.html


在物理机上验证负载均衡功能


链接:https://www.cnblogs.com/zhongqifeng/p/18108887


(版权归原作者所有,侵删)





浏览 147
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报