Docker

Docker 容器化平台

Docker Swarm 叢集

Docker Swarm 叢集

LXC Docker Swarm 叢集架設

image.png

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資訊

image.png

Docker Swarm 叢集

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 管理工具

運行環境

安裝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

image.png

修改網域

image.png

修改ADMIN TOKEN

image.png

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 日誌數據管理平台

image.png

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,輸入部屬的預設帳號密碼即可登入

image.png

 

使用 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

image.png

systemctl restart syslog-ng.service 

可以看到接收日誌

image.png

Docker 部屬 Homer 服務面板

image.png

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面板

image.png

Docker 部屬 AdGuard Home 廣告攔截

image.pngAdGuard 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

image.png

image.png

DNS更改為你部屬的IP,瀏覽網頁後就會開始過濾和封鎖廣告

image.png