当前位置: 首页 > news >正文

docker-compose.yml 文件详解——AI教你学Docker

3.2 docker-compose.yml 文件详解

docker-compose.yml 是 Docker Compose 用于定义多容器应用的配置文件。理解其结构和各字段,有助于高效编排和管理复杂的多服务环境。

一、基本结构

version: '3.9'   # Compose 文件格式版本,推荐写明services:        # 服务区块,每个服务相当于一个容器web:...db:...networks:        # 可选,自定义网络mynet:driver: bridgevolumes:         # 可选,自定义数据卷dbdata:
  • version:指定 Compose 文件格式(如 3、3.8、3.9 等)
  • services:定义所有服务(每个服务对应一个容器)
  • networks:自定义网络,服务之间通信/隔离
  • volumes:自定义持久化卷

二、服务定义详解

每个 service 支持丰富的配置项,常见如下:

services:web:image: nginx:alpine          # 使用现成镜像build: .                     # 或用 build 构建镜像(下方可指定上下文、Dockerfile 等)container_name: my-web       # 容器名(可选,不建议大规模用)command: ["nginx", "-g", "daemon off;"]  # 启动命令environment:                 # 环境变量(等价于 ENV)- NGINX_PORT=80ports:                       # 端口映射(主机:容器)- "8080:80"volumes:                     # 挂载卷- ./conf/nginx.conf:/etc/nginx/nginx.conf:ro- webdata:/usr/share/nginx/htmlnetworks:- mynetdepends_on:                  # 服务依赖,确保启动顺序- dbrestart: unless-stopped      # 容器重启策略healthcheck:                 # 健康检查机制test: ["CMD", "curl", "-f", "http://localhost/"]interval: 30stimeout: 5sretries: 3start_period: 10sdb:image: mysql:8environment:MYSQL_ROOT_PASSWORD: examplevolumes:- dbdata:/var/lib/mysql

字段说明与补充

  • image / build:二选一,image 指定已有镜像,build 指定构建上下文和 Dockerfile。
  • container_name:手动指定容器名(不建议大规模用,易冲突)。
  • command / entrypoint:覆盖默认启动命令。
  • environment / env_file:注入环境变量,可配合 .env 文件。
  • ports:端口映射,支持 “主机端口:容器端口”。
  • volumes:数据挂载,本地路径/命名卷/只读等多种写法。
  • depends_on:声明依赖关系,实现服务启动顺序(不等同于“完全可用”)。
  • restart
    • no(默认,不重启)
    • always(总是重启)
    • unless-stopped(除非手动停止)
    • on-failure[:max-retries]
  • healthcheck:监控容器健康,影响 depends_on: condition 用法。
  • networks:指定容器加入的网络。

三、多环境支持(.env 文件、环境变量注入)

1. .env 文件

  • docker-compose.yml 同目录下的 .env 文件会自动被识别,优先级高于 YAML 里的 environment 字段。

  • 格式:

    MYSQL_ROOT_PASSWORD=example
    NGINX_PORT=80
    
  • 在 compose 文件中可用 ${VAR_NAME} 引用:

    environment:- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    ports:- "${NGINX_PORT}:80"
    

2. env_file 字段

  • 可引用任意目录下的环境变量文件
    env_file:- ./envs/web.env
    

3. 环境变量优先级

  1. CLI 明确指定的变量(docker compose run -e
  2. environment 字段
  3. env_file
  4. .env 文件

四、多 Compose 文件合并与覆盖(-f 参数)

1. 作用场景

  • 支持分环境、多场景、多团队协作(如 base、dev、prod 各自有独立配置)
  • 可覆盖/扩展基础配置而无需重复写

2. 用法

docker compose -f docker-compose.yml -f docker-compose.prod.yml up
# 后面的文件会覆盖前面的同名配置
  • 举例:
    • docker-compose.yml:基础定义
    • docker-compose.override.yml:自动应用,适合开发环境
    • docker-compose.prod.yml:生产环境覆盖端口、镜像、环境变量等

3. 合并规则

  • services、networks、volumes 等对象按名字合并
  • 后加载的文件会覆盖前文件的同名字段
  • 数组型字段(如 environment、volumes)会合并/追加

五、完整案例

version: '3.9'
services:web:build: .ports:- "${WEB_PORT}:80"environment:- ENV=productiondepends_on:- dbhealthcheck:test: ["CMD", "curl", "-f", "http://localhost/"]interval: 30sretries: 3db:image: postgres:16volumes:- dbdata:/var/lib/postgresql/dataenvironment:POSTGRES_PASSWORD: ${DB_PWD}
volumes:dbdata:
networks:default:driver: bridge

.env 文件内容:

WEB_PORT=8080
DB_PWD=supersecret

六、参考资料

  • Compose 文件官方文档
  • Compose 环境变量与覆盖机制
  • Compose 多文件合并规则
http://www.dtcms.com/a/265235.html

相关文章:

  • 从一个开发的角度切入mysql索引,查询优化
  • C Primer Plus 第6版 编程练习——第6章(上)
  • 设计模式-享元模式
  • JAVA内存区域划分
  • WEB测试总结
  • ubuntu 安装neo4j
  • 七、分工说明
  • 南方大暴雨及洪水数据分析与可视化
  • 爬虫从入门到精通(22) |TLS指纹
  • 【RHCSA-Linux考试题目笔记(自用)】servera的题目
  • 【C++】--入门
  • HTTPS详解:原理 + 加解密过程 + 面试问答
  • SpringBoot:整合quartz实现定时任务-基础篇
  • 从零用java实现 小红书 springboot vue uniapp (12)实现分类筛选与视频笔记功能
  • uniapp 滚动tab
  • autoware calar 联合运行,自动驾驶虚拟仿真器
  • ESP32S3开发:实现WiFi扫描与连接功能
  • 插值与拟合(3):B样条曲线
  • MySQL 用户管理与权限控制
  • 进阶向:Django框架深度解析各核心组件的作用与协作
  • Spring生态在Java开发
  • 自动驾驶行业向端到端架构转型
  • ArrayList剖析
  • 买卖股票的最佳时机--js 算法
  • linux LAMP 3
  • 开疆智能CCLinkIE转CANopen网关连接GBS20机器人配置案例
  • 第四章 网络传输介质与综合布线基础
  • 04-动态规划
  • OpenHarmony 5.0 解决点击导航栏切换后台按钮再切换到前台导航栏可能覆盖输入法问题,导致输入法下沉,最下面的显示不全
  • day046-tomcat与部署war包、jar包