PostgreSQL в Docker — установка, настройка и подключение

Запустить PostgreSQL в Docker — одна команда. Не нужно ничего устанавливать на систему. Легко снести и поднять заново, идеально для локальной разработки.

Вся рубрика Docker: уроки, команды и практические сценарии

Быстрый старт

# Запустить PostgreSQL 16
docker run -d \
  --name my-postgres \
  -e POSTGRES_PASSWORD=mysecret \
  -p 5432:5432 \
  postgres:16

# Проверить что запущен
docker ps

# Подключиться через psql (установленный на хосте)
psql -h localhost -U postgres -W
# Password: mysecret

Переменные окружения

ПеременнаяПо умолчаниюОписание
POSTGRES_PASSWORDОбязательно. Пароль суперпользователя
POSTGRES_USERpostgresИмя суперпользователя
POSTGRES_DB= POSTGRES_USERИмя базы данных (создаётся при старте)
PGDATA/var/lib/postgresql/dataПуть к данным внутри контейнера
# Запуск с кастомными настройками
docker run -d \
  --name my-postgres \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  postgres:16

Сохранить данные через volume

# БЕЗ volume — данные исчезнут при docker rm!
docker run -d --name pg postgres:16 -e POSTGRES_PASSWORD=secret

# С volume — данные сохраняются
docker run -d \
  --name my-postgres \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_DB=mydb \
  -v pgdata:/var/lib/postgresql/data \
  -p 5432:5432 \
  postgres:16

# Данные переживают docker rm / docker stop
# При следующем запуске с тем же volume — база восстановится

# Проверить что volume создался
docker volume ls | grep pgdata

Войти в psql

# Через docker exec
docker exec -it my-postgres psql -U postgres

# Для конкретного пользователя и базы
docker exec -it my-postgres psql -U myuser -d mydb

# Базовые команды psql
\l          -- список всех баз данных
\c mydb     -- подключиться к базе mydb
\dt         -- список таблиц в текущей базе
\d users    -- структура таблицы users
\q          -- выйти из psql

-- Создать таблицу
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

-- Вставить данные
INSERT INTO users (email) VALUES ('test@example.com');
SELECT * FROM users;

PostgreSQL + pgAdmin через Docker Compose

# docker-compose.yml
version: "3.9"

services:
  postgres:
    image: postgres:16
    container_name: postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql  # авто-инициализация
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myuser -d mydb"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  pgadmin:
    image: dpage/pgadmin4:latest
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@admin.com
      PGADMIN_DEFAULT_PASSWORD: admin
    ports:
      - "8080:80"
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

volumes:
  pgdata:
# Запустить
docker compose up -d

# pgAdmin доступен по: http://localhost:8080
# Email: admin@admin.com / Password: admin
# В pgAdmin добавить сервер:
#   Host: postgres (имя сервиса)
#   Port: 5432
#   Database: mydb
#   Username: myuser
#   Password: mypassword

Инициализация базы данных

-- init.sql — выполнится автоматически при ПЕРВОМ запуске
-- (только если volume пустой — данных ещё нет)

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE NOT NULL,
    name VARCHAR(100),
    created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE posts (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    title VARCHAR(255) NOT NULL,
    content TEXT,
    created_at TIMESTAMP DEFAULT NOW()
);

INSERT INTO users (email, name) VALUES ('admin@example.com', 'Admin');

Резервная копия и восстановление

# Создать дамп базы
docker exec my-postgres pg_dump -U myuser mydb > backup.sql

# Дамп в сжатом формате (-Fc)
docker exec my-postgres pg_dump -U myuser -Fc mydb > backup.dump

# Дамп с датой в имени файла
docker exec my-postgres pg_dump -U myuser mydb \
  > backup-$(date +%Y%m%d-%H%M%S).sql

# Восстановить из SQL
docker exec -i my-postgres psql -U myuser mydb < backup.sql

# Восстановить из сжатого дампа
docker exec -i my-postgres pg_restore -U myuser -d mydb < backup.dump

Часто задаваемые вопросы

Как подключиться к PostgreSQL в Docker из приложения?

Строка подключения: postgresql://user:password@host:5432/dbname. Если приложение на хосте — host = localhost. Если приложение в другом контейнере Docker Compose — host = имя сервиса PostgreSQL (postgres или db). Пример для Python: psycopg2.connect(os.getenv("DATABASE_URL")) где DATABASE_URL = postgresql://myuser:mypassword@db:5432/mydb.

Где хранятся данные PostgreSQL в Docker?

Внутри контейнера: /var/lib/postgresql/data. Если использован named volume — данные хранятся в /var/lib/docker/volumes/pgdata/_data на хосте Linux. Если bind mount — в указанной папке хоста. Без volume данные хранятся в слое контейнера — исчезают при docker rm. Всегда используй named volume для PostgreSQL в продакшне.

Как восстановить базу данных в Docker контейнере?

Из SQL файла: docker exec -i my-postgres psql -U myuser mydb < backup.sql. Из pg_dump формата: docker exec -i my-postgres pg_restore -U myuser -d mydb < backup.dump. Если база не пустая — сначала дропнуть таблицы или создать новую базу. Для инициализации при первом запуске — положи SQL файл в /docker-entrypoint-initdb.d/ через volume mount.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x