示意圖:Docker 多網站部署架構
圖片檔 blog-drafts/images
目前在 Linux 主機上利用 Docker 跑多個網站,這次順手把目前的建置方式整理一下,避免之後要調整時又要重新看一次。
環境:
- Linux 主機
- Docker / Docker Compose
- Nginx 或 Caddy 做 Web 入口
- 多個 PHP-FPM container
- MySQL container
目前架構:
大致上是這樣:
Browser
↓
Nginx / Caddy
↓
依不同網站轉給不同 PHP-FPM
↓
MySQL
這樣的做法有點像把傳統的 LEMP 主機,改成用 Docker 來管理。
目的:
- 一台主機可以放多個 PHP 網站
- 不同網站可以使用不同 PHP 版本
- 網站目錄、log、資料庫資料都放在 host 上,方便備份
- Web server 統一處理 80、443、SSL、virtual host
- 需要瀏覽器自動化時,可以用 geckodriver container
目前比較像「共享主機 Docker 化」,不是每個網站都獨立一整組服務。
建議調整:
1. 不要使用 latest
例如:
NGINX_VERSION=nginx:latest
建議改成固定版本:
NGINX_VERSION=nginx:1.29.3-alpine
不然之後重新 build 或 pull 時,可能會拉到不同版本,問題會比較不好追。
2. PHP 7.4 要列為舊系統
如果還有網站需要 PHP 7.4,可以先保留,但要知道這已經是 legacy 環境。
建議做法:
- 先列出哪些網站還需要 PHP 7.4
- 確認不能升級的原因
- 有計畫地改到 PHP 8.2 / 8.3 / 8.4
3. MySQL 不一定要開給外部
如果只有 container 裡的網站會連 MySQL,通常不需要:
ports:
- 3306:3306
比較保守可以改成:
ports:
- 127.0.0.1:3306:3306
或者乾脆不要 publish port,只讓 Docker network 內部連線。
4. volumes 和 bind mount 要整理
目前像這些目錄都會影響備份:
wwwroot/
data/mysql/data/
etc/nginx/
etc/caddy/
log/
session/
建議之後整理一份備份清單,才不會只備份 image,卻漏掉真正重要的網站資料。
結論:
這個架構是可行的,而且蠻適合維護多個 PHP 網站。
接下來優先處理的順序,我覺得可以是:
- 固定 image 版本
- 整理 Nginx / PHP-FPM 權限
- 收斂 MySQL 對外連線
- 補上 healthcheck
- 將 PHP 7.4 網站逐步升級
- 評估改用 Caddy 簡化 HTTPS
先把基礎整理好,之後要搬主機、重建服務或排除錯誤都會輕鬆很多。

0 意見:
張貼留言