3.1 檔案 compose.yaml
檔案 compose.yaml
(或者以下幾種變體之一:docker-compose.yaml
, docker-compose.yml
, compose.yml
)是 Docker Compose 使用來定義和管理多容器應用程式的主要配置檔案。它描述了哪些容器(服務)需要運行,它們如何相互作用,以及它們需要哪些資源。
為了統一,在這次講課中我們會使用 compose.yaml
的版本,因為它是現代版本 Docker Compose 的推薦形式。
compose.yaml
檔案結構
compose.yaml
檔案由多個部分組成,每個部分描述應用程式配置的不同方面。主要部分包括:
- version: 指定 Compose 檔案的版本(例如,
'3.9'
)。 - services: 描述容器(服務)、它們的設置及相互依賴關係。
- volumes: 定義容器和主機之間的資料存儲卷。
- networks: 配置服務之間通信所使用的網絡。
3.2 基本指令
1. version
指令 version 用於定義在 compose.yaml
檔案中使用的 Docker Compose 語法版本。到撰寫本文時,最流行的是版本 3,特別是它的更新,例如 3.8 和 3.9。
version: '3.9'
2. services
services 區塊定義 Compose 應該建立並啟動的容器。每個服務代表一個具有特定配置的獨立容器。
範例:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
在此範例中,定義了兩個服務:web
和 db
。服務 web
使用 nginx:latest
映像檔並開啟 80 端口。服務 db
使用 mongo:latest
映像檔並掛載一個用於存儲資料的卷。
3. volumes
volumes 區塊用於定義可以掛載到容器上的卷以存儲數據。這在重新啟動容器時保存資料非常有用。
範例:
volumes:
mongo-data:
4. networks
networks 區塊允許定義容器運行的自定義網路。這提供了隔離和網路連接的配置。如果未指定網路,Docker Compose 會創建預設網路,所有服務都將連接到該網路。
範例:
networks:
front-end:
back-end:
3.3 配置服務的指令
配置服務的主要指令:
1. image
image 指令指定將用於創建容器的映像。
範例:
services:
web:
image: nginx:latest
2. build
build 指令用於指定應用於構建映像的 Dockerfile 路徑。
範例:
services:
app:
build: ./app
3. ports
ports 指令定義必須開啟的端口並從主機機器重定向到容器的端口。
範例:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
volumes 指令將卷掛載到容器中,這樣可以在容器重啟之間保存數據。
範例:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
environment 指令為容器設置環境變數。
範例:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
depends_on 指令表明該服務依賴其他服務,應在它們啟動後啟動。
重要!
當啟動您的服務時,您無法 100% 保證所有必需的服務完全準備就緒。它們會被啟動——是的,但進一步的可操作性無法保證。此問題可通過 health-check 解決,但稍後我們會討論這個問題。
範例:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
command 指令允許覆蓋容器啟動時要執行的命令。
範例:
services:
app:
image: myapp:latest
command: python app.py
8. networks
networks 指令將服務連接到一個或多個網絡。
範例:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 完整範例
完整檔案 compose.yaml
的範例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
在這個範例中:
- 定義了三個服務:
web
、app
和db
。 -
web
使用 Nginx 映像檔,掛載配置檔案,並依賴服務app
。 -
app
是基於本地的 Dockerfile 建置,掛載應用程式原始碼並使用環境變數。 -
db
使用 MongoDB 映像檔並掛載數據存儲卷。 - 建立了兩個卷和兩個網路來隔離和管理服務間的互動。
注意: 一個卷是 mongo-data
,另一個是從主機掛載的目錄 (例如 ./app
)。
GO TO FULL VERSION