> 技术文档 > 【Docker】什么是 Docker Compose_docker-compose是什么

【Docker】什么是 Docker Compose_docker-compose是什么

Docker Compose 是 Docker 提供的一个工具,用于定义和运行多容器 Docker 应用程序。它通过一个 YAML 配置文件(通常命名为 docker-compose.yml)来描述应用程序的服务、网络和卷等配置,然后通过简单的命令启动、停止和管理这些容器。Docker Compose 特别适合开发、测试和生产环境中需要协调多个容器的场景。

以下是对 Docker Compose 的详细介绍,涵盖其核心概念、功能、使用场景、配置文件结构以及常见命令。


1. Docker Compose 是什么?

Docker Compose 是一个用于定义和运行多容器应用程序的工具。它允许你通过一个声明式的 YAML 文件来配置应用程序的多个服务(services)、网络(networks)和数据卷(volumes),然后使用单一命令启动和管理整个应用程序栈。相比手动运行多个 docker run 命令,Docker Compose 简化了多容器应用的部署和管理。

核心特点:

  • 声明式配置:通过 docker-compose.yml 文件定义所有服务、网络和卷,配置清晰且易于版本控制。
  • 简化多容器管理:一次命令(例如 docker-compose up)即可启动所有相关容器,并自动配置网络和依赖关系。
  • 开发友好:适合本地开发和测试环境,支持快速搭建复杂应用栈(如 Web 服务器 + 数据库 + 缓存)。
  • 跨平台:支持 Linux、macOS 和 Windows,且与 Docker 生态系统无缝集成。

典型使用场景:

  • 本地开发和测试环境:快速搭建由多个服务组成的应用(如前端、后端、数据库)。
  • CI/CD 管道:自动化测试环境配置。
  • 生产环境中的简单编排:虽然生产中更常使用 Kubernetes,但 Docker Compose 适合小型或简单部署。

2. Docker Compose 的工作原理

Docker Compose 依赖于 Docker 引擎,基于以下核心组件工作:

  • 服务(Services):定义一个或多个容器,包含镜像、环境变量、端口映射等配置。每个服务通常代表应用的一个组件(例如 Web 服务器、数据库)。
  • 网络(Networks):Docker Compose 自动创建网络,允许服务之间通过服务名通信(类似 DNS)。
  • 卷(Volumes):用于持久化数据,防止容器重启时数据丢失。
  • 配置文件docker-compose.yml 是核心,描述整个应用栈的配置。
  • CLI 工具:通过 docker-compose 命令行工具执行操作,如启动、停止、查看日志等。

工作流程:

  1. 编写 docker-compose.yml,定义服务、网络和卷。
  2. 使用 docker-compose up 命令,Compose 会:
    • 拉取所需镜像(或构建镜像)。
    • 创建网络和卷。
    • 按依赖顺序启动容器。
    • 配置服务之间的通信。
  3. 使用其他命令(如 docker-compose down)管理应用生命周期。

3. Docker Compose 的安装

Docker Compose 有两种主要形式:

  1. Docker Compose v1:早期版本,作为独立工具安装(命令为 docker-compose)。
  2. Docker Compose v2:集成到 Docker CLI 中(命令为 docker compose),推荐使用。

安装方式

  • 如果使用 Docker Desktop(Windows/macOS),Docker Compose 已内置,无需单独安装。
  • 在 Linux 上,安装 Docker 时通常包含 Compose v2,或者可以手动安装:
    sudo apt-get install docker-compose-plugin
  • 验证安装:
    docker compose version

4. Docker Compose 配置文件(docker-compose.yml)

docker-compose.yml 是 Docker Compose 的核心,采用 YAML 格式,描述应用的结构。以下是一个典型的配置文件示例,展示常见字段:

version: \'3.8\' # 指定 Docker Compose 文件版本services: web: # 服务名 image: nginx:latest # 使用官方 Nginx 镜像 ports: - \"8080:80\" # 主机端口 8080 映射到容器端口 80 volumes: - ./html:/usr/share/nginx/html # 挂载本地 html 文件夹到容器 depends_on: - app # 依赖于 app 服务 networks: - my-network app: build: context: . # 构建上下文路径 dockerfile: Dockerfile # 指定 Dockerfile environment: - DATABASE_URL=mysql://user:password@db:3306/mydb # 环境变量 depends_on: - db networks: - my-network db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: mydb MYSQL_USER: user MYSQL_PASSWORD: password volumes: - db-data:/var/lib/mysql # 持久化 MySQL 数据 networks: - my-networknetworks: my-network: # 自定义网络 driver: bridgevolumes: db-data: # 命名卷,持久化存储

