7.1 挂載卷
在 Docker Compose 中挂載卷和網路可以幫助你創建靈活且高效的多容器應用。卷(volumes)用於存儲需要保存在容器外部的數據,而網路(networks)可以實現容器之間的互動。在這篇講座中,我們會詳細討論如何在 Docker Compose 中使用卷和網路。
Docker 中的卷允許數據保存在容器外,即使容器停止或者刪除後,數據仍然可以使用。這對於需要長期保存的數據如數據庫數據、日志文件等特別有用。
卷的類型:
- 命名卷 (Named Volumes): 由 Docker 管理,保存在主機的特定目錄中。
- 綁定卷 (Bind Mounts): 從主機的指定目錄挂載到容器中。
在 Docker Compose 中設定卷
命名卷的範例
在這個範例中,創建了一個命名卷 postgres-data
,並將其挂載到容器 db
的目錄 /var/lib/postgresql/data
中。
Yaml
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
綁定卷的範例
在這個範例中,本地的目錄和文件 nginx.conf
和 html
被作為綁定卷挂載到容器 web
中。
Yaml
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 挂載網路
Docker Compose 中的網路讓容器彼此互通。每個容器都可以被連接到一個或多個網路,從而提供隔離和流量管理的功能。
網路類型:
- 橋接網路 (Bridge): 默認情況下,容器會連接到橋接網路,這樣可以讓它們在同一台主機上交互。
- 覆蓋網路 (Overlay): 用於在 Docker Swarm 集群中,不同主機之間啟動的容器之間的互動。
- 網路插件 (Network Plugins): 允許使用第三方網路驅動以配置更複雜的場景。
自定義網路的創建和使用範例
在這個範例中,我們創建了兩個自定義網路 front-end 和 back-end。服務 app 被連接到兩個網路,服務 web 只連接到 front-end,而服務 db 只連接到 back-end。
Yaml
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
實用建議:
- 使用命名卷: 命名卷由 Docker 管理,使用起來方便、易於管理資料。命名卷可以同時連接多個服務。例如,後端服務記錄日誌,而監控服務分析這些日誌,並在發現
error
級別的錯誤時發出通知。 - 網路隔離: 使用多個網路可以隔離應用程序的不同部分並控制它們的交互。
- 配置文件存儲: 使用綁定卷來掛載配置文件,這樣可以輕鬆修改配置而無需重新構建映像。
- 網路安全性: 限制對網路的訪問,讓只有必要的容器才能交互,這樣能提高應用的安全性。
7.3 卷和網路的使用範例
在 Docker Compose 中使用卷和網路的範例:
範例 1: 包含網頁伺服器和資料庫的應用程式
Yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
在這個範例中:
- 網頁伺服器 nginx 和資料庫 PostgreSQL 連接到同一個網路 webnet,這使得它們可以互相通信。如果只有一個網路,可以不指定 —— 系統會自動建立一個預設網路。
- 資料庫的數據儲存在命名卷 db-data 中,這樣在重啟容器時數據仍能被保存。
範例 2: 多層應用程式
Yaml
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
在這個範例中:
- 建立了兩個網路:front-tier 和 back-tier。
- 服務 frontend 連接到兩個網路,這使得它可以和 backend 以及外部客戶端進行通信。
- 服務 backend 和 database 僅連接到網路 back-tier,以確保它們的隔離和互動。
- 服務 backend 和 database 的數據分別存儲在命名卷 backend-data 和 db-data 中。
GO TO FULL VERSION