# LXC Docker Swarm 叢集架設

[![image.png](https://note.homesitetw.com/uploads/images/gallery/2025-11/scaled-1680-/TLRimage.png)](https://note.homesitetw.com/uploads/images/gallery/2025-11/TLRimage.png)

<span style="color: rgb(0, 0, 0);">**Docker Swarm Mode 是 Docker Engine 內建的容器編排（Container Orchestration）工具。簡單來說，它允許你將多台安裝了 Docker 的主機整合在一起，形成一個「集群」（Cluster），並將這個集群視為單一的虛擬 Docker 主機來管理。**</span>

<span style="color: rgb(0, 0, 0);">**這讓開發者從管理「單一容器」進階到管理「服務（Service）」，實現高可用性與負載平衡。**</span>

---

##### <span style="color: rgb(0, 0, 0);">**運行環境**</span>  


<span style="color: rgb(0, 0, 0);">**這裡使用PVE的LXC 三台主機做設定，建立特權LXC 並且功能勾選巢狀(nesting)**</span>

<span style="color: rgb(0, 0, 0);">**確認三台主機都安裝[Docker](https://note.homesitetw.com/books/docker/page/docker-portainer-gui)**</span>

<span style="color: rgb(0, 0, 0);">**一台為managers 二台workers**</span>

<span style="color: rgb(0, 0, 0);">**managers 10.0.0.150**</span>

<span style="color: rgb(0, 0, 0);">**workers-1 10.0.0.151**</span>

<span style="color: rgb(0, 0, 0);">**workers-2 10.0.0.152**</span>

##### <span style="color: rgb(0, 0, 0);">**初始化Swarm**</span>

<span style="color: rgb(0, 0, 0);">**在managers主機執行初始化設定，`--advertise-addr`輸入你的對外IP**</span>

<span style="color: rgb(0, 0, 0);">**`--default-addr-pool`如果不設定，Swarm 預設使用 `10.0.0.0/8` 這個超大範圍的私有網段來分配 IP 給 Overlay 網路**</span>

<span style="color: #000000;">**跟本次測試主機網路衝突故手動指定**</span>

```
docker swarm init --advertise-addr 10.0.0.150 --default-addr-pool 10.20.0.0/16
```

<span style="color: rgb(0, 0, 0);">**初始化設定後會出現token，在其他workers主機加入此token**</span>

```
docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx 10.0.0.150:2377
```

<span style="color: rgb(0, 0, 0);">**加入後可以看到所有節點**</span>

```
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
```

<span style="color: rgb(0, 0, 0);">**由於在LXC內建立的Overlay網路會有不轉發問題，須將<span style="color: rgb(224, 62, 45);">ingress<span style="color: rgb(0, 0, 0);">網路開啟轉發</span></span>**</span>

```
nsenter --net=/run/docker/netns/ingress_sbox sysctl -w net.ipv4.ip_forward=1
```

<span style="color: rgb(0, 0, 0);">**可以使用GitHub <span class="author flex-self-stretch"><span dir="auto">dcwestra</span></span>製作的[DockerSwarmLXC](https://github.com/dcwestra/DockerSwarmLXC?tab=readme-ov-file)腳本，監控所有Docker網路並開啟轉發**</span>

##### <span style="color: rgb(0, 0, 0);">**部屬Portainer和Agent**</span>

<span style="color: rgb(0, 0, 0);">**使用Portainer來管理Swarm，每台主機都要安裝Agent來蒐集資訊，可以使用官方腳本來安裝**</span>

```
curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml
```

<span style="color: rgb(0, 0, 0);">**這邊Portainer使用中文版本，故修改`portainer-agent-stack.yml`設定**</span>

```
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
```

<span style="color: rgb(0, 0, 0);">**部屬後可以看到Portainer和Agent在執行**</span>

```
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
```

<span style="color: rgb(0, 0, 0);">**網頁上輸入`https://ip:9443`登入Portainer可以看到Swram資訊**</span>

[![image.png](https://note.homesitetw.com/uploads/images/gallery/2025-11/scaled-1680-/7u6image.png)](https://note.homesitetw.com/uploads/images/gallery/2025-11/7u6image.png)