Раздел помощи SpaceWeb

Установка и настройка PostgreSQL в Docker

24 июл, 2024

Docker – это инструмент, который используется для автоматизации развёртывания, масштабирования и управления приложениями с использованием контейнеров. 

Он решает проблему «работает у меня, но не работает у тебя» путём упаковки приложения и всех его зависимостей в единую контейнеризированную среду. В результате, приложения можно быстро и надёжно развернуть на любой платформе, которая поддерживает Docker. Это значительно упрощает разработку, тестирование и производство программного обеспечения, а также масштабирование и управление инфраструктурой.

Docker особенно полезен для разработчиков и системных администраторов, так как позволяет:

  1. Упростить процесс развертывания. Контейнеры можно развёртывать в любой системе, где установлен Docker, поэтому нет необходимости в настройке окружения вручную.
  2. Улучшить масштабируемость. Благодаря лёгкости и быстроте развёртывания контейнеров, можно легко масштабировать приложения в зависимости от текущей нагрузки.
  3. Гарантировать соответствие окружений. Контейнеры обеспечивают идентичные условия на всех этапах разработки и эксплуатации, что снижает риск возникновения ошибок из-за различий в конфигурациях среды.
  4. Эффективно использовать ресурсы. Контейнеры используют ресурсы более эффективно по сравнению с традиционными виртуальными машинами, так как они работают на уровне операционной системы, а не аппаратной эмуляции.

Что такое PostgreSQL 

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

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

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

Зачем добавлять PostgreSQL в контейнер 

Главное преимущество контейнеризации – быстрое развёртывание зависимостей. Например, при установке PostgreSQL на сервер с ОС Debian устанавливаются не только сама СУБД, но и все необходимые зависимости. 

Рассмотрим установку PostgreSQL на сервере. 

Для начала запустите сервер и выполните команду установки PostgreSQL:

sudo apt install postgresql postgresql-contrib

Вы можете заметить, что вместе с PostgreSQL устанавливаются и другие пакеты:

The following additional packages will be installed:
libllvm11 libpq5 libsensors-config libsensors5 libxslt1.1 libz3-4 postgresql-13 postgresql-client-13

Таким образом, вместе с PostgreSQL устанавливаются дополнительные библиотеки: libllvm11, libpq5, libsensors-config, libsensors5, libxslt1.1 и libz3-4.

Теперь выполните:

sudo apt-cache depends postgresql-13

Эта команда выведет список из 25 зависимостей: из них только одна рекомендуемая, а остальные – обязательные. Если на сервере отсутствует необходимый пакет или установлена неподходящая версия, это может привести к конфликтам. Использование PostgreSQL в Docker помогает избежать большинства таких проблем, так как все зависимости сохраняются внутри контейнера. При загрузке образа пользователь получает полностью совместимую среду, которая уже готова к работе.

Отсюда вытекает ещё одно преимущество – воспроизводимость. Например, разработчик хочет протестировать новую функцию в продукте. С помощью изолированной среды он может быстро развернуть на локальной машине рабочее окружение. Или, если в команду приходит новый разработчик, контейнеры помогают ему быстро влиться в работу.

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

Кроме того, использование Docker упрощает процесс обновления и масштабирования приложений. Благодаря контейнерам, администраторы могут легко развертывать новые версии приложений или их отдельных компонентов без необходимости остановки всей системы. Это особенно полезно для микросервисной архитектуры, где каждое приложение может состоять из множества небольших.

Таким образом, PostgreSQL в Docker обеспечивает не только удобство в развертывании и управлении зависимостями, но и улучшает воспроизводимость, отказоустойчивость, безопасность и масштабируемость приложений, что делает её идеальным решением для современных ИТ-инфраструктур.

Установка PostgreSQL в Docker из образа 

Для начала рассмотрим, как выполняется установка PostgreSQL в Dockery на Ubuntu. Это позволит создать изолированное и воспроизводимое окружение для работы с базой данных. 

  1. Добавьте ключ для работы с Docker Hub:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Если Docker Hub недоступен, можно использовать бесплатный прокси, который восстанавливает этот доступ. 

  1. Добавьте репозиторий Docker в список локальных и установите Docker:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt install docker-ce

  1. Запустите Docker и настройте его автозагрузку:
