Иногда сред для разработки становится слишком много и использование докера становится необходимым. Но как только появляется необходимость использования докера, сразу вместе с ней становится задача сохранения данных, чтобы сервисы можно было запускать постоянно.
Настройка отдельных контейнеров для хранения данных может показать простой задачей, ведь есть очень много гайдов, в том числе и в официальной документации докера. Я прочитал несколько из них, пока не нашёл простое и изящное решение в одной из статей. Перевод самой лучшей из них находится под катом.
Оригинальное решение занимает 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=#
Для чтения:
- Самый полезный оригинальный пост.
- Официальная страница документации
- Полезный вопрос на Stackoverflow
- Пост про решение проблемы
- Ещё один пост
- Решение через fig