Docker / PostgreSQL container

PostgreSQL container

PostgreSQL суулгахад уламжлалт аргаар олон алхам шаардлагатай. Docker ашиглавал нэг командаар ажиллуулна.

Хурдан эхлүүлэх

bash
docker run -d \
  --name mydb \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  postgres:16

Энэ л хангалттай. PostgreSQL контейнер ажиллаж байна.

Environment variable-ууд

postgres image дараах environment variable-уудыг дэмждэг:

bash
docker run -d \
  --name mydb \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  postgres:16

| Variable | Утга | Анхдагч | | ------------------- | -------------------- | ------------------------ | | POSTGRES_PASSWORD | Нууц үг — заавал | — | | POSTGRES_USER | Хэрэглэгчийн нэр | postgres | | POSTGRES_DB | Database нэр | POSTGRES_USER-тэй адил |

psql-ээр холбогдох

Container дотроос:

bash
docker exec -it mydb psql -U myuser -d myapp

Хостоос (psql суусан бол):

bash
psql -h localhost -p 5432 -U myuser -d myapp

psql дотор:

sql
-- Database-уудыг харах
\l

-- Хүснэгтүүдийг харах
\dt

-- Гарах
\q

Volume — өгөгдлийг хадгалах

Container устгагдахад өгөгдөл ч устдаг. Volume ашиглавал өгөгдөл хадгалагдана:

bash
docker run -d \
  --name mydb \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

pgdata нэртэй Docker volume үүсгэж, PostgreSQL-ийн өгөгдлийн фолдерт холбоно.

Container устгаад дахин үүсгэхэд өгөгдөл хэвээр байна:

bash
docker stop mydb
docker rm mydb

# Дахин үүсгэх — өгөгдөл хэвээр
docker run -d \
  --name mydb \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

Анхны SQL скрипт ажиллуулах

/docker-entrypoint-initdb.d/ фолдерт .sql файл mount хийвэл container эхэлж байхад автоматаар ажиллана:

bash
docker run -d \
  --name mydb \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  -v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql \
  postgres:16

init.sql

sql
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username TEXT UNIQUE NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

INSERT INTO users (username) VALUES ('admin');

Анхааруулга: Өгөгдлийн сан аль хэдийн үүссэн бол (volume байгаа бол) энэ скрипт дахин ажиллахгүй.

Docker Compose-тай ашиглах

Апп болон database-ийг хамт ажиллуулах:

yaml
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mysecretpassword
      POSTGRES_DB: myapp
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myuser -d myapp"]
      interval: 10s
      timeout: 5s
      retries: 5

  app:
    build: .
    ports:
      - "8000:8000"
    environment:
      DATABASE_URL: postgresql://myuser:mysecretpassword@db:5432/myapp
    depends_on:
      db:
        condition: service_healthy

volumes:
  pgdata:

depends_on + healthcheck — database бэлэн болсны дараа апп эхэлнэ.

Нэмэлт PostgreSQL container-ууд

pgAdmin — GUI хэрэгсэл:

bash
docker run -d \
  --name pgadmin \
  -e PGADMIN_DEFAULT_EMAIL=admin@example.com \
  -e PGADMIN_DEFAULT_PASSWORD=admin \
  -p 5050:80 \
  dpage/pgadmin4

http://localhost:5050 — pgAdmin нээгдэнэ.

Нэг network-т оруулах:

bash
docker network create mynetwork

docker run -d --name mydb --network mynetwork \
  -e POSTGRES_PASSWORD=secret postgres:16

docker run -d --name pgadmin --network mynetwork \
  -p 5050:80 \
  -e PGADMIN_DEFAULT_EMAIL=admin@example.com \
  -e PGADMIN_DEFAULT_PASSWORD=admin \
  dpage/pgadmin4

pgAdmin-д холболт нэмэхдээ hostname: mydb гэж бичнэ.

Backup ба restore

bash
# Backup
docker exec mydb pg_dump -U myuser myapp > backup.sql

# Restore
docker exec -i mydb psql -U myuser myapp < backup.sql

Дараагийн хичээлд:

Docker Hub болон бусад registry-д image хэрхэн байршуулах, татаж авах талаар үзнэ.