docker-compose.yml 是 Docker Compose 的核心配置文件,采用 YAML 格式,主要用来定义多容器应用的服务、网络和存储卷。
先说结论:它是告诉 Compose 工具“要启动哪些容器、每个容器怎么配置”的说明书,通过声明式语法实现容器编排。
- 适合:需要同时启动 Web、数据库等多个关联容器的场景,解决手动逐个启动的痛点。
- 先准备:确保已安装 Docker 和 Compose 工具,编写时注意 YAML 缩进格式,避免混用 Tab 和空格。
- 验收:运行后通过 docker-compose ps 确认所有服务状态为 Up,且端口映射和网络通信正常。
命令速用版
在包含 docker-compose.yml 的目录下,可以直接使用以下命令管理生命周期:
# 检查配置文件语法是否正确
docker-compose config
# 启动所有服务(后台运行)
docker-compose up -d
# 查看服务运行状态
docker-compose ps
# 停止并删除容器
docker-compose down为什么会这样
Docker Compose 的定位是定义和运行多个 Docker 容器的应用。日常工作中经常碰到多个容器相互配合完成任务的情况,例如 Web 项目除了服务容器本身,往往还要加上后端的数据库服务容器。
配置文件采用 YAML 格式,语法简洁,靠缩进和键值对组织。核心结构包含三个关键层级:
- version:指定 Compose 文件的版本,需和 Docker Compose 版本兼容,常用 3.x 系列。
- services:定义所有需要运行的容器(服务),是文件的核心部分。
- volumes/networks:可选配置,定义共享数据卷和自定义网络,用于容器间通信或数据持久化。
理解两个重要概念有助于更好地使用它:一个是“服务(service)”,一个应用的容器,实际可以包括若干运行相同镜像的容器实例;另一个是“项目(project)”,由一组关联的应用容器组成的完整业务单元,在文件中定义。
分步处理
编写配置文件时,建议按照以下结构逐步完善:
1. 指定版本
在文件开头声明版本,例如:
version: "3.8"2. 定义服务
在 services 下列出每个容器。每个服务都必须通过 image 指令指定镜像,或通过 build 指令自动构建。如果使用 build 指令,Dockerfile 中设置的选项将会自动被获取,无需重复设置。
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: postgres:12
environment:
- POSTGRES_PASSWORD=secret3. 配置依赖与网络
如果服务之间有启动顺序要求,可以使用 depends_on。需要隔离网络时,可在顶层定义 networks 并在服务中引用。
services:
app:
depends_on:
- db
networks:
- my_network
networks:
my_network:
driver: bridge怎么验证是否生效
配置完成后,不要直接盲目启动,先进行语法检查和状态确认:
- 语法检查:运行
docker-compose config,如果没有报错输出,说明 YAML 格式和逻辑基本正确。 - 状态确认:启动后运行
docker-compose ps,查看 NAME 和 STATE 列,确保所有服务状态显示为 Up。 - 连通性测试:在服务容器内 ping 其他服务名称(如 db),确认自定义网络或默认网络通信正常。
常见坑
- 缩进错误:YAML 对缩进非常敏感,必须使用空格且层级对齐,混用 Tab 会导致解析失败。
- 版本兼容:version 字段需和安装的 Docker Compose 版本兼容,过高或过低都可能无法识别。
- 镜像缺失:每个服务必须指定 image 或 build,如果既没有镜像来源也没有构建路径,容器无法创建。
- 端口冲突:映射主机端口时(如 8080:80),需确保主机该端口未被其他程序占用。
参考来源
- Docker 笔记 - 对 docker-compose.yml 基本认识
- Docker Compose 配置文件详解:docker-compose.yml 实战指南
- docker-compose.yml 文件详解——AI 教你学 Docker
- Dcoker Compose 模板文件详解
- Docker 多容器编排:Compose 实战教程
- docker-compose 文件详解以及常用命令
- 【容器编排魔法】Docker 容器编排神器 Componse 完全解析!
- Docker-Compose 概述
- Dockerfile 与 Compose 环境搭建学习笔记 (一)