Определите базу данных 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.

  1. Папка, сопоставленная с /docker-entrypoint-initdb.d, содержит файлы SQL, которые Postgres будет использовать для инициализации базы данных. Поместите нужные файлы SQL и сценарии оболочки в этот каталог, и они будут автоматически выполняться в алфавитном порядке.
  2. Папка, сопоставленная с /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 строками ниже.

использованная литература

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