При работе с различными службами часто возникал вопрос, о том что запущенные приложения могут влиять на работу друг друга, а для сервисов это особо критично. Так как они обеспечивают клиентов обработкой запросов, к примеру сервер базы данных, сервер мониторинга производительности и другие могут быть отключены соседними процессами так, как имеют одинаковые права.
Поэтому для обеспечения целостности, доступности и изолированной работы служб стали использовать технологию контейнеризации. В данном материале рассмотрим, установку базы данных PostgreSQL через контейнеры Docker.
Краткая сводка
Docker — это платформа, которая автоматизированно развертывает заранее заготовленные снимки файловой системы или же образы и позволяет использовать их в изолированных средах — контейнерах.
Сама виртуализация происходит с помощью ядра ОС, где создается полностью отдельная файловая, сетевая, процессорная среда, которая назначается новому процессу. А значит, что ограниченный процесс Docker с прикрепленными, новыми для него средами будет выполнять все необходимые задачи сервиса.
Установка и настройка
Начнем с зависимостей и ПО необходимого для работы, если у вас не предустановлен Docker, то выполните команду:
sudo apt install docker 
После чего можем запустить dockerd демон и проверить его работоспособность командами, после чего найти нужный образ в репозитории:
systemctl start docker && systemctl status docker sudo docker search postgres 
Обратите внимание, на то что необходимо установить официальный образ контейнера, справа для этого есть пометка. Скачаем найденный образ с сервером базы данных через команду:
docker pull postgres 
Это позволит скачать с удаленного в локальный репозиторий, с которым в дальнейшем будет работать docker engine. Проверим наш образ в локальном репозитории командой:
docker ls image
Так как контейнер делит одно ядро ОС вместе с хостовой машиной, то некоторые функции изолированы не будут. К примеру, для создания процесса необходимы права с UID и GID, которые могут совпасть с пользователем хостовой ОС. Поэтому относитесь внимательно, к процессу монтирования папок с основной машины и создании пользователей.
docker run -d \
–name your-container-name \
–restart unless-stopped \
-e POSTGRES_USER=dbuser \
-e POSTGRES_PASSWORD=your-pass \
-e POSTGRES_DB=your-DB \
-p 5432:5432 \
-v name-of-volume:/var/lib/postgresql/data \
postgres && docker ps 
В команду для запуска контейнера, мы передаем переменные среды:
- POSTGRES_USER – имя пользователя БД/аккаунта для сервиса на ОС;
- POSTGRES_PASSWORD – пароль для аккаунта;
- POSTGRES_DB – имя базы данных;
- -p – опция перенаправления портов host:container;
- -v – виртуальный том для хранения данных сервиса.
Образ сам создаст пользователя и от его лица запустит сервис с созданной БД. Теперь контейнер или ограниченный процесс является отдельным/изолированным пространством, который принимает сетевые обращения на порте 5432. Соответственно, обратится к серверу можно через сетевое соединение с удаленного устройства, используя IP-адрес хостовой ОС и порт, который ранее был проброшен. Можно проверить его доступность командами:
netstat -tulnp 
Или же воспользоваться подключением через docker exec, где запустим клиент psql в самом же контейнере:
docker exec -it name-of-container psql -u dbsuer -D DB 
Отлично, подключение произошло! Теперь можем управлять сервером БД, который изолирован от основной среды ОС. Для того, чтобы удалить контейнер выполним команды:
docker stop name-of-container && docker remove name-of-container && docker image remove postgres && docker volume remove name-of-volume 
После чего контейнер с образом и данными хранящимися для него будет удален. При необходимости или желании переустановить образ, команду docker volume remove name-of-volume можно не выполнять для сохранения созданных баз данных.
В данном материале мы рассмотрели пошаговый способ развертывания контейнерной среды с образом базы данных. Такой подход позволяет разграничить пространство между остальным ПО, что повышает целостность и защищает от коллизии разных зависимостей.