Skip to content

Compose 基础

目录约定

一个服务一个目录,里面放 docker-compose.yml.env

/opt/app/
├── docker-compose.yml
├── .env
└── data/

在这个目录里跑 docker compose 命令,它会自动读同目录的两个文件。

常用命令

bash
docker compose up -d           # 起来
docker compose down            # 停并删容器(数据卷保留)
docker compose pull            # 拉新镜像
docker compose logs -f app     # 看某个服务日志
docker compose ps
docker compose exec app sh     # 进容器

改了 .env 用 restart 不生效

.env 是在创建容器时读的。docker compose restart 只是重启进程,不重建容器,所以新值不会进去。

downup -d。这个坑踩过不止一次。

镜像 tag 钉在哪

yaml
image: vendor/app:2        # 只会跟 2.x 分支
image: vendor/app:2.3.1    # 钉死
image: vendor/app:latest   # 跟最新,大版本升级可能有破坏性变更

钉在大版本号上是个折中:小版本自动跟,大版本手动改。但要记得——升级卡在某个版本不动,先看看是不是 tag 钉死了。

备份

一般三样东西:

  1. compose 目录本身(配置)
  2. 数据卷 / 挂载目录
  3. 数据库要用它自己的 dump 工具,别直接拷文件
bash
docker compose exec -T db pg_dump -U postgres -d app --clean --if-exists > backup.sql

迁移到新机器

老机:

bash
docker compose down
tar czvf app.tar.gz -C /opt app

新机:

bash
tar xzvf app.tar.gz -C /opt
cd /opt/app
docker compose up -d

新机先装同版本,确认能起来再升级。反过来(新机装了新版然后恢复旧数据)常常因为数据库 migration 版本不匹配起不来。

老机器别急着退,并行留几天。

个人笔记,写给未来忘事的自己。