Docker Compose 实战指南:从配置到多容器联动的全流程解析
Docker Compose 理解
一、什么是 Docker Compose?
Docker Compose 是 Docker 官方提供的工具,用于定义和运行多容器 Docker 应用。通过一个 YAML 格式的配置文件(docker-compose.yml
),可以声明应用所需的所有服务(容器)、网络、存储卷等,然后通过单条命令即可创建、启动、停止所有服务。
二、为什么需要 Docker Compose?
当应用依赖多个容器时(例如:Web 应用 + 数据库 + 缓存),手动管理容器存在以下问题:
- 需逐个启动容器,指定网络、端口映射、环境变量等参数,步骤繁琐;
- 容器间依赖关系需手动维护(如:先启动数据库,再启动 Web 应用);
- 配置参数分散,难以复用和版本控制。
Docker Compose 解决了这些问题:通过统一配置文件管理所有依赖,实现一键部署、环境一致、配置可复用。
三、核心概念
Docker Compose 配置文件(docker-compose.yml
)主要包含 3 个核心部分:
- services(服务):定义应用依赖的容器(如 web 服务、db 服务),每个服务对应一个容器配置(镜像、端口、环境变量等)。
- networks(网络):定义容器间的通信网络,默认会创建一个桥接网络,服务间可通过服务名互相访问。
- volumes(卷):定义持久化存储,用于容器数据的持久化(如数据库数据)。
四、实际操作:创建多容器应用
以「Flask 后端 + Redis 缓存」为例,演示 Docker Compose 的使用流程。
步骤 1:准备项目结构
myapp/
├── docker-compose.yml # Compose 配置文件
├── app/ # Flask 应用代码
│ ├── Dockerfile # Flask 容器构建文件
│ └── app.py # Flask 应用逻辑
步骤 2:编写 Flask 应用代码
app/app.py
(简单计数功能,依赖 Redis 存储计数):
from flask import Flask
from redis import Redisapp = Flask(__name__)
redis = Redis(host='redis', port=6379) # 连接 Redis 服务(服务名作为主机名)@app.route('/')
def hello():redis.incr('hits') # 每次访问计数 +1return f'Hello! This page has been visited {redis.get("hits").decode("utf-8")} times.'if __name__ == "__main__":app.run(host="0.0.0.0", port=5000)
步骤 3:编写 Flask 容器的 Dockerfile
app/Dockerfile
(构建 Flask 应用镜像):
# 基础镜像
FROM python:3.9-slim# 工作目录
WORKDIR /app# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir flask redis# 复制应用代码
COPY . .# 启动命令
CMD ["python", "app.py"]
需在 app
目录下创建 requirements.txt
:
flask==2.0.1
redis==4.1.0
步骤 4:编写 docker-compose.yml 配置文件
docker-compose.yml
(定义两个服务:web
(Flask)和 redis
):
version: '3.8' # Compose 版本(可选,默认使用最新)services:# Flask 服务web:build: ./app # 从 ./app 目录的 Dockerfile 构建镜像ports:- "5000:5000" # 宿主机端口:容器端口(外部可通过 localhost:5000 访问)depends_on:- redis # 依赖 redis 服务,启动时先启动 redisnetworks:- app-network # 加入自定义网络# Redis 服务(直接使用官方镜像)redis:image: redis:6-alpine # 使用 Redis 官方轻量镜像volumes:- redis-data:/data # 挂载卷到容器 /data 目录(持久化 Redis 数据)networks:- app-network # 加入自定义网络# 自定义网络(服务间通信)
networks:app-network:driver: bridge # 桥接网络(默认类型)# 持久化卷(存储 Redis 数据)
volumes:redis-data:
步骤 5:使用 Docker Compose 操作应用
-
启动应用(创建并启动所有服务):
# 前台启动(日志会输出到终端,按 Ctrl+C 停止) docker compose up# 后台启动(推荐) docker compose up -d
-
验证应用:
访问http://localhost:5000
,会显示访问次数,且刷新后计数递增(数据存储在 Redis 中)。 -
查看运行状态:
docker compose ps # 查看所有服务状态
-
查看日志:
docker compose logs # 查看所有服务日志 docker compose logs web # 只查看 web 服务日志
-
进入容器内部(例如进入 web 容器):
docker compose exec web sh # 进入 web 容器的 shell
-
停止并清理应用:
# 停止服务(保留容器、网络、卷) docker compose stop# 停止并删除容器、网络(保留卷,数据不丢失) docker compose down# 停止并删除所有(包括卷,数据会丢失) docker compose down -v
五、常用 Docker Compose 命令总结
命令 | 作用 |
---|---|
docker compose up | 创建并启动所有服务(前台) |
docker compose up -d | 后台启动服务 |
docker compose down | 停止并删除容器、网络 |
docker compose ps | 查看运行的服务 |
docker compose logs | 查看服务日志 |
docker compose exec <服务名> <命令> | 在指定服务容器中执行命令 |
docker compose restart <服务名> | 重启指定服务(默认所有) |
docker compose build | 重新构建服务镜像 |
六、总结
Docker Compose 核心价值在于简化多容器应用的管理,通过配置文件实现「一次编写,到处运行」,尤其适合开发环境和小型部署场景。掌握它可以大幅提升多容器应用的开发和运维效率。