sudo systemctl start docker
sudo systemctl enable docker

  1. Пока изолированная среда не запущена, в ней нет никаких данных. Нам это не подходит, поэтому создайте Docker Postgres Volume – каталог для хранения данных:
mkdir -p $HOME/docker/volumes/postgres

  1. Теперь установите образ PostgreSQL из Docker Hub:
sudo docker pull postgres

После завершения установки PostgreSQL образ готов к запуску.

  1. Чтобы запустить контейнер PostgreSQL, выполним следующую команду, указав созданный ранее каталог для хранения данных:
sudo docker run – name postgres-container -e POSTGRES_PASSWORD=yourpassword -d -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data -p 5432:5432 postgres

Где

  • «--name my_postgres» задаёт имя контейнера.
  • «-e POSTGRES_PASSWORD=mysecretpassword» устанавливает пароль для пользователя postgres.
  • «-d» запускает контейнер в фоновом режиме.
  • «-v» $HOME/docker/volumes/postgres:/var/lib/postgresql/data монтирует локальный каталог для хранения данных.
  • «-p 5432:5432» перенаправляет порт 5432 из контейнера на хост-машину

Готово! PostgreSQL запущен и готов к использованию. Контейнер с PostgreSQL автоматически настроен на сохранение данных в указанный том, что позволяет сохранять данные даже при остановке или удалении контейнера.

Запуск контейнера PostgreSQL в Docker 

Чтобы запустить контейнер PostgreSQL в Docker можно воспользоваться следующей командой:

sudo docker run --rm --name sweb-pgdocker -e POSTGRES_PASSWORD=sweb -e POSTGRES_USER=sweb -e POSTGRES_DB=sweb -d -p 5531:5531 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres

В этой команде:

  • «--rm» автоматически удаляет контейнер после его остановки.
  • «--name sweb-pgdocker» задаёт имя контейнера.
  • «-e POSTGRES_PASSWORD=sweb» устанавливает пароль для пользователя postgres.
  • «-e POSTGRES_USER=sweb» создаёт нового пользователя с именем sweb.
  • «-e POSTGRES_DB=sweb» создаёт базу данных с именем sweb.
  • «-d» запускает контейнер в фоновом режиме.
  • «-p 5531:5531» перенаправляет порт 5531 из контейнера на хост-машину.
  • «-v $HOME/docker/volumes/postgres:/var/lib/postgresql/data» монтирует локальный каталог для хранения данных.

Если при выполнении команды возникает ошибка «Error starting userland proxy: listen tcp4 0.0.0.0:5531: bind: address already in use», необходимо выяснить, какой процесс занимает порт 5531:

sudo ss -lptn 'sport = :5531'

Чтобы завершить процесс, который занимает порт 5531, используйте команду kill, передав ей PID процесса:

sudo kill 2592

Устранив конфликт порта, снова запустите контейнер:

sudo docker run --rm --name sweb-pgdocker -e POSTGRES_PASSWORD=sweb -e POSTGRES_USER=sweb -e POSTGRES_DB=sweb -d -p 5531:5531 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres

Для удобства конфигурацию часто хранят в Dockerfile. В нём можно указать такие инструкции, как ADD, CMD, LABEL, ENV и другие – они будут применяться при запуске контейнера. Это позволяет централизовать и упростить управление настройками контейнера.

Подключение к PostgreSQL 

  1. Для начала подключитесь к нашей изолированной среде с помощью утилиты psql, которая входит в состав пакета postgresql-client. Установите его следующей командой:
sudo apt install postgresql-client

  1. После установки подключитесь к базе данных и выполните тестовый запрос:
psql -h 127.0.0.1 -U sweb -d sweb

Ответ должен выглядеть так:

