Docker三劍客之Docker Swarm
共 7876字,需瀏覽 16分鐘
·
2024-05-16 19:55
一、環(huán)境
docker安裝:
sudo apt install docker.io
主機(jī)分配:
| 操作系統(tǒng) | 主機(jī)名 | 主機(jī)IP | docker版本 |
| debian 12 (bookworm) | fs3(管理節(jié)點(diǎn)) | 192.168.1.95 | v20.10.24 |
| debian 12 (bookworm) | fs1(工作節(jié)點(diǎn)) | 192.168.1.91 | v20.10.24 |
| debian 12 (bookworm) | fs0(工作節(jié)點(diǎn)) | 192.168.1.92 | v20.10.24 |
開(kāi)放端口:
2377/tcp:集群管理通信
7946/tcp、7946/udp:集群中各節(jié)點(diǎn)之間的通信
4789/udp:overlay網(wǎng)絡(luò)使用
二、創(chuàng)建集群
2.1 創(chuàng)建管理節(jié)點(diǎn)
在管理節(jié)點(diǎn)fs3上創(chuàng)建集群,使用命令如下:
sudo docker swarm init --advertise-addr 192.168.1.95
其中--advertise-addr用于配置一個(gè)IP地址,集群中其它節(jié)點(diǎn)使用此IP地址與管理節(jié)點(diǎn)通信,執(zhí)行命令后輸出如下:
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:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2.2 將工作節(jié)點(diǎn)加入集群
分別在fs1和fs0工作節(jié)點(diǎn)上執(zhí)行下列指令:
sudo docker swarm join --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
如果要加入管理節(jié)點(diǎn),則使用下列指令:
sudo docker swarm join-token manager --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
注意:該token有效期為24小時(shí)。如果token已過(guò)期,則可以使用一下命令重新獲?。?/p>
docker swarm join-token worker
可使用docker info 查看當(dāng)前集群的詳細(xì)信息
使用docker node ls 查看當(dāng)前集群中各節(jié)點(diǎn)信息:
其中*表示當(dāng)前位于此節(jié)點(diǎn)。
2.3 集群網(wǎng)絡(luò)
當(dāng)在管理節(jié)點(diǎn)使用docker swarm init初始化一個(gè)docker集群時(shí),docker默認(rèn)會(huì)創(chuàng)建兩個(gè)網(wǎng)絡(luò):
overlay驅(qū)動(dòng)的網(wǎng)絡(luò):名稱為ingress,該網(wǎng)絡(luò)用于處理集群中各個(gè)服務(wù)之間的控制與數(shù)據(jù)傳輸(當(dāng)創(chuàng)建網(wǎng)絡(luò)服務(wù)service時(shí),如果沒(méi)有指定自定義的overlay網(wǎng)絡(luò),則默認(rèn)使用ingress網(wǎng)絡(luò))。
bridge驅(qū)動(dòng)的網(wǎng)絡(luò):名稱為docker_gwbridge,該網(wǎng)絡(luò)用于維護(hù)集群中各個(gè)節(jié)點(diǎn)之間的連接。
可以使用docker network ls查看集群網(wǎng)絡(luò)
三、集群管理可視化
集群搭建好之后,我們使用portainer實(shí)現(xiàn)docker可視化管理界面。
portainer分兩種部署模式:?jiǎn)螜C(jī)部署和集群部署
3.1 單機(jī)部署
我們可以將portainer部署在docker集群的管理節(jié)點(diǎn)中。此時(shí),portainer可以通過(guò)管理節(jié)點(diǎn)的docker進(jìn)程實(shí)現(xiàn)對(duì)docker集群的可視化。具體步驟為:
#在管理節(jié)點(diǎn)拉去portainer鏡像docker pull portainer/portainer-ce:latest#啟動(dòng)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權(quán)限
當(dāng)然也可以嘗試使用docker-compose編排一個(gè)容器。這里不再贅述。
在瀏覽器中輸入https://192.168.1.2:9443,進(jìn)入portainer環(huán)境創(chuàng)建頁(yè)面。
3.2 集群部署
在管理節(jié)點(diǎn)下載部署文件
curl -L https://downloads.portainer.io/ce2-19/portainer-agent-stack.yml -o portainer-agent-stack.yml
文件內(nèi)容如下:
version: '3.2'services:agent:image: portainer/agent:2.19.4volumes:/var/run/docker.sock:/var/run/docker.sock/var/lib/docker/volumes:/var/lib/docker/volumesnetworks:agent_networkdeploy:mode: globalplacement:constraints: [node.platform.os == linux]portainer:image: portainer/portainer-ce:2.19.4command: -H tcp://tasks.agent:9001 --tlsskipverifyports:"9443:9443""9000:9000""8000:8000"volumes:portainer_data:/datanetworks:agent_networkdeploy:mode: replicatedreplicas: 1placement:constraints: [node.role == manager]networks:agent_network:driver: overlayattachable: truevolumes:portainer_data:
此時(shí)需要對(duì)agent部分增加一個(gè)端口掛載配置,否則后面創(chuàng)建環(huán)境時(shí)會(huì)因?yàn)檫B接失敗導(dǎo)致無(wú)法創(chuàng)建環(huán)境:
version: '3.2'services:agent:image: portainer/agent:2.19.4volumes:/var/run/docker.sock:/var/run/docker.sock/var/lib/docker/volumes:/var/lib/docker/volumesports:"9001:9001"networks:agent_networkdeploy:mode: globalplacement:constraints: [node.platform.os == linux]portainer:image: portainer/portainer-ce:2.19.4command: -H tcp://tasks.agent:9001 --tlsskipverifyports:"9443:9443""9000:9000""8000:8000"volumes:portainer_data:/datanetworks:agent_networkdeploy:mode: replicatedreplicas: 1placement:constraints: [node.role == manager]networks:agent_network:driver: overlayattachable: truevolumes:portainer_data:
在管理節(jié)點(diǎn)部署portainer集群
docker stack deploy -c portainer-agent-stack.yml portainer
可以看到創(chuàng)建了一個(gè)網(wǎng)絡(luò)和兩個(gè)服務(wù)器:
portainer_agent_network
portainer_agent
portainer_portainer
在集群中任意節(jié)點(diǎn)查看網(wǎng)絡(luò),可以看到所有節(jié)點(diǎn)上都創(chuàng)建了一個(gè)overlay驅(qū)動(dòng)的網(wǎng)絡(luò)portainer_agent_network。也就是在集群的各個(gè)節(jié)點(diǎn)創(chuàng)建該網(wǎng)絡(luò)portainer_agent_network。
在管理節(jié)點(diǎn)查看服務(wù)
docker service ls
在管理節(jié)點(diǎn)查看容器
docker ps
在工作節(jié)點(diǎn)查看容器
注意:
與管理節(jié)點(diǎn)不同的是,工作簡(jiǎn)單值創(chuàng)建了portainer/agent容器,它是由管理節(jié)點(diǎn)在集群中創(chuàng)建的副本容器。
在瀏覽器中輸入https://192.168.1.95:9443,進(jìn)入portainer界面
與單機(jī)部署模式不同的是,在選擇環(huán)境類型時(shí),我們應(yīng)該選擇集群模式。即,勾選Docker Swarm 選項(xiàng)卡:
然后選擇agent方式配置環(huán)境連接。當(dāng)然默認(rèn)情況,系統(tǒng)默認(rèn)創(chuàng)建一個(gè)portainer集群環(huán)境:
進(jìn)入該環(huán)境查看詳細(xì)信息
進(jìn)入集群頁(yè)面,可以看到我們?cè)诠芾砉?jié)點(diǎn)上部署的portainer容器根據(jù)服務(wù)的副本配置,在工作節(jié)點(diǎn)上也建立了相同的portainer容器副本。
3.3 portainer密碼重置
查看portainer是否正常遠(yuǎn)行:
docker ps
停止docker容器:
docker stop 5ca33ade99b4
查看portainer容器掛載信息:
docker inspect 5ca33ade99b4
找到容器掛載路徑
進(jìn)入到該路徑下查看內(nèi)容:
執(zhí)行下列命令,重置管理員密碼:
docker run --rm -v /var/lib/docker/volumes/portainer_data/_data:/data portainer/helper-reset-password
啟動(dòng)docker后,使用上圖輸出密碼即可正常登錄portainer管理界面。
四、部署容器集群
以創(chuàng)建busybox鏡像容器為例,創(chuàng)建docker容器集群
4.1 拉去鏡像
在管理節(jié)點(diǎn)中使用命令拉拉取鏡像。
docker pull busybox
4.2創(chuàng)建網(wǎng)絡(luò)
在管理節(jié)點(diǎn)創(chuàng)建一個(gè)overlay驅(qū)動(dòng)的網(wǎng)絡(luò)。
docker network create -d overlay --attachable busybox_overlay_network
注意:
在集群環(huán)境創(chuàng)建overlay驅(qū)動(dòng)網(wǎng)絡(luò)時(shí),一定要帶參數(shù) --attachable,方便集群容器或單機(jī)容器與運(yùn)行在其它節(jié)點(diǎn)中的容器建立通信。
4.3 創(chuàng)建服務(wù)器
在管理節(jié)點(diǎn)中創(chuàng)建服務(wù)
docker service create -td --name busybox_service --network busybox_overlay_network --replicas=2 busybox
--replicas=2表示需要?jiǎng)?chuàng)建兩個(gè)busybox容器的副本。
--network busybox_overlay_network表示使用我們?cè)谏厦鎰?chuàng)建的網(wǎng)絡(luò)。
4.4 進(jìn)入portainer查看busybox集群
在容器列表頁(yè)面可以看到busybox容器集群??梢钥吹絻蓚€(gè)busybox容器分別位于dedian-fs0和debian-fs1節(jié)點(diǎn),IP地址分別為10.0.2.3和10.0.2.4。
4.5 不同節(jié)點(diǎn)間容器通信
對(duì)應(yīng)busybox容器集群的情況如下
| 主機(jī) | 容器IP地址 |
| debian-fs0 | 10.0.2.4 |
| debian-fs1 | 10.0.2.3 |
進(jìn)入到debian-fs0主機(jī)的busybox容器,ping位于debian-fs1主機(jī)中的busybox容器,可以ping通,反之相同。
4.6 集群擴(kuò)展
前面在創(chuàng)建busybox容器集群是,設(shè)置其副本數(shù)量為2 --replicas=2,現(xiàn)在通過(guò)portainer將副本數(shù)量修改為3。
五、集群之負(fù)載均衡
5.1 無(wú)狀態(tài)服務(wù)負(fù)載均衡
以nginx為例,實(shí)現(xiàn)無(wú)狀態(tài)服務(wù)負(fù)載均衡。
拉取nginx鏡像
docker pull nginx
被nginx服務(wù)創(chuàng)建overlay驅(qū)動(dòng)的網(wǎng)絡(luò)
docker network create -d overlay --attachable nginx_overlay_network
創(chuàng)建服務(wù)
docker service create -td --name nginx_service --network nginx_overlay_network --replicas=3 -p 8080:80 nginx
執(zhí)行命令后等3分鐘,再進(jìn)portainer查看,發(fā)現(xiàn)nginx服務(wù)中三個(gè)節(jié)點(diǎn)已經(jīng)處于runing狀態(tài)。
查看三臺(tái)主機(jī)節(jié)點(diǎn)的nginx服務(wù)默認(rèn)發(fā)布頁(yè)面
驗(yàn)證負(fù)載均衡功能
分別修改節(jié)點(diǎn)中的index.html頁(yè)面方便區(qū)分來(lái)自不同容器的響應(yīng)。
echo "server 192.168.1.95" > index.html
在物理機(jī)上驗(yàn)證負(fù)載均衡功能
鏈接:https://www.cnblogs.com/zhongqifeng/p/18108887
(版權(quán)歸原作者所有,侵刪)
