banner
约 1,200 字
4 分钟

Docker Compose 教程:一个文件管住所有容器

摘要

Docker Compose 用一个 YAML 文件编排多容器应用。本教程依据 Docker 官方文档,介绍 compose.yaml 的服务/网络/数据卷写法(WordPress+MySQL 实例)、up/down/logs 核心命令、升级流程 pull+up -d、build 直构建代码,以及 restart: always 实现开机自启。

Docker Compose 教程:一个文件编排所有容器

真实项目从来不是单容器:博客要配数据库,应用要配缓存,再加个反代。手动逐个 docker run 又长又容易错。Docker Compose 用一个 YAML 文件把整组服务定义下来,一条命令全部拉起。本教程依据 Docker 官方文档(docs.docker.com/compose)整理。

一、安装确认

新版 Docker Desktop 和 get.docker.com 脚本安装的 Docker Engine 都自带 Compose 插件,验证:

bash
docker compose version

能输出版本号即可,命令统一用 docker compose(带空格,旧版 docker-compose 已是遗留写法)。

二、第一个 compose.yaml

以"WordPress + MySQL"经典组合为例,在项目目录建 compose.yaml(旧名 docker-compose.yml 同样有效):

YAML
services:
  db:
    image: mysql:8.4
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 改掉我
      MYSQL_DATABASE: wordpress
    volumes:
      - db_data:/var/lib/mysql

  web:
    image: wordpress:latest
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_PASSWORD: 改掉我
    depends_on:
      - db

volumes:
  db_data:

注意 WORDPRESS_DB_HOST 直接写了 db——同一 compose 文件里的服务自动在同一个网络里,用服务名就能互相访问,这是 Compose 最大的便利。

三、核心命令

bash
docker compose up -d      # 后台创建并启动所有服务
docker compose ps         # 查看本项目的容器
docker compose logs -f    # 跟踪所有服务日志
docker compose logs -f web # 只看某个服务
docker compose restart    # 重启
docker compose down       # 停止并删除容器(默认保留数据卷)
docker compose down -v    # 连数据卷一起删(数据没了,慎用)
docker compose pull       # 拉取最新镜像

升级应用的完整流程

bash
docker compose pull && docker compose up -d

Compose 会只重建镜像变化的容器,数据卷原样保留。

四、自建镜像的项目

应用代码不需要先打成镜像再推仓库,Compose 可以直接构建:

YAML
services:
  app:
    build: .            # 用当前目录的 Dockerfile 构建
    ports:
      - "3000:3000"

改了代码后 docker compose up -d --build 重新构建并滚动更新。

五、restart 策略

restart: always 让容器开机自启、崩溃自动拉起——配合 Docker 的 live-restore,服务器重启后你的整套服务自动恢复,无需写任何 systemd 或 crontab。个人自托管服务建议统一加上。

六、总结

需求

命令

启动全套服务

docker compose up -d

看日志

docker compose logs -f

停止清理

docker compose down

升级应用

pull && up -d

改代码重跑

up -d --build

开机自启

每个服务加 restart: always

写好一个 compose.yaml,部署就从"一长串命令"变成"拷文件、up -d"。这也是自托管社区分享服务的通用格式——以后看到别人的 compose 文件,直接就能用起来。

END