Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个单独的 YAML 格式的配置文件(通常是 docker-compose.yml)来配置应用的所有服务,之后只需一条命令,就能创建并启动所有服务 。
下面我将详细介绍 Docker Compose 的核心概念、使用步骤、配置文件以及常用命令。
🔑 核心概念与优势
理解 Docker Compose 前,先了解两个核心要素 :
- 服务:指一个应用的容器实例,例如一个 Web 应用容器或一个 Redis 容器。一个服务可以运行多个基于相同镜像的容器实例 。
- 项目:由一组关联的应用容器组成的完整业务单元,在
docker-compose.yml文件中定义。Compose 默认的管理对象就是项目 。
使用 Docker Compose 主要为了解决多服务应用的部署难题。Docker 建议每个容器只运行一个服务,但一个完整的应用(如 Web 微服务项目)往往需要数据库、缓存、应用服务器等多个容器。Compose 通过一个配置文件统一管理这些容器,简化了部署流程 。
📝 使用步骤
使用 Docker Compose 通常包含三个步骤 :
- 使用 Dockerfile 定义应用环境:为应用的每个服务组件创建 Dockerfile,确保应用可以在任何地方运行。
- 使用 docker-compose.yml 定义服务:在
docker-compose.yml文件中定义构成应用的各个服务,指定它们如何协同工作。 - 运行 docker compose up:在
docker-compose.yml文件所在目录执行此命令,Compose 会启动并运行整个应用程序。
📄 详解 Compose 文件
docker-compose.yml 是 Compose 的核心,它定义了服务的各个方面。其基本结构通常包括 version、services、networks 和 volumes 等关键部分 。
以下是一个典型 docker-compose.yml 文件中的一些重要配置项说明 :
配置项 | 说明 | 示例 |
| 指定构建镜像的 Dockerfile 路径。 |
|
| 指定服务使用的镜像。 |
|
| 映射宿主机与容器的端口。 |
|
| 挂载数据卷,实现数据持久化或同步。 |
|
| 指定容器连接的自定义网络,便于服务间通信。 |
|
| 设置服务启动的依赖顺序。 |
|
| 直接设置容器内的环境变量。 |
|
| 从指定文件加载环境变量。 |
|
| 配置容器的重启策略(如 |
|
| 覆盖镜像默认的启动命令。 |
|
⚙️ 常用命令
掌握了配置文件,接下来是一些常用的 Docker Compose 命令 :
- 启动服务:
docker compose up:前台启动所有服务。docker compose up -d:后台启动所有服务(推荐在生产环境使用)。docker compose up --build [服务名]:重新构建镜像并启动服务。
- 停止服务:
docker compose down:停止并移除由up创建的所有容器、网络(默认不会删除数据卷)。docker compose down -v:停止并移除容器、网络以及数据卷(谨慎使用)。
- 查看状态与日志:
docker compose ps:列出项目中所有容器的状态。docker compose logs [服务名]:查看指定服务的日志输出。docker compose exec [服务名] /bin/bash:进入指定服务容器内部。
- 管理服务生命周期:
docker compose start:启动已存在的服务容器。docker compose stop:停止服务容器,但不移除。docker compose restart:重启服务容器。
- 其他实用命令:
docker compose pull:拉取服务依赖的镜像。docker compose build:构建或重新构建服务的镜像。docker compose config:验证和查看最终的 Compose 文件配置。
💻 实战示例:编排 Web 应用与数据库
假设有一个简单的 Web 应用(webapp)依赖 Redis 缓存,其 docker-compose.yml 文件可以这样编写 :
version: '3'
services:
web:
build: . # 使用当前目录的 Dockerfile 构建 Web 应用镜像
ports:
- "5000:5000"
environment:
- REDIS_HOST=redis # 通过服务名"redis"连接
depends_on:
- redis # 明确依赖关系,先启动 redis
networks:
- mynetwork
redis:
image: "redis:alpine" # 使用官方 Redis 镜像
networks:
- mynetwork
networks:
mynetwork: # 定义自定义网络,方便服务间通过服务名通信在该文件所在目录下,执行 docker compose up -d,Compose 会自动构建 web 服务镜像,拉取 Redis 镜像,并启动两个容器,它们会加入同一个网络 mynetwork,web 容器可以通过 redis 这个主机名访问 Redis 容器 。
💎 总结
Docker Compose 通过声明式的 YAML 文件简化了多容器应用的管理,非常适合开发、测试和单机部署场景。要进一步探索,可以参考官方文档或在项目中尝试编排更复杂的服务组合。
