Контейнеры по своей природе временны: удалили контейнер — пропали и все данные внутри него. Для базы данных это недопустимо. Решение — тома (volumes), которые хранят данные вне контейнера и переживают его пересоздание.
Именованный том создаётся и подключается флагом -v:
docker run -d --name db \ -v pgdata:/var/lib/postgresql/data \ postgres
Здесь том pgdata подключён к папке внутри контейнера, где Postgres хранит базу. Теперь данные сохранятся, даже если контейнер удалить и создать заново.
Есть и другой вид — bind mount: подключить папку с хоста прямо в контейнер. Это удобно при разработке, чтобы контейнер видел изменения кода сразу:
docker run -v $(pwd):/app myapp
Команды для томов: docker volume ls (список), docker volume create name, docker volume rm name. Правило: всё, что должно пережить контейнер (базы, загруженные файлы), храните в томах.