tutorial, docker,

Docker dengan Database: Mengelola PostgreSQL dan MySQL di Container

Kiki/🎮🍉⌨️🍩💻 Kiki/🎮🍉⌨️🍩💻 Sep 06, 2026 · 6 mins read
Docker dengan Database: Mengelola PostgreSQL dan MySQL di Container
Share this

Menjalankan database di Docker adalah salah satu use case yang paling banyak dilakukan developer — baik untuk development lokal maupun production. Artikel ini membahas cara menjalankan PostgreSQL dan MySQL di Docker dengan benar, termasuk backup otomatis dan restore data.


PostgreSQL di Docker

Menjalankan PostgreSQL

docker run -d \
  --name postgres \
  -e POSTGRES_USER=admin \
  -e POSTGRES_PASSWORD=rahasia123 \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  -v postgres_data:/var/lib/postgresql/data \
  postgres:16-alpine

PostgreSQL dengan Docker Compose

version: '3.8'

services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: ${DB_USER:-admin}
      POSTGRES_PASSWORD: ${DB_PASSWORD:?Database password required}
      POSTGRES_DB: ${DB_NAME:-myapp}
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./scripts/postgres/init:/docker-entrypoint-initdb.d   # SQL init scripts
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-admin} -d ${DB_NAME:-myapp}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

volumes:
  postgres_data:

Perintah PostgreSQL Berguna

# Masuk ke psql interaktif
docker exec -it postgres psql -U admin myapp

# Jalankan query langsung
docker exec postgres psql -U admin myapp -c "SELECT COUNT(*) FROM users;"

# Import SQL file
docker exec -i postgres psql -U admin myapp < backup.sql

# List semua database
docker exec postgres psql -U admin -c "\l"

# List semua tabel
docker exec postgres psql -U admin myapp -c "\dt"

MySQL di Docker

Menjalankan MySQL

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=rootrahasia \
  -e MYSQL_DATABASE=myapp \
  -e MYSQL_USER=dev \
  -e MYSQL_PASSWORD=devrahasia \
  -p 3306:3306 \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0

MySQL dengan Docker Compose

services:
  db:
    image: mysql:8.0
    restart: unless-stopped
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?required}
      MYSQL_DATABASE: ${MYSQL_DATABASE:-myapp}
      MYSQL_USER: ${MYSQL_USER:-dev}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:?required}
    volumes:
      - mysql_data:/var/lib/mysql
      - ./scripts/mysql/init:/docker-entrypoint-initdb.d
    command: --default-authentication-plugin=mysql_native_password
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  mysql_data:

Perintah MySQL Berguna

# Masuk ke MySQL CLI
docker exec -it mysql mysql -u dev -p myapp

# Jalankan query langsung
docker exec mysql mysql -u dev -pdevrahasia myapp -e "SHOW TABLES;"

# Import SQL file
docker exec -i mysql mysql -u dev -pdevrahasia myapp < backup.sql

Backup Database

Backup PostgreSQL

# Backup satu database ke file SQL
docker exec postgres pg_dump -U admin myapp > backup_$(date +%Y%m%d).sql

# Backup dalam format compressed
docker exec postgres pg_dump -U admin -Fc myapp > backup_$(date +%Y%m%d).dump

# Backup semua database
docker exec postgres pg_dumpall -U admin > all_databases.sql

Backup MySQL

# Backup satu database
docker exec mysql mysqldump -u root -prootrahasia myapp > backup_$(date +%Y%m%d).sql

# Backup dengan kompresi
docker exec mysql mysqldump -u root -prootrahasia myapp | gzip > backup_$(date +%Y%m%d).sql.gz

# Backup semua database
docker exec mysql mysqldump -u root -prootrahasia --all-databases > all_databases.sql

Backup Otomatis dengan Cron

Buat skrip scripts/backup.sh:

#!/bin/bash
set -e

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/var/backups/docker-db"
KEEP_DAYS=7

mkdir -p "$BACKUP_DIR"

# Backup PostgreSQL
docker exec postgres pg_dump -U admin myapp | \
  gzip > "$BACKUP_DIR/postgres_$DATE.sql.gz"

echo "Backup selesai: postgres_$DATE.sql.gz"

# Hapus backup lebih dari 7 hari
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
echo "Backup lama dihapus (>$KEEP_DAYS hari)"

Jadwalkan dengan cron:

chmod +x scripts/backup.sh

# Edit crontab
crontab -e

# Jalankan backup setiap hari jam 02:00
0 2 * * * /var/www/myapp/scripts/backup.sh >> /var/log/db-backup.log 2>&1

Restore Database

Restore PostgreSQL

# Dari file SQL
docker exec -i postgres psql -U admin myapp < backup_20260901.sql

# Dari file dump compressed
docker exec -i postgres pg_restore -U admin -d myapp < backup_20260901.dump

Restore MySQL

# Dari file SQL
docker exec -i mysql mysql -u root -prootrahasia myapp < backup_20260901.sql

# Dari file gzip
gunzip < backup_20260901.sql.gz | docker exec -i mysql mysql -u root -prootrahasia myapp

Migrasi Database dengan Prisma

# Jalankan migrasi di container
docker compose exec api npx prisma migrate deploy

# Buat migrasi baru (development)
docker compose exec api npx prisma migrate dev --name add_user_role

# Buka Prisma Studio untuk lihat data
docker compose exec api npx prisma studio --browser none
# Lalu buka http://localhost:5555 di browser lokal

# Reset database (development only!)
docker compose exec api npx prisma migrate reset

pgAdmin — GUI untuk PostgreSQL

Tambahkan pgAdmin ke docker-compose.yml untuk development:

  pgadmin:
    image: dpage/pgadmin4:latest
    ports:
      - "5050:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@admin.com
      PGADMIN_DEFAULT_PASSWORD: admin
    volumes:
      - pgadmin_data:/var/lib/pgadmin
    profiles:
      - tools

volumes:
  pgadmin_data:
# Jalankan hanya tools profile
docker compose --profile tools up -d pgadmin
# Akses di http://localhost:5050

Kesimpulan

Menjalankan database di Docker sangat praktis untuk development dan production. Kunci suksesnya adalah: selalu gunakan named volume untuk data persisten, konfigurasi healthcheck agar service lain menunggu database siap, dan siapkan backup otomatis dari hari pertama sebelum data production masuk.

Di artikel terakhir seri Docker, kita bahas Docker dalam CI/CD pipeline — cara mengintegrasikan Docker ke GitHub Actions untuk build, test, dan deploy otomatis.

Kiki/🎮🍉⌨️🍩💻
Written by Kiki/🎮🍉⌨️🍩💻
hello I'm friend K.