Docker Swarm 叢集 LXC Docker Swarm 叢集架設 Docker Swarm Mode 是 Docker Engine 內建的容器編排(Container Orchestration)工具。簡單來說,它允許你將多台安裝了 Docker 的主機整合在一起,形成一個「集群」(Cluster),並將這個集群視為單一的虛擬 Docker 主機來管理。 這讓開發者從管理「單一容器」進階到管理「服務(Service)」,實現高可用性與負載平衡。 運行環境 這裡使用PVE的LXC 三台主機做設定,建立特權LXC 並且功能勾選巢狀(nesting) 確認三台主機都安裝 Docker 一台為managers 二台workers managers 10.0.0.150 workers-1 10.0.0.151 workers-2 10.0.0.152 初始化Swarm 在managers主機執行初始化設定, --advertise-addr 輸入你的對外IP --default-addr-pool 如果不設定,Swarm 預設使用 10.0.0.0/8 這個超大範圍的私有網段來分配 IP 給 Overlay 網路 跟本次測試主機網路衝突故手動指定 docker swarm init --advertise-addr 10.0.0.150 --default-addr-pool 10.20.0.0/16 初始化設定後會出現token,在其他workers主機加入此token docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx 10.0.0.150:2377 加入後可以看到所有節點 root@docker-1:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION x46rx0e108vhrxe354xom40w8 * docker-1 Ready Active Leader 29.0.2 j96spq2xa7lx7oaw0qfhdava3 docker-2 Ready Active 29.0.2 v7flruyfi6glooxdasvx3a9n0 docker-3 Ready Active 29.0.2 由於在LXC內建立的Overlay網路會有不轉發問題,須將 ingress 網路開啟轉發 nsenter --net=/run/docker/netns/ingress_sbox sysctl -w net.ipv4.ip_forward=1   可以使用GitHub dcwestra 製作的 DockerSwarmLXC 腳本,監控所有Docker網路並開啟轉發   部屬Portainer和Agent 使用Portainer來管理Swarm,每台主機都要安裝Agent來蒐集資訊,可以使用官方腳本來安裝 curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml 這邊Portainer使用中文版本,故修改 portainer-agent-stack.yml 設定 version: '3.2' services: agent: image: portainer/agent:lts 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: 6053537/portainer-ce:latest 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: docker stack deploy -c portainer-agent-stack.yml portainer 部屬後可以看到Portainer和Agent在執行 root@docker-1:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a157c104fdc 6053537/portainer-ce:latest "/portainer -H tcp:/…" About an hour ago Up About an hour 8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, [::]:9443->9443/tcp portainer_portainer.1.ofwefrgf28mgc9s78ulpm8l45 2b0713e79ea3 portainer/agent:lts "./agent" About an hour ago Up About an hour 0.0.0.0:9001->9001/tcp, [::]:9001->9001/tcp portainer_agent.x46rx0e108vhrxe354xom40w8.8pf2g1dy8gwsaq9tazf1vcr1r 網頁上輸入 https://ip:9443 登入Portainer可以看到Swram資訊 Docker Swarm 節點增減指令 加入Swarm 新增worker,在manager上輸入指令並在欲新增worker上貼入command docker swarm join-token worker root@docker-1:~# docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3pmzdoteij6znbf844068h9pukc-4rfw7oiyyihqx35eg3ncuzw29 10.0.0.150:2377 新增manager,在manager上輸入指令並在欲新增manager上貼入command docker swarm join-token manager   root@docker-1:~# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-3pmzdoteij6znbf8g120abdfjukc-cckot0r7ii8e3xu3b6bngxz26 10.0.0.150:2377   移除Swarm