【Docker系列六】Docker Compose 文件详解

举报
kwan的解忧杂货铺啊 发表于 2025/03/26 23:26:22 2025/03/26
【摘要】 一、Compose 文件结构Docker Compose 文件是一个 YAML 格式的配置文件,通常命名为docker-compose.yml。它用于定义和配置多容器应用的服务、网络、卷等资源。Compose 文件的结构清晰,主要由以下几个部分组成:版本声明:指定 Docker Compose 文件的版本,通常为version: '3'或更高版本。服务定义:定义应用中的各个服务,每个服务对...

一、Compose 文件结构

Docker Compose 文件是一个 YAML 格式的配置文件,通常命名为docker-compose.yml。它用于定义和配置多容器应用的服务、网络、卷等资源。Compose 文件的结构清晰,主要由以下几个部分组成:

  1. 版本声明:指定 Docker Compose 文件的版本,通常为version: '3'或更高版本。
  2. 服务定义:定义应用中的各个服务,每个服务对应一个容器。
  3. 网络配置:定义容器之间的网络连接方式。
  4. 卷配置:定义容器使用的持久化存储卷。
  5. 环境变量与依赖管理:配置服务的环境变量和依赖关系。
    在这里插入图片描述

以下是一个简单的docker-compose.yml文件示例:

version: "3"
services:
  web:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydb
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

接下来,我们将详细解析 Compose 文件的各个部分。


二、服务定义与配置

服务是 Docker Compose 文件的核心部分,每个服务对应一个容器。服务的定义包括镜像、端口映射、卷挂载、环境变量等配置。

1. 基本配置

  • image:指定服务使用的镜像。可以是官方镜像(如nginx)或自定义镜像。
  • container_name:为容器指定一个名称。如果不指定,Docker 会自动生成一个名称。
  • ports:定义端口映射,格式为主机端口:容器端口。例如,"80:80"表示将主机的 80 端口映射到容器的 80 端口。
  • volumes:定义卷挂载,格式为主机路径:容器路径。例如,./html:/usr/share/nginx/html表示将本地的html目录挂载到容器的/usr/share/nginx/html目录。

2. 高级配置

  • build:如果使用自定义镜像,可以通过build指定 Dockerfile 的路径。例如:
    web:
      build: ./app
      image: myapp:latest
    
  • command:覆盖容器启动时的默认命令。例如:
    web:
      image: nginx
      command: ["nginx", "-g", "daemon off;"]
    
  • restart:定义容器的重启策略。常用选项包括no(不重启)、always(总是重启)、on-failure(失败时重启)。
  • depends_on:定义服务之间的依赖关系。例如,web服务依赖于db服务:
    web:
      depends_on:
        - db
    

三、网络与卷配置

1. 网络配置

Docker Compose 允许用户定义自定义网络,以实现容器之间的通信。默认情况下,Compose 会为每个服务创建一个网络,并将所有服务连接到该网络。

  • 自定义网络

    version: "3"
    services:
      web:
        image: nginx
        networks:
          - mynet
      db:
        image: mysql
        networks:
          - mynet
    networks:
      mynet:
        driver: bridge
    

    在这个示例中,webdb服务都连接到名为mynet的自定义网络。

  • 网络别名:可以为服务指定网络别名,方便其他服务通过别名访问。

    web:
      networks:
        mynet:
          aliases:
            - webserver
    

2. 卷配置

卷用于持久化存储容器中的数据。Docker Compose 支持两种类型的卷:命名卷和绑定挂载。

  • 命名卷:由 Docker 管理,适合存储数据库等需要持久化的数据。

    volumes:
      db_data:
    services:
      db:
        image: mysql
        volumes:
          - db_data:/var/lib/mysql
    

    在这个示例中,db_data是一个命名卷,用于存储 MySQL 的数据。

  • 绑定挂载:将主机上的目录挂载到容器中,适合开发环境。

    web:
      image: nginx
      volumes:
        - ./html:/usr/share/nginx/html
    

    在这个示例中,本地的html目录被挂载到容器的/usr/share/nginx/html目录。


四、环境变量与依赖管理

1. 环境变量

环境变量是配置服务的重要方式。Docker Compose 支持通过environment关键字直接定义环境变量,或通过.env文件加载环境变量。

  • 直接定义
    db:
      image: mysql
      environment:
        MYSQL_ROOT_PASSWORD: example
        MYSQL_DATABASE: mydb
    
  • 使用.env文件
    在项目根目录下创建.env文件:
    MYSQL_ROOT_PASSWORD=example
    MYSQL_DATABASE=mydb
    
    docker-compose.yml中引用:
    db:
      image: mysql
      env_file:
        - .env
    

2. 依赖管理

通过depends_on关键字,可以定义服务之间的启动顺序。例如,web服务依赖于db服务:

web:
  depends_on:
    - db

需要注意的是,depends_on仅控制服务的启动顺序,而不保证服务的可用性。如果需要等待某个服务完全启动后再启动其他服务,可以使用healthcheck或外部工具(如wait-for-it.sh)。

  • 健康检查
    db:
      image: mysql
      healthcheck:
        test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
        interval: 10s
        timeout: 5s
        retries: 5
    web:
      depends_on:
        db:
          condition: service_healthy
    
    在这个示例中,web服务会等待db服务健康检查通过后再启动。

五、总结

Docker Compose 文件是管理和部署多容器应用的核心工具。通过清晰的结构和灵活的配置,用户可以轻松定义服务、网络、卷以及环境变量等资源。无论是开发、测试还是生产环境,Docker Compose 都能提供一致且高效的解决方案。掌握 Compose 文件的编写和配置,是使用 Docker 构建现代化应用的关键技能。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。