目錄
前言
1 YAML基礎語法解析
1.1 YAML格式簡介
1.2 Docker-compose中的YAML語法規則
1.3 YAML數據類型在Compose中的應用
2 docker-compose.yml文件結構剖析
2.1 基本文件結構
2.2 版本聲明詳解
3 services配置深度解析
3.1 服務定義基礎
3.2 鏡像與構建配置
3.3 網絡與端口配置
3.4 環境變量與機密數據
4 網絡與存儲配置
4.1 網絡配置詳解
4.2 數據卷配置詳解
5 高級配置技巧
5.1 多環境配置管理
5.2 資源限制與部署策略
5.3 健康檢查配置
6 常見問題與性能優化
6.1 配置優化建議
6.2 常見錯誤排查
6.3 性能調優技巧
7 總結
前言
Docker-compose作為容器編排的利器,其核心秘密全部隱藏在docker-compose.yml這個配置文件中。理解這個文件的語法結構和配置規則,是掌握Docker-compose的關鍵所在。
1 YAML基礎語法解析
1.1 YAML格式簡介
YAML(YAML Ain't Markup Language)是一種人類友好的數據序列化標準,被廣泛用于配置文件,Docker-compose采用YAML作為其配置文件格式,主要因其具有以下特點:
- 可讀性強:使用縮進表示層次,比JSON更易閱讀
- 簡潔明了:不需要大量括號和引號
- 注釋支持:可以使用#添加注釋
- 數據類型豐富:支持字符串、數字、布爾值、列表、字典等

1.2 Docker-compose中的YAML語法規則
基本規則:
- 縮進:使用空格(通常2或4個),不能使用Tab鍵
- 鍵值對:使用key: value形式,冒號后必須有一個空格
- 列表:使用短橫線-表示,后面跟空格
- 多行字符串:使用|保留換行或>折疊換行
- 注釋:以#開頭,直到行尾
- 示例對比:
# 正確示例
services:web:image: nginx:alpineports:- "80:80"- "443:443"environment:NODE_ENV: production# 錯誤示例(Tab縮進)
services:web: # 使用了Tab鍵image: "nginx:alpine"
1.3 YAML數據類型在Compose中的應用
數據類型 | 示例 | 說明 |
字符串 | image: "nginx:alpine" | 可加引號,特殊字符必須加 |
數字 | ports: - 8080:80 | 端口號等數值配置 |
布爾值 | restart: true | 啟用/禁用選項 |
列表 | ports: ["80:80", "443:443"] | 多項配置 |
字典 | environment: {NODE_ENV: prod} | 嵌套配置 |

2 docker-compose.yml文件結構剖析
2.1 基本文件結構
- 一個完整的docker-compose.yml文件通常包含以下頂級部分:
version: '3.8' # 版本聲明services: # 服務定義(必需)web:image: nginxnetworks: # 網絡配置backend:driver: bridgevolumes: # 數據卷配置db-data:driver: localconfigs: # 配置項(高級功能)app-config:file: ./config.ymlsecrets: # 密鑰管理(高級功能)db-password:file: ./db-password.txt

2.2 版本聲明詳解
- version字段指定了Compose文件格式的版本,不同版本支持的功能有所差異:
版本 | Docker Engine版本要求 | 重要特性 |
2.x | 1.10.0+ | 引入擴展字段、網絡/卷頂級定義 |
3.x | 1.13.0+ | 簡化語法,移除某些2.x特性 |
3.8 | 19.03.0+ | 支持GPU資源、更多部署選項 |
版本選擇建議:
- 新項目推薦使用3.8版本
- 需要向后兼容時使用3.3
- 舊系統維護可使用2.4
3 services配置深度解析
3.1 服務定義基礎
- 每個服務對應一個容器,基本結構如下:
services:service-name: # 服務名稱(自定義)image: repo/image:tag # 鏡像名稱build: ./dir # 構建上下文ports: # 端口映射- "host:container"environment: # 環境變量- VAR=valuevolumes: # 數據卷- host_path:container_pathdepends_on: # 依賴關系- other-service
3.2 鏡像與構建配置
- 兩種服務來源方式:

- 示例配置:
services:# 使用現有鏡像redis:image: redis:alpineports:- "6379:6379"# 構建新鏡像webapp:build:context: ./appdockerfile: Dockerfile.prodargs:NODE_ENV: productionimage: my-webapp:v1
3.3 網絡與端口配置
- 網絡模型:

- 端口配置示例:
ports:- "80:80" # 主機端口:容器端口- "443:443" # 明確指定- "8080" # 僅暴露,不映射到主機- "3000-3005:3000-3005" # 端口范圍- target: 80 # 擴展語法published: 8080protocol: tcpmode: host
3.4 環境變量與機密數據
- 三種配置方式對比:
方式 | 示例 | 適用場景 |
直接定義 | environment: {DB_HOST: db} | 非敏感配置 |
文件注入 | env_file: ./.env | 多環境配置 |
密鑰管理 | secrets: - db-password | 敏感數據 |

4 網絡與存儲配置
4.1 網絡配置詳解
- 常見網絡類型:
networks:frontend:driver: bridgedriver_opts:com.docker.network.enable_ipv6: "true"ipam:config:- subnet: "172.28.0.0/16"backend:external: truename: existing-network

4.2 數據卷配置詳解
三種掛載方式:
- 匿名卷:- /var/lib/mysql
- 命名卷:- db-data:/var/lib/mysql
- 綁定掛載:- ./cache:/tmp/cache
- 示例配置:
volumes:db-data: # 命名卷driver: localdriver_opts:type: nfso: addr=192.168.1.1,rwlogs: # 外部卷external: truename: app-logs

5 高級配置技巧
5.1 多環境配置管理
- 推薦文件結構:
project/
├── docker-compose.yml # 基礎配置
├── docker-compose.override.yml # 開發配置
├── docker-compose.prod.yml # 生產配置
└── .env # 環境變量
- 合并規則:

5.2 資源限制與部署策略
- 生產環境推薦配置:
services:web:deploy:resources:limits:cpus: '0.5'memory: 512Mrestart_policy:condition: on-failuredelay: 5smax_attempts: 3update_config:parallelism: 2delay: 10sorder: start-first
5.3 健康檢查配置
healthcheck:test: ["CMD", "curl", "-f", "http://localhost"]interval: 30stimeout: 10sretries: 3start_period: 5s
- 健康狀態流轉:

6 常見問題與性能優化
6.1 配置優化建議
- 版本控制:
- 將docker-compose.yml納入版本控制
- 使用.dockerignore排除無關文件
- 敏感數據管理:
- 永遠不要在配置中直接寫入密碼
- 使用secrets或環境變量文件
- 網絡規劃:
- 為不同服務組創建獨立網絡
- 生產環境禁用默認的bridge網絡
6.2 常見錯誤排查
ERROR: yaml.parser.ParserError: while parsing a block mapping
- 檢查縮進是否一致
- 確認冒號后是否有空格
- 使用在線YAML驗證工具檢查
ERROR: for web Cannot start service web: driver failed programming external connectivity
- netstat -tulnp | grep 查找占用進程
- 修改服務端口或停止沖突進程
6.3 性能調優技巧
- 構建緩存:
# 先復制依賴文件
COPY package.json yarn.lock ./
RUN yarn install# 再復制源代碼
COPY . .
- 資源限制:
deploy:resources:limits:memory: 1Gcpus: '0.5'
- 日志輪轉:
logging:driver: json-fileoptions:max-size: "10m"max-file: "3"
7 總結
通過本文,我們學習了解了:
- YAML語法精髓:理解縮進、數據類型和結構規則
- Compose文件結構:從版本聲明到服務、網絡、存儲配置
- 服務定義細節:鏡像構建、環境變量、健康檢查等
- 高級配置技巧:多環境管理、資源限制、部署策略
docker-compose.yml文件是Docker-compose的靈魂所在,精心設計的配置可以顯著提高開發和運維效率。建議在實際項目中:
- 從簡單配置開始,逐步添加復雜功能
- 做好配置的版本管理和環境隔離
- 定期檢查Docker文檔獲取新特性