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

- Быстрый старт
- Переменные окружения
- Сохранить данные через volume
- Войти в psql
- PostgreSQL + pgAdmin через Docker Compose
- Инициализация базы данных
- Резервная копия и восстановление
- Часто задаваемые вопросы
- Как подключиться к PostgreSQL в Docker из приложения?
- Где хранятся данные PostgreSQL в Docker?
- Как восстановить базу данных в 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_USER | postgres | Имя суперпользователя |
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.
Что читать дальше по Docker
Чтобы связать тему с соседними практическими материалами, дальше удобно открыть:
- Docker volumes — сохранить данные базы между перезапусками.
- Docker Compose — запускать PostgreSQL вместе с приложением.
- Python Flask в Docker — подключить базу к Flask-приложению.
- Docker backup — подготовить резервное копирование базы.