Password for user sweb:
psql (14.7 (Ubuntu 14.7-0ubuntu0.21.04.1), server 14.2 (Debian 14.2-1.pgdg100+1))
Type "help" for help.
sweb=#

  1. Можно также подключиться к контейнеру непосредственно с помощью команды docker exec:
sudo docker exec -it sweb-pgdocker psql -U sweb

  • «-i» активирует интерактивную работу с терминалом.
  • «-t» запускает псевдо-терминал.
  • «sweb-pgdocker» – имя контейнера, к которому выполняется подключение.
  • «psql» запускает утилиту для подключения к базе данных.
  • «-U» указывает имя пользователя для подключения к базе данных.

Результат будет аналогичным:

psql (14.7 (Debian 14.2-1.pgdg100+1))
Type "help" for help.
sweb=#

  1. Чтобы протестировать соединение, создадим новую таблицу, заполните её данными и выполните запрос:
sweb=# create table cities (name varchar(80));
CREATE TABLE
sweb=# insert into cities values ('Moscow');
INSERT 0 1
sweb=# select * from cities;
name
--------
Moscow
(1 row)

  1. После выполнения тестовых запросов остановите контейнер командой:
sudo docker stop sweb-pgdocker

  1. Здесь вы можете столкнуться с потенциальной уязвимостью. Файлы и процессы, которые создаются контейнером, принадлежат внутреннему пользователю postgres. Поскольку в контейнере отсутствует изоляция пространств имён, UID и GID могут быть произвольными.

Это может привести к тому, что на сервере пользователи с такими же UID и GID получат доступ к каталогам хоста и смогут завершить любые процессы. Чтобы избежать этой ситуации, можно указать при запуске переменные USERMAP_UID и USERMAP_GID.

Пример команды для запуска контейнера с указанием этих переменных:

sudo docker run --rm --name sweb-pgdocker -e POSTGRES_PASSWORD=sweb -e POSTGRES_USER=sweb -e POSTGRES_DB=sweb -e USERMAP_UID=999 -e USERMAP_GID=999 -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres

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

Запуск PostgreSQL с помощью docker-compose

Ещё один эффективный способ запуска PostgreSQL в контейнере Docker – использование Docker Compose. Этот инструмент позволяет легко управлять многоконтейнерными приложениями. Для начала создадим файл конфигурации в формате YAML:

  1. Откройте редактор и создайте файл docker-compose.yml:
nano docker-compose.yml

  1. Вставьте в файл следующую конфигурацию:
version: '3.1'

volumes:
  pg_project:

services:
  pg_db:
    image: postgres
    restart: always
    environment:
      - POSTGRES_PASSWORD=sweb
      - POSTGRES_USER=sweb
      - POSTGRES_DB=sweb
    volumes:
      - pg_project:/var/lib/postgresql/data
    ports:
      - ${POSTGRES_PORT:-5432}:5432
 

Эта конфигурация описывает сервис pg_db, который использует образ postgres. В нём настроены параметры для базы данных: пароль, имя пользователя и имя базы данных. Контейнер будет автоматически перезапускаться при сбоях, а данные будут сохраняться в созданном томе pg_project.

  1. Затем установите Docker Compose:
sudo apt install docker-compose

  1. Запустите контейнер с PostgreSQL с помощью Docker Compose:
sudo docker-compose up -d

Ключ -d указывает на то, что Docker Compose должен работать в фоновом режиме, возвращая управление терминалом после запуска.

  1. Проверьте подключение к базе данных с помощью команды psql:
psql -h 192.168.0.4 -U sweb -d sweb

При успешном подключении вы увидите следующее приглашение:

Password for user sweb:
psql (14.7 (Ubuntu 14.7-0ubuntu0.21.04.1), server 14.2 (Debian 14.2-1.pgdg100+1))
WARNING: psql major version 14, server major version 14.
         Some psql features might not work.
Type "help" for help.

sweb=#

  1. Чтобы остановить запущенный контейнер, используйте команду:
sudo docker-compose stop

Заключение

В этой статье мы рассмотрели процесс установки и настройки PostgreSQL в Docker. 

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

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