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: bridge

volumes:         # 可选,自定义数据卷
  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=80
    ports:                       # 端口映射(主机:容器)
      - "8080:80"
    volumes:                     # 挂载卷
      - ./conf/nginx.conf:/etc/nginx/nginx.conf:ro
      - webdata:/usr/share/nginx/html
    networks:
      - mynet
    depends_on:                  # 服务依赖,确保启动顺序
      - db
    restart: unless-stopped      # 容器重启策略
    healthcheck:                 # 健康检查机制
      test: ["CMD", "curl", "-f", "http://localhost/"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - 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=production
    depends_on:
      - db
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/"]
      interval: 30s
      retries: 3
  db:
    image: postgres:16
    volumes:
      - dbdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${DB_PWD}
volumes:
  dbdata:
networks:
  default:
    driver: bridge

.env 文件内容:

WEB_PORT=8080
DB_PWD=supersecret

六、参考资料

### 启动 `docker-compose.yml` 文件及其配置解析 #### 使用命令启动 Docker Compose 应用程序 要启动由 `docker-compose.yml` 配置定义的服务集合,需在该文件所在的目录下运行如下命令: ```bash docker-compose up ``` 此命令将会读取当前目录下的默认名为 `docker-compose.yml` 的文件并根据其中的定义来启动服务。如果希望指定其他名称或者位置不同的 YAML 文件,则可以通过 `-f` 参数提供具体路径。 对于后台运行的应用程序实例,可附加参数 `-d` 来让容器以后台模式执行: ```bash docker-compose up -d ``` #### 关键配置项解释 - **版本声明** 在编写 `docker-compose.yml` 文件时,必须指明所使用的 Docker Compose 文件格式版本。常见的做法是指定为 `"3"` 或者更具体的子版本号如 `"3.8"` [^2]: ```yaml version: '3' ``` - **构建自定义镜像** 当项目依赖于特定环境设置而这些无法通过公共仓库获取现成镜像满足需求时,可以在本地利用 Dockerfile 构建自己的镜像。为此,在服务条目中加入 `build` 字段,并指出构建上下文及可能不同于默认名 (`Dockerfile`) 的构建脚本文件名 [^1] : ```yaml services: webapp: build: context: . dockerfile: Dockerfile-alternate ``` - **持久化数据管理——命名卷** 命名卷允许开发者创建一种特殊类型的挂载点,它不仅能够实现跨不同容器间的数据共享而且保障了即便原生容器销毁之后重要资料依旧得以保存下来 [^3]. 这种方式非常适合用来处理数据库或其他需要长期保持状态的应用场景. 下面是一个简单的例子展示了怎样把 MySQL 数据库的日志和实际表空间分别映射到两个独立的命名卷之上: ```yaml volumes: db_data: {} db_logs: {} services: database: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: example volumes: - db_data:/var/lib/mysql - db_logs:/var/log/mysql ``` 上述内容涵盖了启动基于 `docker-compose.yml` 描述之应用程序所需的基础知识以及一些重要的配置选项介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值