Docker compose 配置caddy反代

3.428k 字  |  12 分钟

本教程將教您如何配置一個專業的、模組化的環境,您可以在 /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)

現在,我們在您指定的目錄中,部署一個不暴露任何埠的測試服務。

  1. 創建項目目錄:Bash# 這是您的「Docker 棧」根目錄 sudo mkdir -p /opt/docker-stack/ # 這是我們第一個應用的目錄 sudo mkdir -p /opt/docker-stack/whoami cd /opt/docker-stack/whoami
  2. 創建 docker-compose.yml 檔案:Bashsudo nano docker-compose.yml
  3. 貼入以下內容:YAMLversion: '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)。
  4. 啟動這個應用:Bash# 在 /opt/docker-stack/whoami 目錄下 sudo docker compose up -d
    • 現在,whoami_app 正在 Docker 中運行。它 100% 安全,無法從外部訪問,但它正在 caddy_net 網路上等待 Caddy 的呼叫。

第三部分:配置 Caddy (主機) 來代理此應用

現在,我們回到您熟悉的 Caddyfile,告訴它去代理這個新應用。

  1. 編輯您的主 Caddyfile:Bashsudo nano /etc/caddy/Caddyfile
  2. 在檔案末尾(在您其他站點下方)添加一個新區塊: (假設您想用 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
  3. 保存並退出 (Ctrl+X, Y, Enter)。
  4. (最終) 重新載入 Caddy 配置:Bashsudo systemctl reload caddy

第四部分:驗證

  1. (如果您還沒做) 去您的 DNS 服務商那裡,添加一條 A 記錄,將 whoami.pilemon.com 指向您伺服器的 IP。
  2. 等待 DNS 生效(幾分鐘)。
  3. 清除瀏覽器快取
  4. 訪問: https://whoami.pilemon.com

您應該會看到:

  • 一個由 Caddy 自動簽發的有效 SSL 證書(綠色鎖頭)。
  • traefik/whoami 服務返回的資訊頁面(顯示容器 ID、IP 等)。

恭喜! 您現在掌握了最專業、最安全的 Caddy + Docker Compose 工作流。


未來的實戰(如何添加 Grav)

未來當您想用 Docker 安裝 Grav 時,您只需要:

  1. sudo mkdir -p /opt/docker-stack/grav
  2. 在裡面創建一個 docker-compose.yml (使用 grav:latest 鏡像)。
  3. 確保它連接到 networks: ... name: caddy_net
  4. 在您的 /etc/caddy/Caddyfile 中添加一個新區塊:程式碼片段grove.pilemon.com { # 假設 grav 服務在 compose 中叫 'grav_app' # 並且 grav 默認監聽 80 埠 reverse_proxy grav_app:80 }
  5. sudo systemctl reload caddy
  6. 完成。

评论(没有评论)

谢谢你请我喝咖啡~

扫码打赏,支持一下