Docker Compose 实战指南:从配置到多容器联动的全流程解析

发布于:2025-08-09 ⋅ 阅读:(19) ⋅ 点赞:(0)

Docker Compose 理解

一、什么是 Docker Compose?

Docker Compose 是 Docker 官方提供的工具,用于定义和运行多容器 Docker 应用。通过一个 YAML 格式的配置文件(docker-compose.yml),可以声明应用所需的所有服务(容器)、网络、存储卷等,然后通过单条命令即可创建、启动、停止所有服务。

二、为什么需要 Docker Compose?

当应用依赖多个容器时(例如:Web 应用 + 数据库 + 缓存),手动管理容器存在以下问题:

  • 需逐个启动容器,指定网络、端口映射、环境变量等参数,步骤繁琐;
  • 容器间依赖关系需手动维护(如:先启动数据库,再启动 Web 应用);
  • 配置参数分散,难以复用和版本控制。

Docker Compose 解决了这些问题:通过统一配置文件管理所有依赖,实现一键部署、环境一致、配置可复用

三、核心概念

Docker Compose 配置文件(docker-compose.yml)主要包含 3 个核心部分:

  1. services(服务):定义应用依赖的容器(如 web 服务、db 服务),每个服务对应一个容器配置(镜像、端口、环境变量等)。
  2. networks(网络):定义容器间的通信网络,默认会创建一个桥接网络,服务间可通过服务名互相访问。
  3. 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 Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)  # 连接 Redis 服务(服务名作为主机名)

@app.route('/')
def hello():
    redis.incr('hits')  # 每次访问计数 +1
    return 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 服务,启动时先启动 redis
    networks:
      - 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 操作应用
  1. 启动应用(创建并启动所有服务):

    # 前台启动(日志会输出到终端,按 Ctrl+C 停止)
    docker compose up
    
    # 后台启动(推荐)
    docker compose up -d
    
  2. 验证应用
    访问 http://localhost:5000,会显示访问次数,且刷新后计数递增(数据存储在 Redis 中)。

  3. 查看运行状态

    docker compose ps  # 查看所有服务状态
    
  4. 查看日志

    docker compose logs  # 查看所有服务日志
    docker compose logs web  # 只查看 web 服务日志
    
  5. 进入容器内部(例如进入 web 容器):

    docker compose exec web sh  # 进入 web 容器的 shell
    
  6. 停止并清理应用

    # 停止服务(保留容器、网络、卷)
    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 核心价值在于简化多容器应用的管理,通过配置文件实现「一次编写,到处运行」,尤其适合开发环境和小型部署场景。掌握它可以大幅提升多容器应用的开发和运维效率。


网站公告

今日签到

点亮在社区的每一天
去签到