本教程將教您如何配置一個專業的、模組化的環境,您可以在 /opt/docker-stack/ 目錄下隨時安全地「插拔」任何新的 Docker 服務(如 Umami, Wiki.js, Grav...),而無需在 Docker 中暴露任何埠。
Markdown
# Ubuntu 22.04 實戰:Caddy (主機) + Docker Compose (應用)
本指南將教您如何配置一個「Caddy 主機反向代理」架構。
* **Caddy (在主機上):** 充當您伺服器上**唯一**的「大門」,處理所有 80/443 埠、SSL 證書和公開流量。
* **Docker Compose (在容器中):** 運行您所有的應用程式(例如 `whoami`, `grav` 等)。
* **Docker 網路:** 充當 Caddy 和 Docker 容器之間的「安全內部通道」。
**優點:**
* **極度安全:** 您的應用程式容器(如 `whoami`)**無需**向主機暴露任何埠(`ports:`),它們只存在於 Docker 內部網路上。
* **極度簡潔:** 您只需要在 Caddyfile 中添加一個 `reverse_proxy` 指令即可。
* **模組化:** 所有應用程式都封裝在 `/opt/docker-stack/` 下的各自目錄中,互不干擾。
---
## 零、(關鍵) 檢查您的「PHP 炸彈」是否已拆除
在我們開始之前,我們**必須** 100% 確保您**「共用」**的 `php8.4-fpm` 服務是**絕對穩定**的。
**請您務必確認,您已經完成了我們之前的「最終修復」:**
1. Typecho 的 `mbstring` 炸彈**已拆除** (`sudo apt install php8.4-mbstring` 和 `sudo phpenmod mbstring`)。
2. WordPress 的 `WP_MEMORY_LIMIT: 40M` 炸彈**已拆除** (已在 `wp-config.php` 中設為 `256M`)。
3. WordPress 的 `WP_CACHE` 炸彈**已拆除** (已在 `wp-config.php` 中設為 `false`)。
4. WordPress 的「核心損毀」炸彈**已拆除** (已重裝 `wp-admin` 和 `wp-includes`)。
5. `php8.4-fpm` 服務已重啟 (`sudo systemctl restart php8.4-fpm`)。
**只有在您所有的 PHP 站點 (WP, Typecho, Grav) 都 100% 穩定之後,才能繼續此教程。**
---
## 第一部分:創建 Caddy 和 Docker 之間的「橋樑」
我們需要創建一個 Docker 網路,讓 Caddy(主機)和 Docker 容器(內部)可以互相「看到」對方。
```bash
# 1. 創建一個名為 caddy_net 的 Docker 網路
# (bridge 是默認驅動,最穩定)
sudo docker network create caddy_net
# 2. (關鍵) 將您「主機」上運行的 Caddy 服務連接到這個網路上
#
# 首先,找到 Caddy 的進程 ID (PID)
CADDY_PID=$(pidof caddy)
# 然後,使用 caddy-docker-proxy (一個巧妙的工具)
# 將主機進程的網路命名空間「嫁接」到 Docker 網路上
#
# (安裝依賴)
sudo apt update
sudo apt install -y curl
# (下載並運行嫁接工具)
# 這不是一個後台服務,這是一個一次性命令
curl -s [https://raw.githubusercontent.com/lucaslorentz/caddy-docker-proxy/master/caddy-docker-proxy.sh](https://raw.githubusercontent.com/lucaslorentz/caddy-docker-proxy/master/caddy-docker-proxy.sh) | sudo bash -s -- attach-network --caddy-pid $CADDY_PID --network caddy_net
這一步是「魔法」的關鍵。 它允許您主機上的 Caddy 直接通過「容器名稱」訪問 Docker 容器。
(注意: 如果 Caddy 服務重啟,您可能需要重新運行 attach-network 命令。專業的部署會將此腳本放入 Caddy 的 systemd 啟動後腳本中。)
第二部分:在 Docker 中部署一個「測試應用」(Whoami)
現在,我們在您指定的目錄中,部署一個不暴露任何埠的測試服務。
- 創建項目目錄:Bash
# 這是您的「Docker 棧」根目錄 sudo mkdir -p /opt/docker-stack/ # 這是我們第一個應用的目錄 sudo mkdir -p /opt/docker-stack/whoami cd /opt/docker-stack/whoami - 創建
docker-compose.yml檔案:Bashsudo nano docker-compose.yml - 貼入以下內容:YAML
version: '3.8' services: # 服務名稱,這將是 Caddy 訪問它的「主機名」 whoami_app: image: traefik/whoami container_name: whoami_service restart: unless-stopped # (關鍵) 這裡 *沒有* 'ports:' 區塊! # 它只連接到我們的內部網路 networks: - default networks: default: # 告訴 Compose,'default' 網路就是我們之前創建的 'caddy_net' external: true name: caddy_net- 保存並退出 (
Ctrl+X,Y,Enter)。
- 保存並退出 (
- 啟動這個應用:Bash
# 在 /opt/docker-stack/whoami 目錄下 sudo docker compose up -d- 現在,
whoami_app正在 Docker 中運行。它 100% 安全,無法從外部訪問,但它正在caddy_net網路上等待 Caddy 的呼叫。
- 現在,
第三部分:配置 Caddy (主機) 來代理此應用
現在,我們回到您熟悉的 Caddyfile,告訴它去代理這個新應用。
- 編輯您的主 Caddyfile:Bash
sudo nano /etc/caddy/Caddyfile - 在檔案末尾(在您其他站點下方)添加一個新區塊: (假設您想用
whoami.pilemon.com來訪問它)程式碼片段whoami.pilemon.com { # (關鍵) Caddy 會在 caddy_net 網路上 # 尋找一個名叫 'whoami_app' (Compose 中的服務名) # 或 'whoami_service' (Compose 中的容器名) 的主機 # 並代理到它的 80 埠 (traefik/whoami 默認監聽 80) reverse_proxy whoami_app:80 }- 這就是魔法: 您不需要記 IP,只需要使用您在
docker-compose.yml中定義的服務名稱whoami_app。
- 這就是魔法: 您不需要記 IP,只需要使用您在
- 保存並退出 (
Ctrl+X,Y,Enter)。 - (最終) 重新載入 Caddy 配置:Bash
sudo systemctl reload caddy
第四部分:驗證
- (如果您還沒做) 去您的 DNS 服務商那裡,添加一條
A記錄,將whoami.pilemon.com指向您伺服器的 IP。 - 等待 DNS 生效(幾分鐘)。
- 清除瀏覽器快取。
- 訪問:
https://whoami.pilemon.com
您應該會看到:
- 一個由 Caddy 自動簽發的有效 SSL 證書(綠色鎖頭)。
traefik/whoami服務返回的資訊頁面(顯示容器 ID、IP 等)。
恭喜! 您現在掌握了最專業、最安全的 Caddy + Docker Compose 工作流。
未來的實戰(如何添加 Grav)
未來當您想用 Docker 安裝 Grav 時,您只需要:
sudo mkdir -p /opt/docker-stack/grav- 在裡面創建一個
docker-compose.yml(使用grav:latest鏡像)。 - 確保它連接到
networks: ... name: caddy_net。 - 在您的
/etc/caddy/Caddyfile中添加一個新區塊:程式碼片段grove.pilemon.com { # 假設 grav 服務在 compose 中叫 'grav_app' # 並且 grav 默認監聽 80 埠 reverse_proxy grav_app:80 } sudo systemctl reload caddy- 完成。
评论(没有评论)