Поиск по сайту:

Как развернуть PostgreSQL в качестве контейнера Docker


PostgreSQL, также известная как Postgres, является ведущей системой объектно-реляционных баз данных. Он популярен из-за высокого уровня соответствия стандарту SQL и включения дополнительных функций, упрощающих работу со сложными наборами данных в масштабе.

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

Начиная

У PostgreSQL есть официальный образ на Docker Hub, который доступен в нескольких различных вариантах. Теги позволяют выбирать между основными версиями PostgreSQL от v9 до v14 и выбирать операционную систему, используемую в качестве базового образа. Предлагаются Alpine, Debian Stretch и Debian Bullseye.

Для целей этого руководства мы будем использовать тег postgres:14, который предоставляет PostgreSQL 14 поверх Bullseye. Вы можете выбрать другую версию в соответствии с вашими требованиями.

Запустите контейнер PostgreSQL с помощью команды docker run:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Вы должны указать значение для переменной среды POSTGRES_PASSWORD. Это определяет пароль, который будет назначен учетной записи суперпользователя Postgres по умолчанию. Имя пользователя по умолчанию равно postgres, но его можно изменить, установив переменную среды POSTGRES_USER.

Флаг -v используется для подключения тома Docker к каталогу данных контейнера PostgreSQL. Ссылка на именованный том с именем postgres; Docker либо создаст его, либо повторно подключит том, если он уже существует. Вы должны использовать том для хранения вашей базы данных вне контейнера. Без него вы будете использовать свои данные, когда контейнер остановится.

PostgreSQL по умолчанию прослушивает порт 5432. Порт контейнера привязан к порту 5432 на вашем хосте Docker с помощью флага -p. Флаг -d используется для запуска контейнера в автономном режиме, фактически превращая его в фоновую службу, которая продолжает работать до тех пор, пока не будет остановлена с помощью docker stop.

Предоставление пароля в виде файла

Если вам неудобно предоставлять свой пароль суперпользователя в виде простого текстового флага CLI, вы можете вместо этого внедрить его в виде файла через том. Затем вы должны установить переменную среды POSTGRES_PASSWORD_FILE, чтобы предоставить Postgres путь к этому файлу:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password 
    -v ./postgres-password.txt:/run/secrets/postgres-password
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Этот метод также работает для POSTGRES_USER и других поддерживаемых переменных среды.

Подключение к вашей базе данных

Поскольку PostgreSQL был привязан к порту 5432 выше, вы могли подключиться к своей базе данных на localhost:5432 с любого совместимого клиента. Используйте учетные данные, которые вы назначили в качестве переменных среды при запуске контейнера.

Образ Docker также включает двоичный файл psql, который можно вызвать с помощью docker exec. Используйте это для быстрого взаимодействия с вашей базой данных из оболочки PostgreSQL внутри контейнера.

docker exec -it postgres psql -U postgres

Подключение из других контейнеров Docker

Создание сети Docker — предпочтительный способ доступа к PostgreSQL из других контейнеров на том же хосте. Это позволяет избежать привязки порта сервера Postgres и потенциального раскрытия службы более широкой сети вашего хоста.

Создайте сеть Docker:

docker network create my-app

Запустите контейнер Postgres с подключением к сети, используя флаг --network с docker run:

docker run -d 
    --name postgres 
    --network my-app 
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Теперь присоедините свой контейнер приложения к той же сети:

docker run -d
    --name api
    --network my-app
    my-api:latest

Контейнеры в сети могут получить доступ к Postgres, используя имя хоста postgres, так как это name назначено контейнеру Postgres. Используйте порт 5432 для завершения соединения.

Настройка PostgreSQL

Вы можете передать параметры сервера PostgreSQL, используя флаги -c после имени изображения в вашей команде docker run:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14 -c max_connections=100

Все после имени изображения передается команде, запущенной в контейнере. Эта команда будет двоичным файлом сервера PostgreSQL в случае образа Postgres.

