Docker Docker 容器化平台 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     Docker 安裝和Portainer GUI 管理工具 運行環境 PVE LXC Debian12 安裝Docker apt update apt -y install ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt update apt -y install docker-ce docker-ce-cli containerd.io 2025/11/24安裝時,發現containerd.io會導致 permission denied: open sysctl net.ipv4.ip_unprivileged_port_start 錯誤 可以安裝1.7.28-1 containerd.io避免,後續等待containerd.io修正更新 apt install containerd.io=1.7.28-1~debian.12~bookworm docker-ce docker-ce-cli systemctl start docker systemctl enable docker 安裝docker-compose curl -L https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64 > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose version 安裝portainer 中文版portainer下載 docker pull outlovecn/portainer-cn docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce:latest 瀏覽器輸入 http://ip:9000/ 進入管理頁面 Docker 架設Vaultwarden密碼管理工具 Vaultwarden是以Bitwarden為原型、用Rust語言重新改寫的版本,比原始的Bitwarden更加輕量化 安裝Vaultwarden docker pull vaultwarden/server cd /var/lib/docker/volumes mkdir vaultwarden cd vaultwarden 建立docker-compose.yml version: '3' services: app: image: 'vaultwarden/server:latest' container_name: vaultwarden restart: always volumes: - ./vw-data/:/data/ environment: - ADMIN_TOKEN=1qaxxwsx3xx ports: - 80:80 - 443:443 docker compose up -d 管理介面 Vaultwarden強制使用SSL才能使用,Docker啟動後先進入admin頁面修改網域  http://ip/admin Admin Token為上方docker-compose.yml的token 修改網域 修改ADMIN TOKEN Nginx 反向代理設定 server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/xxx.com/privkey.pem; root /var/www/html; index index.php; server_name xxx.com; server_tokens off; location /vaultwarden/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://ip/; }   瀏覽器輸入 https://xxx.com/vaultwarden/ Docker 部屬 OpenObserve 日誌數據管理平台 OpenObserve是一個雲端原生可觀測性平台,專為日誌、指標、追蹤、分析、前端監控等應用而建置。您可以從一個可擴展至 TB 級的二進位檔案開始,也可以部署在高可用性模式下,以應對 PB 級的工作負載 安裝Portainer 本次安裝使用Portainer部屬,可以先安裝 Portainer 工具 安裝OpenObserve 建立掛載目錄 /var/lib/docker/volumes/openobserve , 於Portainer內新增堆棧部屬 services: openobserve: image: public.ecr.aws/zinclabs/openobserve:latest container_name: openobserve restart: always ports: - "5080:5080" environment: - ZO_ROOT_USER_EMAIL=root@example.com - ZO_ROOT_USER_PASSWORD=Complexpass#123 - TZ=Asia/Taipei volumes: - /var/lib/docker/volumes/openobserve/data:/data 瀏覽器輸入 ip:5080 ,輸入部屬的預設帳號密碼即可登入   使用 AxoSyslog 傳送日誌 AxoSyslog 是一個二進位相容的 syslog-ng 替代產品,由原作者的同一團隊開發。 相同的架構、相同的設定檔、相同的路徑。雲端原生鏡像、快速發布、現代可觀測性(OTel、K8s、Windows)和強大的資料處理能力 安裝 替換sources.list component以符合你的系統 Distribution sources.list component Debian 12 (x86-64) debian-bookworm Debian 11 (x86-64) debian-bullseye Debian Unstable (x86-64) debian-sid Debian Testing (x86-64) debian-testing Ubuntu 25.04 (x86-64) ubuntu-plucky Ubuntu 24.10 (x86-64) ubuntu-oracular Ubuntu 24.04 (x86-64) ubuntu-noble Ubuntu 23.10 (x86-64) ubuntu-mantic Ubuntu 23.04 (x86-64) ubuntu-lunar Ubuntu 22.04 (x86-64) ubuntu-jammy Ubuntu 20.04 (x86-64) ubuntu-focal   wget -qO - https://pkg.axoflow.io/axoflow-code-signing-pub.asc | gpg --dearmor > /usr/share/keyrings/axoflow-code-signing-pub.gpg echo "deb [signed-by=/usr/share/keyrings/axoflow-code-signing-pub.gpg] https://pkg.axoflow.io/apt stable debian-bookworm" | tee --append /etc/apt/sources.list.d/axoflow.list apt update apt install axosyslog   OpenObserve 數據源找到Syslog-Ng設定,新增到 /etc/syslog-ng/syslog-ng.conf systemctl restart syslog-ng.service 可以看到接收日誌 Docker 部屬 Homer 服務面板 Homer是一個靜態頁面,使用 yaml 設定檔來管理你的服務入口 部屬 Homer 本例使用Portainer部屬,可以先裝 Portainer Docker內新增掛載目錄 mkdir /var/lib/docker/volumes/homer/assets 容器預設使用使用者 uid 和 gid 1000 運行,設定目錄權限相符 chown -R 1000:1000 /var/lib/docker/volumes/homer/assets Portainer內新增堆棧並啟動 services: homer: image: b4bz/homer:latest container_name: homer volumes: - /var/lib/docker/volumes/homer/assets:/www/assets # Make sure your local config directory exists ports: - 9003:8080 environment: - INIT_ASSETS=1 # default, requires the config directory to be writable for the container user (see user option) restart: always 將 assets 內的 config.yml.dist 複製為 config.yml cd /var/lib/docker/volumes/homer/assets cp config.yml.dist config.yml 編輯 config.yml 自訂你的面板,以下只使用最簡單的頁面設定,其餘整合功能可以參考官方 https://github.com/bastienwirtz/homer services: - name: "HomeLab" icon: "fa-solid fa-brain" class: "highlight-purple" items: - name: "Proxmox - Lab" logo: "assets/icons/custom/proxmox.png" url: "https://192.168.18.248:8006/" - name: "Proxmox - Home" logo: "assets/icons/custom/proxmox.png" url: "https://192.168.22.254:8006/" - name: "Proxmox Backup Server" logo: "assets/icons/custom/proxmox.png" url: "https://192.168.74.244:8007/" - name: "Librenms" logo: "assets/icons/custom/librenms.png" url: "http://172.20.10.1:8000" - name: "SmokePing" logo: "assets/icons/custom/smokePing.png" url: "http://192.168.45.246/smokeping/" - name: "Portainer" logo: "assets/icons/custom/portainer.png" url: "http://192.168.155.245/" 輸入 IP:9003 就可以顯示你的Homer面板 Docker 部屬 AdGuard Home 廣告攔截 AdGuard Home 是一款全網廣告攔截與追蹤軟體。設定完成後,它將覆蓋您家中的所有設備,無需任何客戶端軟體   部屬 AdGuard Home 本例使用Portainer部屬,可以先裝 Portainer Docker內新增掛載目錄 mkdir /var/lib/docker/volumes/adguardhome Portainer內新增堆棧並啟動 services: adguardhome: image: adguard/adguardhome container_name: adguardhome restart: unless-stopped volumes: - /var/lib/docker/volumes/adguardhome:/opt/adguardhome/work - /var/lib/docker/volumes/adguardhome:/opt/adguardhome/conf ports: - "53:53/tcp" - "53:53/udp" - "9004:80/tcp" - "3000:3000/tcp"    AdGuard Home有提供多種服務,這裡我只需要 dns 53 port 和 管理介面 port 80 和 初始化安裝 port 3000 Port 協定 用途 53 TCP/UDP 主要 DNS 67/68 UDP DHCP server 80 TCP 初始 Web UI 3000 TCP 初始設定 Wizard 443 TCP/UDP HTTPS DNS / DoH 853 TCP DoT (DNS over TLS) 784 / 8853 UDP DoQ (DNS over QUIC) 5443 TCP/UDP 加強加密 Web UI / API 設定  AdGuard Home 進入 IP:3000 初始化安裝後,登入 IP:9004 管理介面 設定>DNS設定 上游DNS伺服器新增,並選擇並行請求加快解析 8.8.8.8 168.95.1.1 https://dns.cloudflare.com/dns-query DNS更改為你部屬的IP,瀏覽網頁後就會開始過濾和封鎖廣告