Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个单独的 YAML 格式的配置文件( 通常是 docker-compose.yml )来配置应用的所有服务,之后只需一条命令,就能创建并启动所有服务 。
下面将详细介绍 Docker Compose 的核心概念、使用步骤、配置文件以及常用命令。
🔑 核心概念与优势
理解 Docker Compose 前,先了解两个核心要素 :
- 服务:指一个应用的容器实例,例如一个 Web 应用容器或一个 Redis 容器。一个服务可以运行多个基于相同镜像的容器实例 。
- 项目:由一组关联的应用容器组成的完整业务单元,在
docker-compose.yml文件中定义。Compose 默认的管理对象就是项目 。
使用 Docker Compose 主要为了解决多服务应用的部署难题。Docker 建议每个容器只运行一个服务,但一个完整的应用( 如 Web 微服务项目 )往往需要数据库、缓存、应用服务器等多个容器。Compose 通过一个配置文件统一管理这些容器,简化了部署流程 。
📝 使用步骤
使用 Docker Compose 通常包含三个步骤 :
- 1、使用 Dockerfile 定义应用环境:为应用的每个服务组件创建 Dockerfile,确保应用可以在任何地方运行。
- 2、使用 docker-compose.yml 定义服务:在
docker-compose.yml文件中定义构成应用的各个服务,指定它们如何协同工作。 - 3、运行 docker compose up:在
docker-compose.yml文件所在目录执行此命令,Compose 会启动并运行整个应用程序。
📄 详解 Compose 文件
docker-compose.yml 是 Compose 的核心,它定义了服务的各个方面。其基本结构通常包括 version、services、networks 和 volumes 等关键部分 。
以下是一个典型 docker-compose.yml 文件中的一些重要配置项说明 :
| 配置项 | 说明 | 示例 |
build |
指定构建镜像的 Dockerfile 路径。 | build: . 或详细指定 context 和 dockerfile |
image |
指定服务使用的镜像。 | image: nginx:alpine |
ports |
映射宿主机与容器的端口。 | ports: - "8080:80" |
volumes |
挂载数据卷,实现数据持久化或同步。 | volumes: - /host/data:/container/data |
networks |
指定容器连接的自定义网络,便于服务间通信。 | networks: - my_network |
depends_on |
设置服务启动的依赖顺序。 | depends_on: - database |
environment |
直接设置容器内的环境变量。 | environment: - KEY=VALUE |
env_file |
从指定文件加载环境变量。 | env_file: - .env |
restart |
配置容器的重启策略( 如 always, on-failure )。 |
restart: unless-stopped |
command |
覆盖镜像默认的启动命令。 | command: [ "python", "app.py" ] |
⚙️ 常用命令
掌握了配置文件,接下来是一些常用的 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 文件简化了多容器应用的管理,非常适合开发、测试和单机部署场景。要进一步探索,可以参考官方文档或在项目中尝试编排更复杂的服务组合。