核心理念
如果说 Docker 是管理单个“集装箱”(容器)的工具,那么 Docker Compose 就是管理一个由多个集装箱组成的“船队”的总指挥。
你只需在一个 YAML 配置文件中定义好你的整个应用(比如一个 web 服务器、一个数据库、一个缓存服务),然后用一条命令就能同时启动、停止或重建所有这些服务。
一、docker-compose.yml 文件基本结构
这是 Docker Compose 的核心。它是一个名为 docker-compose.yml 的文本文件,使用 YAML 格式来定义你的多服务应用。
一个基本的文件结构如下:
1 | # 可选:指定 compose 文件版本,现代版本中通常可以省略 |
常用字段说明 (Common Fields Explained)
下表解释了 docker-compose.yml 文件中最常用的一些字段:
| 字段 (Field) | 说明 (Description) | 示例 (Example) |
|---|---|---|
services |
[顶级] 所有服务(容器)定义的根节点。 | services: |
image |
指定服务使用的 Docker 镜像,可以来自 Docker Hub 或其他仓库。 | image: node:18-alpine |
container_name |
为容器指定一个自定义的、易于记忆的名称。 | container_name: my_api_server |
build |
指定 Dockerfile 所在的路径。Compose 会使用它来构建一个新镜像。 |
build: . 或 build: ./backend |
ports |
将主机的端口映射到容器的端口。格式:"主机端口:容器端口"。 |
ports: - "3000:80" |
volumes |
挂载主机路径或命名卷到容器内,用于数据持久化或共享文件。 | - ./config:/app/config - db_data:/var/lib/mysql |
environment |
设置环境变量。可以直接写入,也可以从 .env 文件加载。 |
- NODE_ENV=production - DB_HOST=database |
restart |
定义容器退出时的重启策略。常用值:no, always, unless-stopped, on-failure。 |
restart: unless-stopped |
depends_on |
定义服务之间的依赖关系,确保被依赖的服务先于当前服务启动。 | depends_on: - redis - db |
volumes |
[顶级] 用于声明在 services 中使用的命名卷 (named volumes)。 |
volumes: <br> db_data: |
networks |
[顶级] 用于定义自定义网络,让服务在隔离的环境中通信。 | networks: <br> my_app_net: |
二、核心命令备忘单
重要提示:在执行这些命令之前,请确保你位于包含 docker-compose.yml 文件的目录中。
启动并创建服务 (前台模式)
1 | docker-compose up |
功能: 在前台启动所有服务。你会看到所有容器的日志实时输出到终端。按 Ctrl + C 可以停止。
在后台启动并创建服务
1 | docker-compose up -d |
功能: 这是最常用的启动方式。-d (detach) 参数让所有容器在后台运行。
停止并移除服务
1 | docker-compose down |
功能: 停止并删除由 up 命令创建的容器、网络。如果加上 -v 参数 (docker-compose down -v),还会删除关联的卷,请谨慎使用。
查看服务状态
1 | docker-compose ps |
功能: 列出当前 Compose 项目中所有容器的运行状态。
查看服务日志
1 | docker-compose logs |
功能: 查看所有服务的日志。
- 持续跟踪日志:
docker-compose logs -f - 查看特定服务的日志:
docker-compose logs -f webserver
停止服务
1 | docker-compose stop |
功能: 仅仅停止正在运行的服务(容器),但不会删除它们。
启动已停止的服务
1 | docker-compose start |
功能: 启动之前用 stop 命令停止的服务。
重建服务镜像
1 | docker-compose up --build |
功能: 如果你修改了某个服务的 Dockerfile,使用此命令会在启动前强制重新构建该服务的镜像。
在服务容器内执行命令
1 | docker-compose exec <服务名> <命令> |
功能: 相当于 docker exec,但你使用的是服务名而不是容器名。非常适合进入容器进行调试。
示例: docker-compose exec database psql -U myuser -d mydb (进入数据库命令行)
示例: docker-compose exec webserver /bin/bash (进入 web 服务器的 shell)
三、简单实用示例
示例1:部署一个简单的 Nginx 网站服务器
创建一个目录,比如
my_nginx_site。在目录下创建一个
docker-compose.yml文件:1
2
3
4
5
6
7
8
9
10version: '3.8'
services:
web:
image: nginx:alpine
container_name: simple_nginx
ports:
- "80:80"
volumes:
# 将当前目录下的 html 文件夹挂载到 Nginx 的网站根目录
- ./html:/usr/share/nginx/html在同级目录下创建一个
html文件夹,并在里面放一个index.html文件:1
2
3<!-- ./html/index.html -->
<html><body><h1>Hello from Docker Compose!</h1></body></html>在
my_nginx_site目录下运行docker-compose up -d,然后访问http://localhost。
示例2:部署一个 Postgres 数据库
创建一个目录,比如
my_db。在目录下创建一个
docker-compose.yml文件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17version: '3.8'
services:
db:
image: postgres:15-alpine
container_name: my_database
restart: always
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: myapp_db
ports:
- "5432:5432"
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:在
my_db目录下运行docker-compose up -d。现在,一个带有持久化存储的 Postgres 数据库就在后台运行了。你可以使用任何数据库客户端工具通过
localhost:5432连接到它,用户名是admin,密码是mysecretpassword。
掌握了 Docker Compose,你就能像管理乐高积木一样轻松地组合和管理你的应用程序了。祝你玩得愉快!