- Dockerize PostgreSQL
- Install PostgreSQL on Docker
- Use container linking
- Connect from your host system
- Test the database
- Use the container volumes
- Установка и настройка PostgreSQL в Docker
- Зачем использовать PostgreSQL в контейнере
- Как установить PostgreSQL в Docker из образа
- Как запустить контейнер PostgreSQL
- Как подключиться к PostgreSQL в контейнере
- Как запустить PostgreSQL в контейнере в составе docker-compose
- Заключение
- Установка PostgreSQL с помощью Docker
- Оглавление:
- 1. Знакомство с базой данных PostgreSQL
- 2. Установка PostgreSQL с помощью публичного образа
- 3. Установка PostgreSQL с помощью пользовательского Dockerfile
- 4. Установка pgAdmin на Docker
- 5. Резервное копирование и восстановление данных
- 6. Заключение
Dockerize PostgreSQL
Estimated reading time: 5 minutes
Install PostgreSQL on Docker
Assuming there is no Docker image that suits your needs on the Docker Hub, you can create one yourself.
Start by creating a new Dockerfile :
Note: This PostgreSQL setup is for development-only purposes. Refer to the PostgreSQL documentation to fine-tune these settings so that it is suitably secure.
Build an image from the Dockerfile and assign it a name.
Run the PostgreSQL server container (in the foreground):
There are two ways to connect to the PostgreSQL server. We can use Link Containers, or we can access it from our host (or the network).
Note: The —rm removes the container and its image when the container exits successfully.
Use container linking
Containers can be linked to another container’s ports directly using —link remote_name:local_alias in the client’s docker run . This sets a number of environment variables that can then be used to connect:
Connect from your host system
Assuming you have the postgresql-client installed, you can use the host-mapped port to test as well. You need to use docker ps to find out what local host port the container is mapped to first:
Test the database
Once you have authenticated and have a docker =# prompt, you can create a table and populate it.
Use the container volumes
You can use the defined volumes to inspect the PostgreSQL log files and to backup your configuration and data:
Установка и настройка PostgreSQL в Docker
Docker — удобный инструмент для создания изолированных сред. Именно этой своей особенностью он и удобен для разворачивания различных приложений, требующих дополнительных зависимостей.
Managed Kubernetes помогает разворачивать контейнерные приложения в инфраструктуре Selectel. Сосредоточьтесь на разработке, а мы займемся рутинными операциями по обеспечению работы вашего кластера Kubernetes.
В прошлой статье о Docker-контейнерах мы рассказывали о преимуществах контейнеризации в целом, а в этой рассмотрим их относительно СУБД PostgreSQL, также расскажем о ее установке внутри контейнера.
Зачем использовать PostgreSQL в контейнере
Чтобы больше понять о преимуществах контейнеризации PostgreSQL, немного забежим вперед и для примера посмотрим на те зависимые пакеты, которые автоматически будут установлены вместе с приложениями, относящимся непосредственно к PostgreSQL, если мы будем ставить СУБД на сервер:
В нашем примере их три: libllvm10, libpq5, libxslt1.1. Однако, в зависимости от дистрибутива, может быть и больше. Посмотрим от каких пакетов на самом деле зависит пакет postgresql-12 (спойлер: 25 обязательных пакетов и 1 рекомендованный):
Наличие или отсутствие тех или иных пакетов, различные версии и другие факторы напрямую влияют на стабильность работы PostgreSQL. Используя контейнеризацию, возможные конфликты несовместимости нивелируются, т.к. все необходимые зависимости уже будут находиться в среде контейнера. Если загрузить готовый образ контейнера с ресурса Docker Hub (об этом ниже в статье), мы получим протестированную на совместимость и полностью готовую к работе среду.
Еще одно важное преимущество использования контейнеризации среды PostgreSQL — воспроизводимость. Разработчики и те, кто вносит какие-либо изменения в код процедур или добавляет новый функционал, могут быстро развернуть тестовую среду, полностью идентичную боевой, чтобы проверить свои гипотезы.
И, наконец, отказоустойчивость. Если с сервером что-то случится, точно такой же контейнер может быть запущен на другом сервере с уже примонтированным хранилищем датафайлов.
Откроем консоль управления Selectel, перейдем в представление Облачная платформа и нажмем на кнопку Создать сервер.
Далее вводим имя сервера, выбираем образ операционной системы (остановимся на Ubuntu 20.04 LTS 64-bit) и фиксированную конфигурацию сервера с 2 vCPU и 4 ГБ RAM. Объем дискового пространства диска установим в 20 ГБ. Еще раз проверяем конфигурацию сервера и нажимаем Создать.
Проверим сетевые настройки, копируем пароль для root и удостоверимся в нижней части экрана, что все настройки корректны. Нажмем кнопку Создать.
Подождем минуту или две пока сервер не перейдет в состояние Active.
Теперь можем приступать к установке PostgreSQL в Docker. Поехали!
Как установить PostgreSQL в Docker из образа
Перед началом работы с PostgreSQL в контейнере Docker, установим сам Docker. Предварительно, добавим ключ для работы с репозиторием Docker Hub:
Добавим этот репозиторий в локальный список репозиториев и установим Docker:
Запустим демон Docker и активируем его автозапуск:
Поскольку за пределами жизненного цикла контейнера не остается каких либо данных, на файловой системе сервера (или другом файловом хранилище) необходимо создать каталог для хранения данных, которые будут появятся в процессе работы экземпляра PostgreSQL.
Чтобы получить из репозитория Docker Hub готовый образ контейнера с PostgreSQL, выполним следующую команду:
Теперь все готово к запуску.
Как запустить контейнер PostgreSQL
Выполним команду docker с ключом run:
Если возникла ошибка вида: «Error starting userland proxy: listen tcp4 0.0.0.0:5432: bind: address already in use.», то следует вначале посмотреть какой процесс задействует порт 5432:
Затем прибить” процесс по его PID и вновь выполнить запуск Docker-контейнера:
Разберем ключи, которые мы использовали для запуска контейнера:
- —rm — ключ активирует автоматическое удаление контейнера и связанную с ним файловую систему после остановки контейнера. Полезный ключ для экономии дискового пространства.
- —name — ключ устанавливает имя контейнера. В пределах одного сервера имена контейнеров должны быть уникальны. Даже если один из них остановлен.
- -e — ключ задает переменные окружения, с которыми будет запущен контейнер. В нашей ситуации мы добавляем пароль суперпользователя, (POSTGRES_PASSWORD=selectel), имя суперпользователя (POSTGRES_USER=selectel) и имя базы данных по умолчанию (POSTGRES_DB=selectel) к базе данных.
- -d — ключ указывает, что контейнер должен быть запущен в в фоновом режиме (возвращает управление после его запуска).
- -p — ключ указывает на привязку внутреннего порта контейнера к порту сервера (используем порт по умолчанию 5432).
- -v — ключ создает точку монтирования каталога $HOME/docker/volumes/postgres на сервере к каталогу /var/lib/postgresql/data внутри контейнера.
Как подключиться к PostgreSQL в контейнере
После успешного запуска контейнера с PostgreSQL, попробуем к нему подключиться при помощи утилиты psql. Установим ее из пакета postgresql-client:
Теперь можно подключиться и выполнить тестовый SQL-запрос:
Если появилось приглашение к вводу запроса, значит все действия были выполнены правильно.
Еще один вариант подключиться к базе данных, не устанавливая дополнительных утилит — подключиться непосредственно к Docker-контейнеру. Для этого выполним команду docker exec с дополнительными ключами:
Приглашение к вводу запроса будет означать корректность ввода команды. Разберем ключи, которые мы использовали для выполнения команды:
- -i — ключ активирует интерактивную работу с терминалом.
- -t — ключ запускает псевдо-терминал (pseudo-TTY).
- selectel-pgdocker — имя контейнера, к которому выполняется подключение.
- psql — указание на запуск утилиты для подключение к базе данных PostgreSQL.
- -U — ключ указывает на имя пользователя, которое будет использоваться для подключения к базе данных.
Теперь попробуем создать новую таблицу, добавить в нее данные и выполнить запрос:
Чтобы остановить запущенный контейнер выполним docker stop и укажем имя контейнера:
Файлы и процессы, созданные контейнером, принадлежат пользователю postgres, который является внутренним по отношению к контейнеру. В отсутствие пространства имен пользователей внутри контейнера, UID и GID в контейнере могут иметь произвольное значение. На самом сервере этим UID и GID могут соответствовать привилегированные пользователи или группы соответственно.
Например, пользователь на хосте с тем же UID или GID, что и пользователь postgres в контейнере, сможет получить доступ к данным в различных каталогах хоста, а также сможет завершить любой запущенный процесс. Чтобы избежать такой бреши в безопасности, укажем при запуске контейнера специализированные переменные USERMAP_UID и USERMAP_GID:
Как запустить PostgreSQL в контейнере в составе docker-compose
Еще одним вариантом запуска PostgreSQL в Docker-контейнере, является запуск контейнера с базой данных в составе docker-compose. В первую очередь, создадим соответствующий yml-файл:
Затем установим docker-compose:
Теперь запустим контейнер:
Ключ -d указывает, что docker-compose должен быть запущен в в фоновом режиме (вернет управление после его запуска).
Проверим возможность подключения к базе данных:
Появление приглашения к вводу команд для PostgreSQL означает корректность выполненных настроек.
Чтобы остановить запущенный контейнер, выполним docker-compose stop:
Заключение
Мы рассказали о работе с базой данных PostgreSQL в контейнере Docker, запуске, выполнении запросов и остановке. Как и говорили в начале статьи, работа с контейнеризованной в Docker базой данных упрощает процесс разработки и администрирование. Контейнеры могут быть легко перезапущены на другом сервере и сервис, предоставляемый базой данных, не прервется.
Установка PostgreSQL с помощью Docker
В этом руководстве мы научимся устанавливать PostgreSQL с помощью Docker. Обычно мы запускаем контейнер Docker, используя публичный образ Docker, или берём предварительно настроенные Docker-образы сервера баз данных PostgreSQL из Docker Hub. Здесь же мы продемонстрируем, как PostgreSQL можно установить, настроить и запустить на Docker.
Сначала запустим контейнер Docker с базой данных PostgreSQL, используя публичный образ PostgreSQL. Позже мы создадим пользовательский Dockerfile для установки сервера PostgreSQL в контейнер Docker. Также мы научимся создавать резервные копии и восстанавливать базу данных с помощью контейнера Docker.
Оглавление:
1. Знакомство с базой данных PostgreSQL
PostgreSQL — это СУБД с открытым исходным кодом, аналогичная MySQL. Это объектно-ориентированная база данных, но с её помощью мы можем обрабатывать как структурированные, так и неструктурированные данные.
Механизм базы данных PostgreSQL работает на различных платформах, включая Windows, Mac OS X и Linux. Он также предоставляет расширенные типы данных и функции оптимизации производительности для хранения и масштабирования сложных рабочих нагрузок БД.
2. Установка PostgreSQL с помощью публичного образа
Чтобы запустить PostgreSQL с помощью Docker, нам сначала нужно извлечь публичный образ postgres, доступный на Docker Hub:
В приведённой выше команде мы вытянули последний стабильный образ postgres. Мы также можем использовать определённую версию образа postgres с помощью следующей команды:
Теперь запустим контейнер Docker, используя образ postgres:latest:
Данная команда использует переменные среды POSTGRES_USER и POSTGRES_PASSWORD для установки имени пользователя и пароля для БД PostgreSQL. Также база данных PostgreSQL по умолчанию должна работать на порте 5432, и мы открыли его на хосте, используя переменную «-p 5432:5432» в команде docker run .
Для резервного копирования данных мы также смонтировали каталог /var/lib/postgresql/data в каталог /data на хост-машине контейнера postgres.
psql — это утилита командной строки, используемая для интерактивного доступа к БД PostgreSQL. Давайте воспользуемся psql для соединения с базой данных:
Чтобы получить список всех баз данных, воспользуемся командой \l :
В показанном выше выводе мы можем увидеть подробную информацию обо всех базах данных, имеющихся на сервере PostgreSQL.
3. Установка PostgreSQL с помощью пользовательского Dockerfile
Мы также можем установить сервер базы данных PostgreSQL, создав собственный Dockerfile. Ниже мы создадим такой файл, который будет содержать все необходимые команды для установки Postgres, используя CentOS в качестве базового образа:
В приведённом выше Dockerfile мы использовали startUpScript.sh для запуска сервера базы данных PostgreSQL после успешной установки. Давайте также рассмотрим файл startUpScript.sh:
В startUpScript.sh мы сначала инициализировали базу данных PostgreSQL, а затем создали фиктивную базу данных под условным именем baeldung.
4. Установка pgAdmin на Docker
Итак, сервер PostgreSQL активен и работает на порте 5432. Теперь мы установим pgAdmin — инструмент с веб-интерфейсом, используемый для управления базами данных и сервисами PostgreSQL. pgAdmin можно использовать для выполнения SQL-запросов к базам данных PostgreSQL .
Мы можем использовать pgAdmin для выполнения всех запросов из пользовательского интерфейса, и для этого нам нужно извлечь образ pgAdmin с помощью следующей команды:
Для наглядности запустим контейнер с помощью такой команды:
В команде выше мы предоставили PGADMIN_DEFAULT_EMAIL и PGADMIN_DEFAULT_PASSWORD в качестве переменной окружения для контейнера pgadmin-baeldung:
С помощью графического интерфейса pgAdmin мы можем легко получать доступ к нашим базам данных PostgreSQL. Просто установите соединение с сервером PostgreSQL с помощью pgAdmin и залогиньтесь.
5. Резервное копирование и восстановление данных
В этом разделе мы научимся создавать резервные копии и восстанавливать данные в PostgreSQL с помощью команд Docker.
Сначала, чтобы создать резервную копию данных, давайте создадим фиктивную базу данных baeldung и таблицу baeldungauthor:
Команда для создания таблицы выглядит следующим образом:
Укажем созданную таблицу в базе данных:
Теперь воспользуемся следующей командой, чтобы получить подробную схему таблицы baeldungauthor:
Теперь у нас есть база данных и таблица. Давайте рассмотрим команду резервного копирования для контейнера Docker:
Здесь мы использовали команду pg_dumpall для резервного копирования базы данных baeldung (Это стандартный инструмент PostgreSQL для таких задач). Мы также указали имя пользователя сервера БД для доступа к привилегиям.
Теперь давайте проверим команду для восстановления базы данных:
Таким образом, мы восстановили все таблицы базы данных baeldung с помощью команды psql.
6. Заключение
В этой статье мы научились устанавливать базу данных PostgreSQL с помощью контейнера Docker и изучили каждый шаг по извлечению, настройке и запуску Docker-контейнера Postgres. Кроме того, мы разобрали оба способа доступа к серверу базы данных PostgreSQL. Сначала, для доступа к серверу запущенному в контейнере Docker — мы использовали pgAdmin, а затем, для выполнения запросов к БД — применили psql.
Подводя итог, мы запустили контейнер Docker с базой данных PostgreSQL, используя публичный образ Postgres, представленный на Docker Hub. Мы также создали собственный Dockerfile для установки сервера PostgreSQL в Docker-контейнер.
Наконец, мы рассмотрели резервное копирование и восстановление данных в базе данных PostgreSQL с помощью контейнера Docker.