Docker

Docker Compose 工作流

多容器服务优先写成 Compose 项目,让配置、数据、网络和更新过程都能被重复执行。

官方参考

什么时候用 Compose

这些场景优先用 Compose:

  • 一个应用需要数据库、缓存、反向代理等多个容器。
  • 需要长期运行,后续要更新、备份和迁移。
  • 需要把端口、环境变量、卷和网络写成可复用配置。
  • 需要在不同机器上重复部署同一套服务。

临时测试可以用 docker run,长期服务建议写进 compose.yml

目录结构

推荐一个服务一个目录:

app-stack/
├── compose.yml
├── .env
├── data/
├── config/
└── backups/

用途说明:

路径用途
compose.yml服务、网络、卷、端口和环境变量
.env本地变量和密钥,不提交真实值
data/绑定挂载的数据目录
config/可编辑配置文件
backups/手动备份输出

最小 Compose 示例

services:
  web:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./site:/usr/share/nginx/html:ro

启动:

docker compose up -d

查看状态:

docker compose ps

查看日志:

docker compose logs -f --tail=120

停止并移除容器和默认网络:

docker compose down

带数据库的示例

services:
  app:
    image: example/app:latest
    restart: unless-stopped
    depends_on:
      - db
    environment:
      APP_DATABASE_HOST: db
      APP_DATABASE_PASSWORD: ${APP_DATABASE_PASSWORD}
    ports:
      - "8080:8080"
    volumes:
      - ./data/app:/app/data

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${APP_DATABASE_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

.env 示例只写变量名:

APP_DATABASE_PASSWORD=change-me

启动前检查

先让 Compose 展开并校验配置:

docker compose config

再启动:

docker compose up -d

启动后确认:

docker compose ps
docker compose logs --tail=120

更新流程

通用更新:

docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=120

如果镜像由本地 Dockerfile 构建:

docker compose build
docker compose up -d

强制重建单个服务:

docker compose up -d --build service-name

备份流程

备份绑定挂载目录:

mkdir -p backups
tar czf backups/app-data.tar.gz data/

备份命名卷:

mkdir -p backups

docker run --rm \
  -v app-stack_db-data:/data:ro \
  -v "$PWD/backups:/backup" \
  alpine \
  tar czf /backup/db-data.tar.gz -C /data .

数据库最好使用数据库自己的导出工具。例如 PostgreSQL 可以在对应容器中执行 pg_dump,MySQL 可以使用 mysqldump

回滚思路

回滚前先保留现场:

docker compose ps
docker compose logs --tail=200 > backups/last-error.log

常见回滚方式:

  1. 把镜像 tag 改回上一个版本。
  2. 恢复更新前的 compose.yml
  3. 如涉及数据迁移,按备份恢复数据库或数据目录。
  4. 执行 docker compose up -d
  5. 检查页面、日志和核心功能。

生产发布检查

发布后至少检查:

  • docker compose ps 中核心服务都在运行。
  • docker compose logs --tail=120 没有持续错误。
  • 端口映射没有冲突。
  • 需要持久化的数据已经挂载。
  • 反向代理可以访问上游服务。
  • 外部域名、HTTPS、回源和缓存都正常。

慎用命令

这些命令需要先确认影响范围:

命令风险
docker compose down -v删除 Compose 声明的命名卷和匿名卷
docker volume prune删除所有未使用卷
docker image prune -a删除所有未使用镜像,可能导致下次启动重新拉取
docker system prune -a --volumes同时清理镜像、容器、网络、构建缓存和未使用卷