【Docker】什么是 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
命令行工具执行操作,如启动、停止、查看日志等。
工作流程:
- 编写
docker-compose.yml
,定义服务、网络和卷。 - 使用
docker-compose up
命令,Compose 会:- 拉取所需镜像(或构建镜像)。
- 创建网络和卷。
- 按依赖顺序启动容器。
- 配置服务之间的通信。
- 使用其他命令(如
docker-compose down
)管理应用生命周期。
3. Docker Compose 的安装
Docker Compose 有两种主要形式:
- Docker Compose v1:早期版本,作为独立工具安装(命令为
docker-compose
)。 - 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-network
networks:
my-network: # 自定义网络
driver: bridge
volumes:
db-data: # 命名卷,持久化存储
关键字段说明:
version
:指定 Compose 文件的版本(如 3.8),影响功能支持和兼容性。services
:定义应用的服务,每个服务对应一个或多个容器。image
:指定容器使用的镜像。build
:从 Dockerfile 构建镜像。ports
:映射主机和容器端口。volumes
:挂载主机目录或命名卷到容器。environment
:设置环境变量。depends_on
:定义服务启动顺序。networks
:指定服务连接的网络。
networks
:定义网络,默认为bridge
模式,支持服务间通信。volumes
:定义命名卷,用于数据持久化。
文件版本:
- 推荐使用最新版本(如
3.8
或3.9
),以获得更多功能支持。旧版本(如2.x
)可能缺乏新特性。
5. 常用 Docker Compose 命令
以下是 Docker Compose 的核心命令(假设使用 v2,命令为 docker compose
):
- 启动应用:
docker compose up
- 启动所有服务,创建网络和卷。
- 加
-d
(docker 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/mysql
volumes:
db-data:
运行步骤:
- 创建项目目录,保存
docker-compose.yml
。 - 创建
Dockerfile
和nginx.conf
(根据需要)。 - 运行:
docker compose up -d
- 访问
http://localhost
,查看 Nginx 提供的页面。 - 停止并清理:
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 配置文件的编写和常用命令的使用,同时理解服务、网络和卷的概念。