Глиф Учебники

Как сохранить данные контейнера

Справочник · Docker · 2 минуты чтения

Данные пропадают, потому что всё, что программа пишет внутри контейнера, лежит в его слое для записи и удаляется вместе с контейнером. Решение — хранить данные вне контейнера: в томе или в папке хоста.

Bash
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

Ошибка в пути — частая причина «пропавших» данных: программа пишет в одну папку, а том подключён в другую.

Том или папка хоста

В Docker Compose:

YAML
services:
  db:
    image: postgres:18
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - pgdata:/var/lib/postgresql

volumes:
  pgdata:

Контейнер уже работает без тома

Если данные уже лежат в слое контейнера, не удаляйте его. Сначала скопируйте данные наружу:

Bash
docker stop app
docker cp app:/data ./data-backup

docker cp работает и с остановленным контейнером. Затем создайте новый контейнер с подключённой папкой или томом и положите данные туда.

Если данные базы оказались в анонимном томе (у образов баз так бывает по умолчанию), они не потеряны: найдите том в docker inspect app в разделе Mounts и подключите его к новому контейнеру по имени.

docker commit сохраняет контейнер в новый образ вместе с его слоем. Это способ спасти данные в крайнем случае, но не способ хранения: образ растёт, а то, что в нём лежит, трудно обновлять.

Резервная копия

Том на диске хоста — ещё не резервная копия: при сбое диска или ошибочном docker volume rm пропадёт и он. Архив тома можно сделать временным контейнером:

Bash
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. Храните копии не на том же диске.

Подробно о томах и папках — в уроке Данные: тома и папки.