Docker
Docker 容器化平台
- Docker Swarm 叢集
- Docker 安裝和Portainer GUI 管理工具
- Docker 架設Vaultwarden密碼管理工具
- Docker 部屬 OpenObserve 日誌數據管理平台
- Docker 部屬 Homer 服務面板
- Docker 部屬 AdGuard Home 廣告攔截
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 製作的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,瀏覽網頁後就會開始過濾和封鎖廣告