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/🎮🍉⌨️🍩💻