Определите базу данных PostgreSQL и инструмент мониторинга, которые вы можете быстро создавать и уничтожать с помощью Docker Compose.
При запуске нового проекта многие разработчики используют JSON, CSV или другой плоский файл для имитации данных, которые могут находиться в базе данных. Разработчики разрываются между хлопотами при создании собственной базы данных и ограничениями, связанными с отсутствием реальной базы данных. Почему бы не определить базу данных PostgreSQL и инструмент мониторинга, которые вы можете создавать, уничтожать и воссоздавать за считанные секунды с помощью Docker Compose?
Команды Docker для создания двух контейнеров с правильными настройками длинны. С Docker Compose вам нужно только запомнить команды up
и down
!
Up
создаст базу данных PostgreSQL указанной версии и инструмент для управления на основе графического интерфейса. Down
выключит и удалит их.
Преимущества частной базы данных на основе контейнеров
- Между версиями PostgreSQL существуют различия в поведении и функциях, поэтому разработчики должны разрабатывать версию базы данных, которую они будут поддерживать в долгосрочной перспективе. Это может быть 9.6.12 для одного проекта и 12.4 для другого.
- Большинство разработчиков приложений не являются администраторами баз данных или экспертами по SQL. Графический инструмент позволяет визуально проверять эффекты их кода и изменять данные вручную.
- На разных этапах проекта требуются разные типы хранилищ. На ранних этапах проекта непостоянная база данных сводит к минимуму головную боль. На более поздних этапах проекта постоянная база данных предоставляет более реалистичные сценарии.
Создайте стек разработчиков
Следующий файл docker-compose.yml
определяет контейнер PostgreSQL, на котором запущена конкретная версия PostgreSQL и pgAdmin 4 (наиболее распространенный инструмент администрирования Postgres). Содержимое этого файла требует более подробного объяснения.
Файловая структура Docker Compose
Этот файл определяет две создаваемые службы: Postgres и pgAdmin. Каждая служба состоит из одного контейнера, извлеченного для вас из Docker Hub. Postgres и pgAdmin будут доступны на портах 5432 и 8080 соответственно. Направляйте любые программы, которые вы пишете, на имя хоста localhost
и перейдите по адресу http: // localhost: 8080, чтобы получить доступ к pgAdmin.
Продолжайте читать, чтобы узнать, как указать pgAdmin на Postgres.
Версия PostgreSQL
В строке, определяющей контейнер Postgres, вы хотите указать точную версию Postgres, которая вам нужна. Версия представлена в виде тега, где 9.6.12-alpine
- это версия в нашем примере. Отметьте здесь, чтобы узнать, какие другие версии доступны.
Хранилище для Postgres
Приведенный выше файл docker-compose.yml
определяет два сопоставления томов для Postgres. Эти два сопоставления сделают каталоги на вашем компьютере доступными для Postgres.
- Папка, сопоставленная с
/docker-entrypoint-initdb.d
, содержит файлы SQL, которые Postgres будет использовать для инициализации базы данных. Поместите нужные файлы SQL и сценарии оболочки в этот каталог, и они будут автоматически выполняться в алфавитном порядке. - Папка, сопоставленная с
/var/lib/postgresql/data
, содержит постоянное хранилище для фактической базы данных.
Когда Postgres запускается, он следует простой блок-схеме ниже. Если в базе данных нет данных, он выполняет каждый файл SQL и сценарий оболочки (в алфавитном порядке) в папке на вашем компьютере, которая сопоставлена с каталогом /docker-entrypoint-initdb.d
. Если в папке на вашем компьютере есть данные, сопоставленные с /var/lib/postgresql/data
, файлы игнорируются.
Стоит ли монтировать оба каталога? Это зависит. В таблице ниже описано поведение, которого следует ожидать при сопоставлении каждого из двух томов для Postgres.
Мой совет - сопоставить оба каталога. Вы можете удалить файлы из каталога инициализации, если больше не хотите инициализировать свою БД. Вы также можете удалить каталог данных со своего компьютера, чтобы удалить любые данные, которые могли сохраниться (Docker воссоздает пустую папку на ее месте при следующем запуске docker-compose up
).
Совет для профессионалов: вы можете включить CSV-файлы в папку init на своем компьютере, а затем заполнить таблицы данными из этих CSV-файлов, добавив соответствующую команду в файл SQL в каталоге init.
CREATE TABLE Employee(id, first_name, last_name, salary); COPY Employee FROM '/docker-entrypoint-initdb.d/emp.csv' WITH (FORMAT CSV, HEADER);
Хранилище для pgAdmin
Хотя pgAdmin - это всего лишь инструмент для просмотра и настройки базы данных, его соединение (я) с базой данных должно быть настроено. Это можно сделать через графический интерфейс с помощью команды «добавить сервер». Обратите внимание, что имя хоста - это параметр container_name
из нашего YML-файла: some-postgres
. Пароль также указывается в файле YML: mysecret
.
Альтернативный вариант - сэкономить много времени на нажатие и ввод текста, указав эти параметры (все, кроме пароля) в файле JSON. Сопоставьте этот файл JSON с /pgadmin4/servers.json
в контейнере (строка 22 в нашем примере файла YML), чтобы избежать необходимости вручную настраивать подключение pgAdmin к Postgres.
В файле настроек можно указать несколько подключений между pgAdmin и Postgres (для подключения от имени разных пользователей или для подключения к разным базам данных). В следующем примере есть только одно соединение.
Сети
Параметр container_name
- это просто имя, но это имя будет использоваться pgAdmin для доступа к базе данных через порт 5432. Причина показана на этой диаграмме. Два контейнера связаны друг с другом через частную сеть и, следовательно, могут обращаться друг к другу через свои имена хостов (имена контейнеров) some-postgres
и some-pgadmin
. Однако хост (ваш компьютер и веб-браузер) видит только открытые порты 5432 и 8080 и, следовательно, обращается к ним через localhost:5432
и localhost:8080
.
Имя этой внутренней сети может быть указано в файле набора, но нет никакого смысла в именовании сети, имя которой никогда не упоминается в вашем коде. Позвольте Docker справиться с этим! Если вам интересно, вы всегда можете просмотреть имя своей частной и временной сети. В приведенном ниже фрагменте я запустил Docker Compose с рабочего стола, поэтому он назвал сеть desktop_default
.
$ docker network ls NETWORK ID NAME DRIVER SCOPE 23a6be9b8021 bridge bridge local 49a120440f88 desktop_default bridge local 44a949b56fa7 host host local 3892b16dca2d none null local
Команды Docker и docker-compose
Здесь я должен признать, что в своем введении я слишком упростил команды, но лишь немного.
Чтобы запустить контейнеры, используйте docker-compose up -d
. Параметр -d
указывает «отсоединенный» режим, в котором контейнеры работают в фоновом режиме, и вы можете выполнять дополнительные команды в командной строке.
$ docker-compose up -d Creating network "desktop_default" with the default driver Creating some-postgres ... done Creating some-pgadmin ... done $
Чтобы остановить и удалить контейнеры, используйте docker-compose down -v
. Параметр -v
удаляет тома, которые контейнеры использовали во время работы. Это не удаляет каталоги на вашем компьютере, которые были сопоставлены с контейнерами.
$ docker-compose down -v Stopping some-pgadmin ... done Stopping some-postgres ... done Removing some-pgadmin ... done Removing some-postgres ... done Removing network desktop_default
Со временем вы будете накапливать ненужные тома, если не используете флаг -v
. Вы можете проверить это с помощью docker volume ls
.
Чтобы устранить неполадки с контейнером, который не запускается должным образом, используйте docker logs [container_name]
. Например, ваша база данных может не инициализироваться должным образом из-за ошибки в одном из файлов SQL в каталоге init. Я пролистал журналы после запуска docker logs some-postgres
, чтобы найти ошибку в файле SQL с соответствующим именем:
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/broken.sql ERROR: syntax error at end of input at character 34 STATEMENT: CREATE TABLE Songs(id, name, year psql:/docker-entrypoint-initdb.d/broken.sql:1: ERROR: syntax error at end of input LINE 1: CREATE TABLE Song(id, name, year
Журнал сообщает мне, что в строке 1 файла broken.sql
есть ошибка. В этой команде отсутствуют закрывающая скобка и точка с запятой. Я могу исправить эту ошибку и использовать down
и up
для проверки.
Использование Python
Использование localhost в качестве имени хоста и пароля, указанного в файле YML, упрощает подключение к базе данных.
Использование pgAdmin
Просто подключитесь к http: // localhost: 8080, чтобы получить доступ к странице входа, и используйте имя пользователя и пароли, указанные в docker-compose.yml
([email protected]
и admin
в нашем примере).
Если вы указали детали подключения в файле servers.json
, как обсуждалось ранее в этой статье, вам будет предложено ввести пароль для базы данных Postgres, когда вы попытаетесь развернуть дерево навигации в левой части пользовательского интерфейса. Этот пароль mysecret
в нашем docker-compose.yml
. Если вы не включили servers.json
файл или в вашем файле есть ошибка, вам придется добавить сервер вручную.
Теперь вы должны иметь возможность просматривать базу данных и управлять ею.
Приступаем к PSQL
Иногда разработчику нужна знакомая командная строка. Docker упрощает доступ к PSQL и выполнение команд, как опытный пользователь. Введите в командной строке PSQL команду, показанную здесь.
После подключения вы получаете доступ ко всем командам PSQL, таким как \i
для включения или \dt
и \df
для описания таблиц и функций. Для выхода используйте команду \q
.
$ docker exec -it some-postgres psql -U postgres psql (9.6.12) Type "help" for help. postgres=# \dt List of relations Schema | Name | Type | Owner --------+--------------+-------+---------- public | peak | table | postgres public | climb | table | postgres public | climber | table | postgres
Альтернатива pgAdmin
pgAdmin - наиболее распространенный административный графический интерфейс для PostgreSQL, но есть и другие. Adminer намного проще в использовании, и вы, возможно, уже имеете с ним опыт, поскольку он поддерживает несколько разновидностей SQL. Если вы только начинаете работать с PostgreSQL или у вас очень простые потребности, этот инструмент может быть более подходящим.
На экране входа в систему используйте some-postgres
в качестве хоста и mysecret
в качестве пароля.
Чтобы заменить pgAdmin на Adminer в вашей среде, замените определение контейнера pgAdmin в docker-compose.yml
строками ниже.
использованная литература
Все хорошие разработчики полагаются на документацию по продукту в сочетании с опытом других. Вот источники, которые я использовал при создании рабочего процесса и этой статьи.
- Https://hub.docker.com/_/postgres
- Https://hub.docker.com/_/adminer
- Https://docs.docker.com/compose/compose-file/
- Https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html
- Https://technology.amis.nl/2020/01/02/pgadmin-in-docker-provision-connections-and-passwords/
- Https://stackoverflow.com/questions/42248198/how-to-mount-a-single-file-in-a-volume