好的,这是一份清晰、实用的 Docker Compose 入门指南,聚焦于用单个文件管理多容器应用


Docker Compose 入门:用一个文件管理多容器应用

核心问题:当应用由多个相互依赖的服务(如 Web 服务器、数据库、缓存)组成时,手动使用 docker run 逐个启动和管理容器非常繁琐且容易出错。

解决方案Docker Compose。它允许你使用一个 YAML 格式的文件 (docker-compose.yml) 定义和配置所有相关的服务、网络、卷等。通过一个命令,即可启动、停止或重建整个应用栈。

核心优势
  1. 单文件定义:所有服务及其配置(镜像、端口、环境变量、依赖关系、网络、数据卷)集中在一个文件中。
  2. 一键操作docker compose up 启动所有服务;docker compose down 停止并清理所有资源。
  3. 环境一致性:无论在开发、测试还是生产环境,使用相同的 Compose 文件能保证应用运行环境一致。
  4. 简化协作:共享一个 docker-compose.yml 文件即可让团队成员快速搭建起相同的应用环境。

关键概念与 docker-compose.yml 结构

一个典型的 docker-compose.yml 文件包含以下主要部分:

  1. version (必需):指定 Compose 文件格式的版本(如 "3.8")。版本决定了可用的功能。
  2. services (必需):定义你的应用包含哪些容器(服务)。
    • <service_name> (例如 web, db): 自定义的服务名称。
      • image: 指定要使用的 Docker 镜像 (如 nginx:latest, postgres:13).
      • build: 如果需从 Dockerfile 构建镜像,指定构建上下文路径 (如 context: .).
      • ports: 将容器端口映射到主机端口 (格式: "HOST_PORT:CONTAINER_PORT", 如 "8080:80").
      • volumes: 挂载主机目录或命名卷到容器 (格式: "HOST_PATH:CONTAINER_PATH"volume_name:CONTAINER_PATH).
      • environment: 设置容器内的环境变量 (可直接写键值对或用 env_file 指定文件).
      • depends_on: 声明服务之间的启动依赖关系 (如 db 服务必须在 web 服务之前启动).
      • networks: 指定服务连接到的网络。
      • restart: 定义容器退出时的重启策略 (如 always, on-failure).
  3. volumes (可选):声明需要使用的命名数据卷。Compose 会自动创建和管理它们。
  4. networks (可选):声明需要使用的自定义网络。默认会创建一个与应用栈同名的网络,所有服务自动加入其中并可通过服务名相互访问。

实战示例:构建一个简单的 Web + Redis 应用

假设我们有一个简单的 Web 应用 (app.py) 使用 Flask 框架,它需要一个 Redis 服务来存储访问计数。

  1. 项目结构:

    myapp/
    ├── app.py         # Flask 应用代码
    ├── requirements.txt # Python 依赖
    ├── Dockerfile     # 用于构建 Web 应用镜像
    └── docker-compose.yml # Compose 配置文件
    

  2. app.py (简化版):

    from flask import Flask
    from redis import Redis
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379) # 注意主机名是服务名 'redis'
    @app.route('/')
    def hello():
        count = redis.incr('hits')
        return f'Hello World! I have been seen {count} times.'
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    

  3. Dockerfile (构建 Web 镜像):

    FROM python:3.9-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    COPY . .
    CMD ["python", "app.py"]
    

    (requirements.txt 包含 flaskredis)

  4. 核心:docker-compose.yml:

    version: '3.8'  # 指定 Compose 文件格式版本
    
    services:
      web:
        build: .  # 使用当前目录下的 Dockerfile 构建镜像
        ports:
          - "8000:5000"  # 映射主机 8000 端口 -> 容器 5000 端口 (Flask 默认端口)
        depends_on:
          - redis  # 声明依赖,确保 redis 服务先启动
        networks:
          - app-network  # 加入自定义网络
    
      redis:
        image: "redis:alpine"  # 使用官方的 Redis Alpine 镜像
        networks:
          - app-network  # 加入同一个网络
        # Redis 数据默认存储在容器内,生产环境建议添加 volumes
    
    networks:
      app-network:  # 定义自定义网络
        driver: bridge
    

    关键点解析

    • web 服务:基于当前目录 (build: .) 构建镜像,将主机的 8000 端口映射到容器的 5000 端口。
    • redis 服务:直接拉取官方 redis:alpine 镜像运行。
    • depends_on: - redis:确保 redis 容器先于 web 容器启动。
    • networks: 定义了一个名为 app-network 的桥接网络,两个服务都加入其中。在同一个 Compose 网络中的容器,可以通过服务名 (redis) 直接通信,无需知道 IP 地址。
  5. 启动应用栈: 在包含 docker-compose.yml 的目录 (myapp/) 下运行:

    docker compose up -d  # -d 表示在后台运行 (detached mode)
    

    输出示例

    [+] Building 15.3s (10/10) FINISHED
    [+] Running 3/3
     ✔ Network myapp_app-network    Created
     ✔ Container myapp-redis-1      Started
     ✔ Container myapp-web-1        Started
    

  6. 验证

    • 打开浏览器访问 http://localhost:8000,应该能看到显示访问次数的 "Hello World!" 页面,刷新页面次数会增加。
    • 查看运行中的容器:docker compose ps
    • 查看日志 (特定服务):docker compose logs webdocker compose logs redis
    • 查看所有日志:docker compose logs
  7. 停止并清理

    docker compose down  # 停止并移除容器、网络(默认不移除卷和镜像)
    

    可选参数

    • docker compose down --volumes:同时移除在 volumes 部分声明的命名卷。
    • docker compose down --rmi all:同时移除由 Compose 构建的本地镜像。

常用命令速查
命令作用
docker compose up -d构建镜像(如果需要),创建并启动所有服务(后台运行)
docker compose down停止并移除所有容器、网络
docker compose ps列出项目相关的所有容器
docker compose logs [service]查看服务的日志输出 (-f 跟踪实时日志)
docker compose exec [service] [cmd]在运行中的容器内执行命令 (如 docker compose exec web bash)
docker compose build [service]重新构建服务的镜像
docker compose pull [service]拉取服务所需的镜像
docker compose config验证并查看解析后的 Compose 文件配置
docker compose stop停止运行中的容器,但不移除资源
docker compose start启动已停止的容器
docker compose restart [service]重启服务

总结

Docker Compose 通过 docker-compose.yml 这个单一配置文件,革命性地简化了多容器 Docker 应用的管理。它定义了:

  1. 应用所需的所有服务及其详细配置(镜像、端口、环境变量等)。
  2. 服务间的依赖关系 (depends_on)。
  3. 共享的网络(服务间通过服务名通信)。
  4. 持久化数据卷。 使用 docker compose updocker compose down 即可一键管理整个应用栈的生命周期,极大地提升了开发、测试和部署复杂容器化应用的效率和一致性。它是现代容器化开发工作流中不可或缺的工具。

更多推荐