Docker Compose 简介

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,通过 YAML 文件(docker-compose.yml)描述服务、网络、存储等资源的配置,实现一键式环境部署。调用Docker服务提供的API来对容器进行管理。负责实现对Docker容器集群的快速编排。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

解决的问题

  • 简化多容器应用的启动、停止和重建流程。
  • 统一管理容器间的依赖关系和资源隔离。
  • 支持环境变量配置,实现开发、测试、生产环境的一致性。

典型使用场景‌

使用场景 描述
本地开发环境 - 快速启动包含前端、后端、数据库的完整环境。 - 支持热重载代码调试(如挂载宿主机的代码目录)。
自动化测试 - 在 CI/CD 流水线中启动临时测试环境,运行集成测试。
微服务架构 - 定义多个关联服务(API Gateway、Auth Ser展:异主容器互vice、Database 等)。
演示与教学 - 一键部署复杂应用栈(如 WordPress + MySQL + Redis)。

扩展阅读‌
官方文档‌:https://docs.docker.com/compose/
最佳实践‌:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Compose 示例仓库‌:https://github.com/docker/awesome-compose

安装docker-compose

# echo "20.205.243.166 github.com" >> /etc/hosts
# curl -SL https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:31 --:--:--     0
100 58.5M  100 58.5M    0     0   468k      0  0:02:07  0:02:07 --:--:-- 1079k
# chmod +x /usr/local/bin/docker-compose 
# docker-compose --version
Docker Compose version v2.24.6

创建一个简单的compose文件

# docker-compose.yml
version: '3.8'  # Compose 文件版本(推荐 3.8,兼容主流 Docker 版本)
services:       # 定义所有服务
  nginx:        # 服务名(自定义)
    image: nginx:alpine  # 使用的镜像
    ports:      # 端口映射(宿主端口:容器端口)
      - "8080:80"
    restart: always  # 容器退出后自动重启

二、核心知识点(重点必掌握)

1. 配置文件核心规则

  • 文件名:默认 docker-compose.yml(必须,大小写敏感)

  • 版本:推荐 3.8(兼容 Docker 19.03+,版本需与Docker版本匹配,过高/过低会解析失败)

  • YAML 语法(严格要求,新手最易踩坑):

    • 缩进必须用 空格(2个或4个,统一风格),禁止用Tab

    • 键值对冒号 : 后面必须加空格(如 image: nginx 而非 image:nginx

    • 列表项 - 后面必须加空格(如 - "80:80"

  • 服务名即DNS:同一网络内,服务之间可直接用「服务名」访问(无需记IP,如MySQL服务名是mysql,后端配置DB_HOST=mysql即可连接)

2. 必背核心字段(yml文件核心)

字段 作用 示例
services 定义所有服务(容器),Compse核心节点 services:  nginx:   image: nginx
image 指定服务使用的官方/自定义镜像(优先使用) image: nginx:alpineimage: mysql:8.0
build 基于本地Dockerfile构建镜像(替代image字段) build:  context: ./backend  dockerfile: Dockerfile
ports 端口映射(宿主机端口:容器端口),避免端口冲突 ports:  - “8080:80”  - “3306:3306”
volumes 数据持久化(避免容器删除数据丢失),分2种类型 # 命名卷(推荐)volumes:  mysql-data:services:  mysql:    volumes:      - mysql-data:/var/lib/mysql# 绑定挂载(开发用)      - ./html:/usr/share/nginx/html
environment 设置环境变量(替代docker run -e),支持引用.env文件 environment:  - MYSQL_ROOT_PASSWORD=123456  - MYSQL_DATABASE=demo_db
depends_on 控制服务启动顺序(不保证服务就绪) depends_on:  - mysql  - redis
healthcheck 验证服务是否真正就绪(配合depends_on使用) healthcheck:  test: [“CMD”, “mysqladmin”, “ping”, “-h”, “localhost”]  interval: 5s  timeout: 5s  retries: 5
networks 自定义网络,实现服务隔离(避免不同项目冲突) networks:  app-net:    driver: bridge
restart 容器重启策略(保证服务稳定性) restart: always(始终重启)restart: on-failure(失败时重启)

3. 环境变量配置(.env文件,企业级规范)

作用:分离敏感信息(密码、密钥),避免直接写在yml文件中,便于维护和切换环境。

步骤1:创建.env文件

# .env 文件内容(无需缩进,key=value格式)
MYSQL_ROOT_PASSWORD=root123
MYSQL_DATABASE=demo_db
APP_PORT=8080
REDIS_PWD=123456

步骤2:在docker-compose.yml中引用

environment:
  - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
  - MYSQL_DATABASE=${MYSQL_DATABASE}
ports:
  - "${APP_PORT}:8080"

优先级:docker-compose up -e 临时变量 > .env文件 > environment字段 > Dockerfile ENV

4. 多环境配置(开发/生产分离)

核心:避免重复编写yml文件,用「基础配置+环境配置」拆分,灵活切换环境。

文件结构

  • docker-compose.yml:基础配置(通用部分,如服务名、数据卷、网络)

  • docker-compose.dev.yml:开发环境配置(暴露端口、调试模式、热更新)

  • docker-compose.prod.yml:生产环境配置(隐藏端口、资源限制、生产模式)

启动命令

# 启动开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

# 启动生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

三、高频常用命令(必背,实战必备)

命令 作用 补充说明
docker-compose up 启动所有服务(前台运行) Ctrl+C 可停止服务
docker-compose up -d 后台启动所有服务(推荐) 启动后不占用终端
docker-compose down 停止并删除容器、网络 保留数据卷(安全)
docker-compose down -v 停止并删除容器、网络、数据卷 谨慎使用,会丢失持久化数据
docker-compose ps 查看当前项目的容器状态 可快速查看服务是否正常运行
docker-compose logs 查看所有服务日志 排查服务启动失败问题
docker-compose logs -f 服务名 实时查看指定服务日志 如 docker-compose logs -f backend
docker-compose exec 服务名 命令 进入容器执行命令 如 docker-compose exec mysql bash(进入MySQL容器)
docker-compose restart 服务名 重启指定服务 不重启其他无关服务
docker-compose build 构建/重新构建服务镜像 修改Dockerfile后必须执行
docker-compose config 验证yml配置文件语法是否正确 启动前先验证,避免语法错误

实战案例(可直接复制运行,覆盖核心场景)

案例1:基础版 - Nginx + 静态网页(快速上手)

目录结构

nginx-demo/
├── docker-compose.yml
└── html/
    └── index.html

1. index.html(静态网页)

<!DOCTYPE html>
<html>
<head>
    <title>Docker Compose Demo</title>
</head>
<body>
    <h1>Hello Docker Compose!</h1>
</body>
</html>

2. docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:alpine  # 轻量版Nginx,占用资源少
    container_name: nginx-demo  # 自定义容器名,便于识别
    ports:
      - "8080:80"  # 宿主机8080端口映射容器80端口
    volumes:
      - ./html:/usr/share/nginx/html  # 绑定挂载,本地修改实时生效
    restart: always  # 容器退出后自动重启
    networks:
      - nginx-net

networks:
  nginx-net:
    driver: bridge

3. 启动与验证

# 进入目录
cd nginx-demo
# 启动服务
docker-compose up -d
# 验证(浏览器访问 http://localhost:8080 或用curl)
curl http://localhost:8080
# 停止服务
docker-compose down

未完待续。。。下一篇章进阶实战

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