這種 Docker 多網站部署架構的核心價值是:一台主機,多個網站,獨立運行,互不影響,非常適合企業官網、開發測試環境,以及需要快速新增站台的 SaaS 系統。本篇會從架構原理開始,逐步帶你完成 Docker 安裝、Nginx 多站台部署實戰、MySQL 資料庫設計,最後再補充正式環境常會忽略的安全性、效能與維運注意事項。
為什麼選擇 Docker 多網站部署
傳統做法如果要在同一台主機上跑多個網站,通常會用 Nginx 的 server block 或 Apache 的 virtual host 直接安裝在系統層,所有網站共用同一套系統環境與套件版本。這樣做的缺點是:只要其中一個網站需要升級 PHP 版本、更換套件,或不小心把系統搞壞,其他網站都可能被牽連,排查問題時也很難確定影響範圍。
Docker 多網站部署則是把每個網站各自包成獨立容器,容器與容器之間、容器與主機系統之間都是隔離的。即使某個網站的容器出問題,也不會影響到同一台主機上的其他網站,甚至可以直接刪除重建,不必擔心波及其他服務。對於同時維護多個客戶網站、多個專案環境的工程師來說,這種架構能大幅降低維運與除錯的複雜度,也讓團隊可以用一致的方式管理每一個站台,不必記住每個網站各自的系統設定差異。
Docker 架構與運作原理
Docker 是一種容器技術,每個服務都是獨立環境,不依賴整個作業系統。
- Nginx:負責網站輸出
- MySQL:負責資料儲存
- Docker:負責環境隔離與部署
與傳統 VM 相比,Docker 更輕量、啟動更快,也更適合多網站架構。VM 需要為每個環境模擬一整套虛擬硬體與作業系統,啟動往往要花上幾十秒甚至數分鐘;Docker 容器則是直接共用主機的作業系統核心,啟動通常只要幾秒鐘,資源消耗也小得多,因此非常適合需要同時運行大量網站或服務的 Docker 多網站部署情境。
Ubuntu + Docker 安裝
在開始 Docker 多網站部署之前,第一步是在 Ubuntu 主機上安裝好 Docker 執行環境。以下指令會先更新系統套件,再安裝 Docker 引擎,並設定成開機自動啟動。
sudo apt update
sudo apt upgrade -y
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker
docker --version
其中 apt update 與 apt upgrade 先確保系統套件清單與版本是最新的,避免安裝 Docker 時發生相依性問題;docker.io 是 Ubuntu 官方套件庫提供的 Docker 引擎,安裝方式最簡單,適合大多數教學與中小型環境使用;systemctl enable docker 則是設定 Docker 服務開機自動啟動,避免每次重開機都要手動啟動。最後執行 docker --version 確認安裝成功,這一步就完成了 Docker 多網站部署所需的基礎執行環境。
👉 延伸閱讀:Docker 安裝與基本指令
Nginx 多網站部署實戰
環境準備好之後,接下來實際動手做 Docker 多網站部署:在同一台主機上,建立兩個完全獨立的網站容器,各自對應不同的對外連接埠,彼此不會互相干擾。
👉 架構概念:
- Site A → 8081
- Site B → 8082
- Nginx 容器負責網站服務
Step 1:建立網站資料夾
sudo mkdir -p /srv/site-a/html
sudo mkdir -p /srv/site-b/html
網站內容會直接放在主機,避免容器刪除導致資料遺失。
Step 2:啟動 Site A
sudo docker run -d \
--name site-a \
-p 8081:80 \
-v /srv/site-a/html:/usr/share/nginx/html \
nginx
👉 開啟網址:http://IP:8081
Step 3:啟動 Site B
sudo docker run -d \
--name site-b \
-p 8082:80 \
-v /srv/site-b/html:/usr/share/nginx/html \
nginx
👉 開啟網址:http://IP:8082
完成以上三個步驟後,你已經在同一台 Ubuntu 主機上,用 Docker 多網站部署的方式同時運行了兩個彼此獨立的網站。之後如果要再新增第三個、第四個網站,只需要重複同樣的模式:建立新的資料夾、換一個沒被佔用的連接埠、啟動一個新的 Nginx 容器即可,不需要更動既有網站的任何設定,這也是 Docker 多網站部署相對於傳統架構最直觀的優勢之一。
MySQL 資料庫架構設計
本架構使用單一 MySQL 容器提供多網站資料服務。
sudo mkdir -p /srv/mysql-data
sudo docker run -d \
--name mysql-main \
-e MYSQL_ROOT_PASSWORD=rootpass \
-p 3306:3306 \
-v /srv/mysql-data:/var/lib/mysql \
mysql:8
-p 3306:3306 會把 MySQL 對外開放在主機的「所有」網路介面(0.0.0.0),若防火牆沒有另外限制,等於把資料庫暴露在公網上,是常見的資安風險。正式環境建議改成只綁定本機:sudo docker run -d \
--name mysql-main \
-e MYSQL_ROOT_PASSWORD=rootpass \
-p 127.0.0.1:3306:3306 \
-v /srv/mysql-data:/var/lib/mysql \
mysql:8
如果 Nginx 服務的網站程式(例如 PHP、Node.js 應用容器)需要連線資料庫,建議改用 Docker 自訂網路(docker network)讓容器之間互連,完全不對外開放 3306 port,安全性更好,這也是正式環境的 Docker 多網站部署架構中,容易被忽略卻很重要的一環。
👉 所有網站共用同一個 MySQL 服務,可各自建立獨立的資料庫(schema),降低資源浪費。
👉 延伸閱讀: Docker Web Server 多網站架構教學
架構優勢與實務應用
- ✔ 多網站完全隔離
- ✔ 容器可快速重建
- ✔ 資源使用率低
- ✔ 適合企業與 SaaS 系統
- ✔ 可擴展成 Kubernetes 架構
這種設計方式可以讓伺服器像「網站工廠」,隨時新增或刪除服務。當網站數量或流量規模持續成長時,這套 Docker 多網站部署架構也能平滑地往上擴展:可以搭配 Nginx 反向代理做流量分流,或是把整套容器編排搬到 Kubernetes 上,讓部署、擴容與容錯都自動化,不需要從頭重新設計架構。
👉 延伸閱讀: Docker Compose 多容器管理教學
效能與資源配置建議
在實際的 Docker 多網站部署環境中,主機資源通常是最先遇到的瓶頸,而不是網站本身的程式效能。每啟動一個 Nginx 或 MySQL 容器,都會佔用一定的記憶體與 CPU,如果主機上同時跑了十幾個站台的容器,就必須事先評估好整體資源配置,避免因為單一容器搶佔過多資源,拖累其他網站的回應速度。
比較穩健的做法,是在啟動容器時透過 --memory 與 --cpus 參數,替每個容器設定資源上限,避免其中一個網站流量暴增時,把整台主機的資源都吃光,影響到其他同時運行的網站。對於流量差異很大的多個站台,也可以視情況把高流量網站獨立搬到專屬主機,低流量站台則繼續共用同一台主機,讓 Docker 多網站部署架構在成本與效能之間取得平衡。
日常維運與監控注意事項
上線之後,日常維運同樣是 Docker 多網站部署不能忽略的一環。建議定期確認每個容器的運行狀態,留意是否有容器異常重啟或記憶體使用量持續攀升的情況,這往往是網站程式有記憶體洩漏、或流量突然暴增的前兆。同時也建議設定容器的自動重啟策略,讓服務在異常關閉後能自動恢復,減少人工介入的時間。
另外,容器映像檔(image)與底層套件也需要定期更新,尤其是 Nginx 與 MySQL 這類直接對外服務的元件,一旦被發現有安全漏洞,越晚更新,暴露在風險中的時間就越長。建議搭配版本控管與備份機制,讓每次更新都可以在出問題時快速回滾,這樣才是一套完整、可長期維運的 Docker 多網站部署架構。
總結
整體而言,Docker 多網站部署的核心概念,是用容器把每個網站的執行環境徹底隔離開來,同時共用同一台主機的硬體資源,達到「一台主機、多個網站、互不干擾」的效果。從安裝 Docker、用 Nginx 容器分別部署每個網站,到用 MySQL 容器集中管理資料庫,再加上安全性設定與日常維運的習慣,這一整套流程就是一套完整、可以直接套用在正式環境的 Docker 多網站部署方案,也是許多中小企業與 SaaS 團隊在有限資源下,同時維運多個網站最實際的選擇。