Вы можете использовать собственный файл конфигурации, когда устанавливаете значения нескольких параметров. Вам нужно будет использовать другой том Docker, чтобы смонтировать файл в контейнер, а затем указать один флаг -c, чтобы указать Postgres, где искать:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v ./postgres.conf:/etc/postgresql/postgresql.conf 
    -v postgres:/var/lib/postgresql/data 
    postgres:14 -c config_file=/etc/postgresql/postgresql.conf

В этом примере используется монтирование привязки Docker для получения файла postgres.conf из вашего рабочего каталога, смонтированного в каталог контейнера /etc/postgresql. Справочник по параметрам, которые вы можете установить с помощью двоичных флагов или директив файла конфигурации, см. в документации PostgreSQL.

Заполнение базы данных

Образ Docker поддерживает исходные файлы, помещенные в каталог /docker-entrypoint-initdb.d. Любые файлы .sql или .sql.gz будут выполняться для инициализации базы данных. Это происходит после создания учетной записи пользователя по умолчанию и базы данных postgres. Вы также можете добавить файлы .sh для запуска произвольных сценариев оболочки. Все скрипты выполняются в алфавитном порядке.

Этот механизм означает, что все, что вам нужно для заполнения вашей базы данных, — это набор сценариев SQL или оболочки, названных в правильном последовательном порядке. Смонтируйте их в новый контейнер, используя флаг -v с docker run:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v ./db-seed-files/:/etc/docker-entrypoint-initdb.d 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

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

Создание пользовательского образа базы данных

Вы можете инкапсулировать файл конфигурации и сценарии инициализации в собственный образ Docker. Это позволит любому, у кого есть доступ к образу, запустить новый экземпляр PostgreSQL, предварительно настроенный для вашего приложения. Вот простой Dockerfile, который вы можете использовать:

FROM postgres:14
COPY postgres.conf /etc/postgresql/postgresql.conf
COPY db-seed-files/ /etc/docker-entrypoint-initdb.d/
CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]

Создайте свой собственный образ:

docker build -t custom-postgres:latest .

Инструкции по сборке в Dockerfile скопируют файл конфигурации PostgreSQL и сценарии инициализации из вашего рабочего каталога и встроят их в образ контейнера. Теперь вы можете запустить контейнер базы данных, не предоставляя ресурсы вручную:

docker run -d 
    --name custom-postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    custom-postgres:latest

Следует ли вам контейнеризовать производственную базу данных?

Может быть сложно решить, запускать ли базу данных в Docker. Контейнеризация PostgreSQL упрощает настройку, но иногда ее сложнее поддерживать. Вы должны соблюдать осторожность при управлении своим контейнером, чтобы избежать потери данных в будущем. Docker также добавляет небольшую нагрузку на производительность, которую стоит учитывать, если вы предполагаете, что база данных туров будет работать с очень большими объемами данных.

Преимущества Docker — повышенная переносимость, простота масштабирования и эффективность разработчиков. Контейнеризация вашей базы данных позволяет любому развернуть новый экземпляр с помощью Docker без предварительной установки и настройки PostgreSQL вручную. Таким образом, написание файла Dockerfile для вашей базы данных PostgreSQL, который добавляет ваш файл конфигурации и начальные сценарии SQL, является хорошим способом помочь разработчикам быстро запускать новые среды.

Краткое содержание

PostgreSQL — это усовершенствованный механизм базы данных на основе SQL, который добавляет возможности объектно-реляционных отношений. Хотя вы можете запустить традиционное развертывание в рабочей среде, использование экземпляра в контейнере упрощает настройку и помогает разработчикам быстро развернуть собственную инфраструктуру.

Самый важный аспект Dockerized развертывания — убедиться, что вы используете том для хранения своих данных. Это позволит вам останавливать, заменять и обновлять контейнер до более поздней версии образа без потери базы данных. Помимо хранилища, вы должны оценить, как вы собираетесь подключаться к Postgres, и избегать привязки портов к вашему хосту без необходимости. При подключении из другого контейнера лучше всего использовать общую сеть Docker для облегчения доступа.




Все права защищены. © Linux-Console.net • 2019-2024