Docker Compose docker-compose.yml文件讲解

 Docker   打工人   2024-11-24 21:50   55
  Docker

Docker Compose 是简化多容器应用管理的利器,而核心在于其配置文件 docker-compose.yml。通过这个文件,用户可以描述所有服务、网络和存储配置,以实现快速、可重复的部署。

本文将详细讲解 docker-compose.yml 文件的基本结构、常见配置项及其应用场景,并结合具体示例,帮助您全面掌握 Docker Compose 的配置和使用。


一、Docker Compose 文件概述

docker-compose.yml 是用 YAML 格式编写的文件,用于定义多容器应用的所有配置。通过这个文件,您可以:

  • 定义应用的服务、镜像、环境变量、端口映射等;
  • 指定容器间的依赖关系、网络拓扑和存储配置;
  • 使用简单命令(如 docker-compose up)一键启动整个应用。

配置文件的基本结构

一个典型的 docker-compose.yml 文件通常包含以下部分:

  1. version:指定 Compose 文件的版本。
  2. services:定义应用中的服务。
  3. volumesnetworks:定义数据存储和网络配置。

以下是一个基本的 Compose 文件示例:

version: "3.9"  # Compose 文件的版本
services:        # 定义服务
  web:           # 服务名称
    image: nginx:latest  # 使用的镜像
    ports:
      - "8080:80"       # 端口映射
    volumes:
      - ./data:/usr/share/nginx/html  # 数据挂载
    networks:
      - app-network    # 连接到指定网络
  db:                  # 数据库服务
    image: mysql:5.7
    environment:       # 配置环境变量
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydb
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network
volumes:               # 定义存储卷
  db-data:
networks:              # 定义网络
  app-network:

二、Compose 文件的核心配置项

2.1 version:指定 Compose 文件版本

功能:确定 Compose 文件语法和功能支持的版本。 推荐版本:使用最新版本(如 3.9),以获得最新功能。

示例:

version: "3.9"

常见版本说明:

  • 2.x 系列:适用于旧版 Docker 引擎,支持较简单的功能。
  • 3.x 系列:针对生产环境优化,支持 Swarm 模式。

2.2 services:定义服务

功能:指定应用中的各个服务及其配置。 配置项

  • image:使用的镜像。
  • build:从源码构建镜像。
  • ports:端口映射。
  • volumes:数据卷挂载。
  • environment:环境变量设置。
  • depends_on:定义服务依赖关系。

示例:

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
  app:
    build:
      context: ./app  # 构建镜像的上下文路径
    environment:
      APP_ENV: production
    depends_on:
      - db  # 依赖数据库服务
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: appdb

2.3 volumes:定义数据卷

功能:为容器提供持久化存储。 类型

  • 匿名卷:由 Docker 管理,生命周期与容器绑定。
  • 命名卷:在 docker-compose.yml 中显式声明,独立于容器生命周期。
  • 绑定挂载:直接挂载主机目录到容器内。

示例:

volumes:
  db-data:  # 命名卷
  app-logs:  # 持久化应用日志
services:
  db:
    image: mysql:5.7
    volumes:
      - db-data:/var/lib/mysql
  app:
    image: my-app:latest
    volumes:
      - ./logs:/app/logs  # 绑定挂载

场景:持久化数据库数据

使用卷可以确保即使容器被销毁,数据库的数据仍然保留。


2.4 networks:定义网络

功能:配置服务间的网络通信。

网络模式

  • 桥接网络(默认):服务间可通信,外部访问需端口映射。
  • 主机网络:与主机共享网络栈。
  • 无网络:隔离容器网络。

示例:

networks:
  app-network:
services:
  web:
    image: nginx
    networks:
      - app-network
  db:
    image: mysql
    networks:
      - app-network

场景:服务间通信

通过网络配置,可让 Web 服务与数据库服务互相访问。


三、完整示例与实践

3.1 多容器 Web 应用示例

需求描述:

部署一个简单的 Web 应用,包含:

  • Nginx 作为前端;
  • Flask 应用服务;
  • MySQL 数据库服务。

docker-compose.yml

version: "3.9"
services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - app-network
  app:
    build:
      context: ./app
    environment:
      DATABASE_URL: mysql://root:example@db/mydb
    networks:
      - app-network
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydb
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network
volumes:
  db-data:
networks:
  app-network:

启动应用:

docker-compose up --build

结果:

  • Nginx 在 http://localhost:8080 提供服务。
  • Flask 应用通过 Nginx 反向代理与数据库通信。

3.2 使用多个环境文件

配置开发和生产环境:

  • docker-compose.override.yml:开发环境特定配置。
  • docker-compose.prod.yml:生产环境特定配置。

示例:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

四、优化与注意事项

  1. 配置分离:开发、测试和生产环境使用不同的 Compose 文件。
  2. 健康检查:确保服务按预期启动。
  3. 合理使用卷:避免绑定挂载对主机文件系统的破坏性影响。
  4. 日志管理:结合日志驱动记录服务日志。

五、总结

通过 docker-compose.yml 文件,您可以轻松定义和管理多容器应用的所有配置。本篇文章介绍了 Compose 文件的基本结构及配置项,并通过完整示例展示了其实际应用。

使用 Docker Compose,您可以:

  • 简化多服务应用的配置与管理
  • 提高开发和生产环境的一致性
  • 加速应用的部署与迭代

从基本结构到高级用法,docker-compose.yml 是构建容器化应用不可或缺的工具。