2015-04-29 4 views
0

У нас есть приложение, которое расщепляется в нескольких GIT репозиториев:Postgresql и Docker

  1. WebApp Git Repository (Django + Postgres + сельдерей)
  2. Рабочие (Python + сельдерей)

С что нам также нужен сервер rabbitmq. Я смог успешно закупить первый WebApp, но у меня были некоторые вопросы о докетировании и более конкретно о Postgres.

Сегодня у нас есть одна база данных, используемая нашим webbApp. Эта база данных создается в контейнере Postgres, используя скрипт, который мы разместили в /docker-entrypoint-initdb.d, как указано в Official Postgres Container.

Если завтра у меня есть другие веб-приложения, которым необходимо использовать базу данных postgres, мне абсолютно необходимо изменить текущий контейнер postgres для создания новой базы данных? Лучше ли создать новый контейнер postgres с этой конкретной базой данных? И одна вещь, с которой я испытываю трудности: данные в моем контейнере не являются постоянными. Все данные, записанные в контейнере postgres, будут уничтожены при остановке контейнера. Что такое совместимое решение docker, чтобы сохранить эти данные постоянными?

Благодарим за помощь.

ответ

0

Вы должны использовать объем данных, чтобы ваши данные были постоянными.

docker run -v /var/lib/postgresql/data --name dbdata busybox /bin/true 
docker run --volume-from dbdata postgresql # and additional parameters 

Чтобы создать новую базу данных, вы можете войти в контейнер с помощью nsenter

# start the shell in a container 
ne() { 
pid=$(docker inspect --format '{{.State.Pid}}' $1) 
env SHELL='/bin/bash' sudo -E nsenter --target $pid \ 
    --mount --uts --ipc --net --pid 
} 

пе my_postgresql_container

(Справка: http://docs.blowb.org/setup-host/docker.html)

Вы можете сохранить функцию к вашему .bashrc файл, если вы хотите использовать его чаще.

Внутри, запустите клиент postgresql и запустите операторы sql для создания базы данных.

0

Есть две школы мысли для ваших экземпляров базы данных postgres.

  • создать единую базу данных для всех приложений, затем вы можете сделать один файл резервного копирования и wal-журнала и репликацию.
  • создать контейнер базы данных для каждого приложения. Это каждое приложение отвечает за свою базу данных. Я предпочитаю этот подход, потому что между приложениями не должно быть никакого сотрудничества.

Насколько куда поместить данные, он может:

  • идут в контейнере Postgres.
  • входите в контейнер данных и монтируйте его с помощью --volumes-from из контейнера postgres. Контейнер данных может использовать тот же образ, что и контейнер postgres.
  • Идите по самому хосту, и данные монтируются с хоста. Вероятно, это самый безопасный вариант, поскольку данные не подключены к контейнеру.

Это сложная проблема, особенно когда вы начинаете сочинять с помощью docker-compose, флота, рой, кубернетов и т. Д. Вы не хотите, чтобы данные вашей базы данных исчезли.

До тех пор, пока вы периодически создаете резервную копию своей базы данных, у вас есть опция восстановления «худшего случая» с контейнером. Если вы дополнительно скопируете журналы транзакций на другой хост, вы можете восстановить их с помощью журнала резервных копий + журналов транзакций почти в текущей версии. Кроме того, вы можете использовать базу данных репликации и транслировать свои данные в другой контейнер, поэтому, если ваш основной файл не работает, вы используете его в резервном контейнере.

Для меня, если база данных большая и центральная, было бы целесообразно, чтобы управлять этой базой данных вне докер и указывают на него с контейнерами, которые используют его, но это только мое мнение :-)

Смежные вопросы