Если не знаете что такое Docker Volume то рекомендую сперва почитать про это тут.

Многие переходят на контейнеризацию из-за быстрого и лёгкого способа обновления. Например если необходимо перейти с одной версии баз данных на другую. При использовании обычного подхода с хостовой ОС это требует больше манипуляций чем при использовании контейнеризации. Например, нужно добавить или активировать репозиторий, далее возможно обновить какие-то компоненты самой ОС и т.д.

enter image description here

Создание контейнера с PostgreSQL

Так как сейчас очень распространён PostgreSQL я буду использовать именно его для примера. Но важное замечание никогда не обновляйте контейнер с базой данных, не прочитав рекомендации и требования на официальном сайте. Например, чтобы перейти с версии 17 на 18 необходимо выполнить pg_upgrade.

  1. Для начала создам Docker Volume
    docker volume create pg_volume
    
  2. Вторым этапом я создам контейнер с образа postgres:17
    docker container run -d -v pg_volume:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword --name some-postgres postgres:17
    

Сохранение информации

  1. Создаю новую БД
    docker exec -it some-postgres psql -U 'postgres' -w -h localhost -c 'CREATE DATABASE TEST;'
    
  2. Создаю таблицу
    docker exec -it some-postgres psql -U 'postgres' -w -h localhost -d test -c 'CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, age INT);`
    
  3. Вставляю данные
    docker exec -it some-postgres psql -U 'postgres' -w -h localhost -d test -c "INSERT INTO users (name, age) VALUES ('Alice', 30), ('Bob', 25);"
    
  4. Проверяю всё
    docker exec -it some-postgres psql -U 'postgres' -w -h localhost -d test -c "SELECT * FROM users;"
    

Удаление контейнера

Теперь я удаляю существующий контейнер и проверяю что Docker Volume остался.

docker container rm -f some-postgres 
docker volume ls

Создание нового контейнера

Теперь я создаю новый контейнер с версией выше (17.6) используя существующий Docker Volume и проверяю что данные те же, что я записал ранее.

docker container run -d -v pg_volume:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword --name some-postgres2 postgres:17.6
docker exec -it some-postgres2 psql -U 'postgres' -w -h localhost -d test -c "SELECT * FROM users;"
 id | name  | age
----+-------+-----
  1 | Alice |  30
  2 | Bob   |  25
(2 rows)