关键字段说明

  • version:指定 Compose 文件的版本(如 3.8),影响功能支持和兼容性。
  • services:定义应用的服务,每个服务对应一个或多个容器。
    • image:指定容器使用的镜像。
    • build:从 Dockerfile 构建镜像。
    • ports:映射主机和容器端口。
    • volumes:挂载主机目录或命名卷到容器。
    • environment:设置环境变量。
    • depends_on:定义服务启动顺序。
    • networks:指定服务连接的网络。
  • networks:定义网络,默认为 bridge 模式,支持服务间通信。
  • volumes:定义命名卷,用于数据持久化。

文件版本

  • 推荐使用最新版本(如 3.83.9),以获得更多功能支持。旧版本(如 2.x)可能缺乏新特性。

5. 常用 Docker Compose 命令

以下是 Docker Compose 的核心命令(假设使用 v2,命令为 docker compose):

  • 启动应用
    docker compose up
    • 启动所有服务,创建网络和卷。
    • -ddocker compose up -d)后台运行。
  • 停止并删除
    docker compose down
    • 停止并删除容器、网络(卷需加 --volumes 删除)。
  • 构建镜像
    docker compose build
    • 构建 build 字段定义的自定义镜像。
  • 查看运行状态
    docker compose ps
    • 列出当前 Compose 项目中的容器状态。
  • 查看日志
    docker compose logs
    • 查看所有服务的日志,加 -f 实时跟踪。
  • 执行命令
    docker compose exec <service> <command>
    • 在运行的容器中执行命令,例如:
      docker compose exec app bash
  • 停止服务
    docker compose stop
    • 停止服务但保留容器。
  • 重启服务
    docker compose restart

6. Docker Compose 的优势和局限性

优势

  • 简化多容器管理:一个文件定义整个应用栈,减少手动操作。
  • 开发效率高:快速搭建复杂环境,适合本地开发和测试。
  • 服务隔离与通信:自动创建网络,服务间通过服务名通信。
  • 可重复性:配置文件便于版本控制和共享。
  • 跨平台:支持多种操作系统和环境。

局限性

  • 不适合大规模生产环境:相比 Kubernetes,Docker Compose 缺乏高级功能(如自动扩展、故障恢复)。
  • 单机部署:默认运行在单台主机上,多机部署需额外工具(如 Docker Swarm)。
  • 功能有限:不支持复杂的服务编排需求(如动态负载均衡)。

7. 示例:搭建一个简单的 Web 应用

以下是一个使用 Docker Compose 搭建 Nginx + Python Flask + MySQL 应用的示例:

docker-compose.yml

version: \'3.8\'services: web: image: nginx:latest ports: - \"80:80\" volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - app app: build: . environment: - FLASK_ENV=development - DATABASE_URL=mysql://user:pass@db:3306/app depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: app MYSQL_USER: user MYSQL_PASSWORD: pass volumes: - db-data:/var/lib/mysqlvolumes: db-data:

运行步骤

  1. 创建项目目录,保存 docker-compose.yml
  2. 创建 Dockerfilenginx.conf(根据需要)。
  3. 运行:
    docker compose up -d
  4. 访问 http://localhost,查看 Nginx 提供的页面。
  5. 停止并清理:
    docker compose down

8. 与其他工具的对比

  • Docker Compose vs. Docker Swarm
    • Docker Compose:适合单机、开发和简单部署。
    • Docker Swarm:Docker 原生的集群编排工具,支持多机部署。
  • Docker Compose vs. Kubernetes
    • Docker Compose:简单易用,适合小型项目或开发。
    • Kubernetes:复杂但功能强大,适合大规模生产环境,支持自动扩展、高可用等。

9. 总结

Docker Compose 是一个强大且易用的工具,通过 docker-compose.yml 文件简化了多容器应用的定义和管理。它特别适合开发和测试环境,也可用于简单的生产部署。核心是掌握 YAML 配置文件的编写和常用命令的使用,同时理解服务、网络和卷的概念。