Как настроить докер для хранения данных на примере PostgreSQL

Иногда сред для разработки становится слишком много и использование докера становится необходимым. Но как только появляется необходимость использования докера, сразу вместе с ней становится задача сохранения данных, чтобы сервисы можно было запускать постоянно.

Настройка отдельных контейнеров для хранения данных может показать простой задачей, ведь есть очень много гайдов, в том числе и в официальной документации докера. Я прочитал несколько из них, пока не нашёл простое и изящное решение в одной из статей. Перевод самой лучшей из них находится под катом.

Оригинальное решение занимает 3 строчки. Для нетерпеливых решение приведено ниже. Вы можете также заменить версию на -latest, как и сам образ постреса на образ нужного сервиса:

docker create -v /var/lib/postgresql/data --name postgres9.4-data busybox
docker run --name local-postgres9.4 -p 5432:5432 -e POSTGRES_PASSWORD=asecurepassword -d --volumes-from postgres9.4-data postgres:9.4
docker run -it --link local-postgres9.4:postgres --rm postgres:9.4 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

Как это работает

docker create -v /var/lib/postgresql/data --name postgres9.4-data busybox

Эта команда создаёт контейнер, в котором будут хранится все базы данных постгреса, которые находятся в /var/lib/postgresql/data.  Для самого контейнера используется лёгкий дистрибутив busybox.

Опция –name задаёт контейнеру явное имя, по которому мы потом сможем подключать раздел с данными.

docker run --name local-postgres9.4 -e POSTGRES_PASSWORD=asecurepassword -d --volumes-from postgres9.4-data postgres:9.4

Аналогично предыдущей команде мы задаём отдельное имя для этого контейнера, запускаем его как демон при помощи опции -d и используем данные контейнера postgres9.4-data, который мы сделали на предыдущем шаге при помощи опции –volumes-from.

Теперь можно проверить как это работает при помощи команды:

docker run -it --link local-postgres9.4:postgres --rm postgres:9.4 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

Этот контейнер связывается с предыдущим при помощи опции –link и запускает консольный psql.

Всё работает.

Чтобы использовать postgresql как нормальный сервер, нужно пробросить порты в родную систему.
docker run --name local-postgres9.3.6 -p 5432:5432 -e POSTGRES_PASSWORD=asecurepassword -d --volumes-from postgres9.3.6-data postgres:9.3.6

Тогда к нему можно подключаться при помощи локального psql. В случае, если у вас Mac, то ip для подключения можно получить, выполнив команду $ docker-machine env default:

psql -h 192.168.99.100 -p 5432 -U postgres --password
Password for user postgres:
psql (9.3.6) Type "help" for help.
postgres=#

Для чтения: