網路與儲存
Vibe Prompt
「幫我設計一個微服務網路架構:前端在 public 網路,後端和資料庫在 internal 網路,後端可以連 DB,前端不行。」
網路隔離
services:
frontend:
networks:
- frontend
backend:
networks:
- frontend
- backend
postgres:
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 無法存取外部網路
Volume 類型
| 類型 | 範例 | 說明 |
|------|------|------|
| Named Volume | pgdata:/var/lib/postgresql/data | Docker 管理,持久化 |
| Bind Mount | ./src:/app/src | 主機目錄掛載,hot reload |
| Anonymous | /app/node_modules | 臨時儲存,容器刪除後消失 |
| Tmpfs | /tmp:ro | 記憶體暫存,高效能 |
Volume 驅動
volumes:
pgdata:
driver: local
s3data:
driver: rclone
driver_opts:
remote: s3://my-bucket
type: s3
關鍵要點
- ✅ 請根據本章主題補充具體的學習重點
- ✅ 建議加入比較表格、程式碼範例或流程圖
- ✅ 確保內容扎實且有價值
Docker 網路驅動比較
| 驅動 | 隔離性 | 跨主機 | 適用場景 | |:----:|:------:|:------:|---------| | bridge | ✅ 每個容器獨立 IP | ❌ | 單一主機上的容器通訊(預設) | | host | ❌ 共用主機網路 | ✅ | 需要高效能網路的服務 | | overlay | ✅ | ✅ | Swarm / Kubernetes 跨主機網路 | | macvlan | ✅ 直接分配 MAC | ✅ | 需要直接連入實體網路 | | none | ❌ 無網路 | ❌ | 不需要網路的容器 |
自訂 Bridge 網路的好處
使用自訂 bridge 網路而非預設的 docker0:
- ✅ 內建 DNS 解析:容器可以透過服務名稱互相連線(如
ping db) - ✅ 更好的隔離性:只有加入同一網路的容器才能通訊
- ✅ 動態加入/離開:可以在容器執行中加入或移除網路
# 建立自訂網路
docker network create --driver bridge app-network
# 查看網路
docker network ls
# 將容器連接到網路
docker network connect app-network my-container
Docker 磁碟區類型
| 類型 | 儲存位置 | 生命週期 | 備份難度 |
|:----:|---------|:--------:|:--------:|
| Named Volume | /var/lib/docker/volumes/ | Docker 管理 | ❌ 需手動備份 |
| Bind Mount | 主機任意路徑 | 主機管理 | ✅ 直接備份 |
| tmpfs | 記憶體 | 容器停止即消失 | ❌ 不需備份 |
| NFS Volume | 遠端 NFS 伺服器 | 外部管理 | ✅ 集中備份 |
選擇建議
- 開發環境:使用 Bind Mount(方便即時修改)
- 生產環境:使用 Named Volume(Docker 管理最安全)
- 暫存資料:使用 tmpfs(效能最好)
- 多主機共享:使用 NFS Volume 或雲端儲存
Docker Compose 實戰要點
Docker Compose 是定義和執行多容器 Docker 應用的工具。用 YAML 檔案設定服務、網路、磁碟區。
為什麼重要?
在 production 部署中,你很少只跑一個容器。Compose 讓你把 Web Server、資料庫、快取、佇列全部定義在同一個 YAML 中,一行指令全部啟動。
網路的隔離策略
Compose 預設為每個專案建立一個獨立的網路。不同專案的容器無法直接通訊——這提供了基本的隔離。
| 網路模式 | 隔離程度 | 使用場景 | |:--------|:--------|:--------| | 預設(bridge) | 專案內互通,跨專案隔離 | 大部分情況 | | 外部網路(external) | 跨專案共用網路 | 需要與其他專案通訊 | | 無網路(none) | 完全隔離 | 離線批次任務 |
Volumes 的持久化
容器重啟後資料會消失——除非你用 Volume。Volume 掛載到容器的某個路徑,容器刪除了 Volume 還在。
services:
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data: # 宣告 volume
下一章預告:VPS 部署
學會 Compose 之後,最後一章教你部署到 VPS——用 Docker Compose 在雲端伺服器上啟動完整應用。