Docker Compose: как обновлять контейнеры и не потерять данные
Контейнер — вещь одноразовая: при обновлении образа он удаляется и создаётся заново. Всё, что было записано внутрь контейнера, исчезает вместе с ним. Поэтому данные должны жить снаружи.
Два способа хранить данные
Именованный том управляется самим Docker и переживает пересоздание контейнера:
services:
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Bind-монтирование подключает обычную папку с хоста. Его удобнее бэкапить и смотреть глазами:
volumes:
- ./data:/var/lib/app
Порядок обновления
docker compose pull
docker compose up -d
docker image prune -f
up -d пересоздаст только те контейнеры, у которых изменился образ или конфигурация. Тома при этом не трогаются.
Чего не делать
- Не запускать
docker compose down -v, если не собираетесь удалять данные: флаг-vудаляет и тома. - Не хранить базу данных внутри контейнера без тома, даже «временно».
- Перед обновлением мажорной версии базы данных делать отдельную резервную копию: форматы файлов между версиями могут быть несовместимы.