PostgreSQL + pgAdmin в Docker на Linux

Постановка задачи copy

Хочу поднять PostgreSQL на локальном компьютере (Manjaro + KDE) для учебных целей и управлять им через pgAdmin и psql .

Решение copy

Мой выбор пал на Docker, поскольку он позволяет реализовать задуманное с наименьшими затратами времени и минимальным влиянием на остальную систему. А ещё потому что я не смог быстро поставить pgAdmin напрямую в Manjaro ¯\(ツ)

В начале установите Docker, если он у вас ещё не установлен.

Мы будем поднимать два контейнера: один с PostgreSQL, другой — с pgAdmin. Объединим их при помощи docker compose. Создайте следующий файл в рабочей директории:

version: "3.8"

services:
  postgres:
    image: postgres:16.3-alpine
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres:/var/lib/postgresql/data

  pgadmin:
    image: dpage/pgadmin4:8.6
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@pgadmin.com
      PGADMIN_DEFAULT_PASSWORD: password
      PGADMIN_LISTEN_PORT: 80
    ports:
      - "15432:80"
    volumes:
      - pgadmin:/var/lib/pgadmin
    depends_on:
      - postgres

volumes:
  postgres:
  pgadmin:

Источник вдохновения.

Я пробрасываю наружу 5432 порт, потому что хочу работать с postgres-ом из хостовой ОС через psql.

Управление контейнерами copy

Чтобы запустить контейнеры в фоне, выполните команду

docker compose up -d

в директории с описанным выше docker-compose.yaml файлом.

👉 После того как контейнеры запустятся, на http://localhost:15432/ будет доступна веб-версия pgAdmin.

Данные для входа прописаны в docker-compose.yaml:

  • Логин: admin@pgadmin.com — полеPGADMIN_DEFAULT_EMAIL
  • Пароль: password — полеPGADMIN_DEFAULT_PASSWORD

При необходимости их можно поменять.

После первого запуска нажмите “Add New Server”, чтобы подключиться к PostgreSQL.

  • Host name/address: postgres — название контейнера c postgres в docker-compose.yaml
  • Username: postgres — поле POSTGRES_USER
  • Password: postgres — поле POSTGRES_PASSWORD

Profit 🎆. Пользуйтесь pgAdmin.

Чтобы остановить контейнеры, выполните команду

docker compose down

При этом данные и PostgreSQL и pgAdmin останутся и будут доступы при следующем запуске контейнера. Они хранятся в docker volume-ах, которые мы описали в docker-compose.yaml.

Данные pgAdmin copy

В pgAdmin можно сохранять файлы: бэкапы, ER диаграммы баз. Проводник в GUI pgAdmin показывает, что они лежат в корне файловой системы. Не верьте ему! На самом деле они лежат в docker volume (очевидно), но не в его корне (уже менее очевидно, но факт).

Посмотреть файлы в контейнере:

  1. Заходим в контейнер:
docker exec -it <containerName> sh
  1. Внутри docker-контейнера переходим в директорию пользователя
cd /var/lib/pgadmin/storage/admin_pgadmin.com

admin_pgadmin.com — email пользователя, в котором @ заменён на _

  1. Вот тут-то они и притаились. Можно взглянуть на содержимое директории через ls -lah, просмотреть файлы при помощи less и даже открыть их в vi!

Стянуть файлы из контейнера в хостовую ОС:

docker cp <containerId>:/file/path/within/container /host/path/target

Имя и Id контейнера можно узнать, взглянув на список запущенных контейнеров командой

docker ps

💡Docker-контейнерами можно управлять при помощи утилиты lazydocker.

Бэкапы в pgAdmin copy

Для того, чтобы файлы бэкапов имели человекочикаемый вид, их нужно создавать со следующими настройками: ./backup-settings.png

❗ Впоследствии мне не удалось восстановить БД в pgAdmin через такой бэкап, в отличие от бэкапа с форматом Custom — они создаются по умолчанию.

psql copy

Подключиться к контейнеру с postgres-ом можно командой:

psql -h localhost -p 5432 -U postgres -d dbname

dbname — имя БД, к которой подключаемся

Данные для входа прописаны в docker-compose.yaml:

  • Логин: postgres — поле POSTGRES_USER
  • Пароль: postgres — поле POSTGRES_PASSWORD

При необходимости их можно поменять.

Шпаргалка по psql.

Бэкапы БД в SQL формате copy

Создание бэкапа БД copy

pg_dump -h HOST -p 5432 -U USER_NAME DABASE_NAME > backup.sql

Накатывание данных в БД из бэкапа copy

  1. Удаляем существующую БД, если нужно
dropdb -h HOST -p 5432 -U USER_NAME -f "DABASE_NAME"
  1. Создаём новую БД
psql -h HOST -p 5432 -U USER_NAME postgres -c "create database DABASE_NAME"
  1. Накатываем из бэкапа
psql -h HOST -p 5432 -U USER_NAME -d DABASE_NAME < backup.sql

В заключение copy

🦁 Порекомендую интересующимся пройти “Интерактивный тренажер по SQL” на Stepik. Курс содержит теоретическую информацию по SQL и множество практических заданий с автоматической проверкой.

читайте также