IndieBits - 独立开发碎碎念

探索海外独立开发 | 学习 · 思考 · 实践

Docker Compose 新手快速上手备忘单 (Cheat Sheet)

核心理念

如果说 Docker 是管理单个“集装箱”(容器)的工具,那么 Docker Compose 就是管理一个由多个集装箱组成的“船队”的总指挥

你只需在一个 YAML 配置文件中定义好你的整个应用(比如一个 web 服务器、一个数据库、一个缓存服务),然后用一条命令就能同时启动、停止或重建所有这些服务。


一、docker-compose.yml 文件基本结构

这是 Docker Compose 的核心。它是一个名为 docker-compose.yml 的文本文件,使用 YAML 格式来定义你的多服务应用。

一个基本的文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 可选:指定 compose 文件版本,现代版本中通常可以省略
version: '3.8'

# 定义你应用中的所有服务(容器)
services:

# 你的第一个服务,名字可以自定义 (例如: web, db, api)
webserver:
# 使用哪个镜像来构建这个服务
image: nginx:latest
# 容器的名称,方便识别
container_name: my_nginx_server
# 端口映射 <主机端口>:<容器端口>
ports:
- "8080:80"
# 卷挂载,用于数据持久化或挂载配置文件
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
# 设置环境变量
environment:
- NGINX_HOST=example.com
# 定义重启策略
restart: always
# 定义服务依赖关系
depends_on:
- database

# 你的第二个服务
database:
image: postgres:15
container_name: my_postgres_db
restart: unless-stopped
environment:
# !! 重要:不要在生产中硬编码密码,应使用 secrets 或 .env 文件
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
- POSTGRES_DB=mydb
volumes:
# 将名为 pgdata 的 docker 卷挂载到容器内的数据目录
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"

# (可选)在顶层定义可复用的卷
volumes:
pgdata:

# (可选)在顶层定义可复用的网络
networks:
default:

常用字段说明 (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> &nbsp;&nbsp;db_data:
networks [顶级] 用于定义自定义网络,让服务在隔离的环境中通信。 networks: <br> &nbsp;&nbsp;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 网站服务器

  1. 创建一个目录,比如 my_nginx_site

  2. 在目录下创建一个 docker-compose.yml 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    version: '3.8'
    services:
    web:
    image: nginx:alpine
    container_name: simple_nginx
    ports:
    - "80:80"
    volumes:
    # 将当前目录下的 html 文件夹挂载到 Nginx 的网站根目录
    - ./html:/usr/share/nginx/html
  3. 在同级目录下创建一个 html 文件夹,并在里面放一个 index.html 文件:

    1
    2
    3
    <!-- ./html/index.html -->
    <!DOCTYPE html>
    <html><body><h1>Hello from Docker Compose!</h1></body></html>
  4. my_nginx_site 目录下运行 docker-compose up -d,然后访问 http://localhost

示例2:部署一个 Postgres 数据库

  1. 创建一个目录,比如 my_db

  2. 在目录下创建一个 docker-compose.yml 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    version: '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:
  3. my_db 目录下运行 docker-compose up -d

  4. 现在,一个带有持久化存储的 Postgres 数据库就在后台运行了。你可以使用任何数据库客户端工具通过 localhost:5432 连接到它,用户名是 admin,密码是 mysecretpassword


掌握了 Docker Compose,你就能像管理乐高积木一样轻松地组合和管理你的应用程序了。祝你玩得愉快!

0%