Как я должен использовать образ/контейнер докера Postgresql?
Я новичок в docker. Я все еще пытаюсь разобраться во всем этом.
Я создаю приложение узла (REST api), используя Postgresql для хранения моих данных.
Я провел несколько дней, изучая докера, но я не уверен, что делаю все так, как я должен.
Так вот мои вопросы:
-
Я использую официальное изображение docker postgres 9.5 в качестве базы для создания собственного (мой Dockerfile добавляет только plpython сверху и устанавливает пользовательский модуль python для использования в хранимых процедурах plpython). Я создал свой контейнер как suggedsted по адаптерам изображения документы:
docker run --name some-postgres-e POSTGRES_PASSWORD=mysecretpassword-d postgres
после остановки контейнера я не могу запустить его снова, используя приведенную выше команду, потому что контейнер уже существует. Поэтому я запускаю его с помощью docker start вместо docker run. Разве это нормально? Я вообще буду использовать docker запускается в первый раз и docker запускается каждый раз?
Persistance: я создал базу данных и заполнил ее в работающем контейнере. Я сделал это, используя pgadmin3 для подключения. Я могу остановить и запустить контейнер и данные сохраняются, хотя я не уверен, почему или как это происходит. Я вижу в Dockerfile официального изображения postgres, что создается том (VOLUME/var/lib/postgresql / data), но я не уверен, что это причина, по которой persistance рабочий. Не могли бы вы кратко объяснить (или объяснение) о том, как это все работает?
архитектура: из того, что я читал, кажется, что наиболее подходящей архитектурой для такого приложения было бы запустить 3 отдельных контейнера. Один для базы данных, один для сохранения данных базы данных и один для приложения узла. Это хороший способ сделать это? Как использование контейнера данных улучшает ситуацию? AFAIK моя текущая настройка работает нормально без один.
есть ли что-нибудь еще, на что я должен обратить внимание?
спасибо
EDIT: добавляя к моей путанице, я только что запустил новый контейнер из официального образа debian (нет Dockerfile, просто docker run-i-t-d --name debtest debian /bin/bash). С контейнером, работающим в фоновом режиме, я подключился к нему с помощью Docker attach debtest и приступил к apt-get install postgresql. После установки я побежал (все еще изнутри container) psql и создал таблицу в базе данных postgres по умолчанию и заполнил ее 1 записью. Затем я вышел из оболочки, и контейнер автоматически остановился, так как оболочка больше не работала. Я запустил контейнер againg с помощью docker start debtest, затем подключился к нему и, наконец, снова запустил psql. Я обнаружил, что все сохраняется с первого запуска. Postgresql установлен, моя таблица есть, и, конечно, запись, которую я вставил, тоже есть. Я действительно смущен, почему я нужен том для сохранения данных, так как этот быстрый тест не использовал один и все обезьяны работают нормально. Я что-то упускаю?
еще раз спасибо
2 ответов
1.
docker run --name some-postgres-e POSTGRES_PASSWORD=mysecretpassword - D postgres
после остановки контейнера я не могу запустить его снова, используя выше команду, потому что контейнер уже существует.
правильно. Вы назвали его (--name some-postgres
) следовательно, прежде чем начать новый, старый должен быть удален, например docker rm -f some-postgres
поэтому я начинаю использовать запуск docker вместо запуска docker. Это нормальный способ сделать вещи? Обычно я использую docker run в первый раз и docker начинать каждый раз?
нет, это ни в коем случае не нормально для докера. Контейнеры процесса Docker обычно должны быть эфемерные, это легко выбросить и начать заново.
настойчивость: ... Я могу остановиться и начать. контейнер и данные сохраняются, хотя я не уверен, почему или как это происходит. ...
это потому, что вы повторно использовать тот же контейнер. Удалите контейнер, и данные исчезнут.
архитектура: из того, что я читал, кажется, что наиболее подходящий архитектура для такого приложения будет работать 3 отдельных стеклотара. Один для базы данных, один для сохранения базы данных данные и один для приложения node. Это хороший способ сделать это? Как использование контейнера данных improve вещи? AFAIK моя текущая настройка работает нормально без него.
Да, это хороший способ пойти, имея отдельные контейнеры для отдельных проблем. Это удобно во многих случаях, например, когда вам нужно обновить базовое изображение postgres без потери данных (в частности, когда контейнер данных начинает играть свою роль).
есть ли что-нибудь еще, что я должен заплатить atention чтобы?
при знакомстве с основами докера, вы можете взглянуть на Docker compose или аналогичные инструменты, которые помогут вам легче запускать приложения multicontainer.
коротко и просто:
- то, что вы получаете от официального образа postgres,-это готовая установка postgres вместе с некоторыми трюками, которые можно настроить с помощью переменных среды. С
docker run
создать контейнер. Команды жизненного цикла контейнера:docker start/stop/restart/rm
Да, это способ Докера вещей. - все внутри Тома сохраняется. Каждый контейнер может иметь произвольное количество томов. Объемы каталогов либо определяется внутри файла Dockerfile, родительского файла Dockerfile или с помощью команды
docker run ... -v /yourdirectoryA -v /yourdirectoryB ...
. Все внешние Тома теряются сdocker rm
. Все, включая Тома, теряется сdocker rm -v
- легче показать, чем объяснить. См. этот readme с командами Docker на Github, прочитайте, как я использую официальный образ PostgreSQL для Jira, а также добавьте NGINX в микс: Jira с Докером PostgreSQL. Также контейнер данных-это дешевый трюк, чтобы иметь возможность удалять, перестраивать и обновите контейнер без необходимости перемещения сохраненных данных.
- Поздравляю, вам удалось понять основы! Продолжай! Попробуйте docker-compose, чтобы лучше управлять этими неприятными
docker run ...
-команды и возможность управлять несколькими контейнерами и контейнерами данных.
Примечание: вам нужен блокирующий поток, чтобы сохранить контейнер работает! Либо эта команда должна быть явно задана внутри файла Dockerfile, см. CMD, либо задана в конце . Если ваша команда не блокируется, например /bin/bash
, то контейнер всегда будет останавливаться сразу после выполнения команды.