Как сохранить данные контейнера
Данные пропадают, потому что всё, что программа пишет внутри контейнера, лежит в его слое для записи и удаляется вместе с контейнером. Решение — хранить данные вне контейнера: в томе или в папке хоста.
docker run -d --name db -e POSTGRES_PASSWORD=Smena-Parol-2026 -v pgdata:/var/lib/postgresql postgres:18-v pgdata:/var/lib/postgresql подключает том pgdata в папку, где PostgreSQL 18 хранит базу. Контейнер можно удалить и создать заново с тем же -v — база останется.
Куда подключать
В ту папку, где программа хранит данные. Она указана в описании образа на Docker Hub. Примеры для официальных образов:
| Образ | Папка данных |
|---|---|
postgres:18 и новее | /var/lib/postgresql |
postgres:17 и старше | /var/lib/postgresql/data |
mariadb, mysql | /var/lib/mysql |
wordpress | /var/www/html |
nginx (файлы сайта) | /usr/share/nginx/html |
Ошибка в пути — частая причина «пропавших» данных: программа пишет в одну папку, а том подключён в другую.
Том или папка хоста
- Том (
-v имя:/путь) — Docker сам создаёт и хранит его в/var/lib/docker/volumes. Лучший выбор для баз данных: меньше проблем с правами. - Папка хоста (
-v /srv/site:/путь— путь начинается с/или./) — удобно, когда файлы нужно видеть и править на хосте: сайт, настройки.
В Docker Compose:
services:
db:
image: postgres:18
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql
volumes:
pgdata:Контейнер уже работает без тома
Если данные уже лежат в слое контейнера, не удаляйте его. Сначала скопируйте данные наружу:
docker stop app
docker cp app:/data ./data-backupdocker cp работает и с остановленным контейнером. Затем создайте новый контейнер с подключённой папкой или томом и положите данные туда.
Если данные базы оказались в анонимном томе (у образов баз так бывает по умолчанию), они не потеряны: найдите том в docker inspect app в разделе Mounts и подключите его к новому контейнеру по имени.
docker commit сохраняет контейнер в новый образ вместе с его слоем. Это способ спасти данные в крайнем случае, но не способ хранения: образ растёт, а то, что в нём лежит, трудно обновлять.
Резервная копия
Том на диске хоста — ещё не резервная копия: при сбое диска или ошибочном docker volume rm пропадёт и он. Архив тома можно сделать временным контейнером:
docker run --rm -v pgdata:/from:ro -v "$PWD":/backup alpine tar czf /backup/pgdata.tar.gz -C /from .Копия файлов работающей базы данных может оказаться испорченной. Остановите контейнер базы на время копирования или делайте дамп средствами самой базы: docker exec db pg_dump -U postgres имя_базы > dump.sql для PostgreSQL, mariadb-dump для MariaDB. Храните копии не на том же диске.
Подробно о томах и папках — в уроке Данные: тома и папки.