1. Введение
В этом руководстве мы узнаем, как запустить PostgreSQL в контейнере Docker. Этот подход облегчает настройку postgres. Поэтому это идеальное решение для development and testing environments.
Давайте начнём.
2. Требования
Сначала давайте убедимся, что Docker установлен и запущен на нашей машине. Если нет — давайте воспользуемся официальным Docker installation guide для его установки.
Далее давайте выполним pull PostgreSQL Docker image из Docker Hub:
docker pull postgres:latest
Эта команда получает последнюю версию PostgreSQL image. В качестве альтернативы мы можем указать конкретную версию, заменив latest на нужный tag (например, 13.2). Все доступные теги можно найти на PostgreSQL Docker Hub page.
3. Запуск PostgreSQL Container
Чтобы запустить контейнер PostgreSQL, выполните следующую команду:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
Давайте разберём эту команду:
- –name my-postgres: Присваивает имя
container. - -e POSTGRES_PASSWORD=mysecretpassword: Устанавливает пароль для пользователя по умолчанию postgres.
- -d: Запускает
containerв detached mode. Это означает, чтоcontainerстартует в фоновом режиме. - postgres: Указывает Docker image для использования. В данном случае мы будем использовать последнюю версию.
4. Доступ к PostgreSQL Instance
Теперь у нас должен быть экземпляр PostgreSQL внутри контейнера с именем my-postgres. Поэтому мы не можем использовать команду psql напрямую из нашего терминала, так как она там будет недоступна. Вместо этого мы можем использовать команду docker exec, чтобы получить доступ к экземпляру PostgreSQL внутри контейнера:
docker exec -it my-postgres psql -U postgres
Теперь у нас должен быть shell, который мы можем использовать для взаимодействия с database. Обычно мы не обращаемся к database напрямую. Но сейчас это единственный способ получить к ней доступ.
Давайте настроим container так, чтобы он предоставлял host доступ к database.
5. Настройка контейнера PostgreSQL
Чтобы подключиться с host machine, нам нужно настроить container так, чтобы он exposes the database port. Для этого мы можем использовать опцию –publish или -p, чтобы map the container’s port to a host port:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
Теперь у нас будет доступ к базе данных с хост-машины, если мы подключимся к localhost:5432. Также мы задали пароль для пользователя postgres, чтобы мы могли использовать клиент базы данных, такой как DBeaver, для подключения к базе данных.
Запоминать эти команды может быть сложно. Вместо этого мы можем использовать файл docker-compose.yml, чтобы определить наш контейнер. При этом мы также сможем поделиться конфигурацией с нашей командой.
Давайте остановим и удалим текущий container:
docker stop my-postgres
docker rm my-postgres
Теперь мы можем создать наш файл docker-compose.yml.
6. Использование Docker Compose
docker-compose — это просто файл с описанием контейнеров, которые мы хотим запустить в формате YAML. Давайте создадим файл docker-compose.yml для контейнера Postgresql:
version: '3.1'
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: mysecretpassword
ports:
- 5432:5432
Выше мы определяем сервис с именем db с конфигурациями, похожими на предыдущие. Единственное новшество здесь — опция restart. Проще говоря, мы просим Docker всегда перезапускать контейнер, если он останавливается, например из‑за ошибки или system reboot.
Давайте запустим контейнер с помощью команды docker-compose из той же директории, где мы сохранили этот файл:
docker-compose up -d
Снова мы используем опцию -d, чтобы запустить контейнер в detached mode.
Чтобы остановить и удалить контейнер, мы можем использовать команду docker-compose down:
docker-compose down
Теперь мы знаем, как легко создать local database с помощью Docker. Но помните, это не подходит для production. Нам нужно учесть другие вещи для нашего production environment.
Если у нас есть такая возможность, нам следует выбирать управляемый сервис баз данных — например, Amazon RDS, Google Cloud SQL или Azure Database for PostgreSQL.
7. Сохранение данных контейнера PostgreSQL
При текущей настройке, если мы удалим PostgreSQL container, мы также потеряем данные, содержащиеся в нём. Чтобы данные сохранялись, мы можем смонтировать локальную папку в container с помощью опции –volume или -v. Например:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -v /path/to/local/folder:/var/lib/postgresql/data -d postgres
Проще говоря, данные PostgreSQL будут храниться в папке path/to/local/folder. Поэтому, если мы удалим container и создадим его заново с тем же volume, данные всё равно останутся.
8. Заключение
В этом руководстве мы узнали, как запускать и настраивать PostgreSQL в Docker container. Сначала мы показали быструю команду, чтобы получить работающий экземпляр базы данных. Затем мы использовали файл docker-compose.yml для определения container. Наконец, мы обсудили persisting the data путём mounting локальной папки в container.


