Dockerfile, Docker Compose, dan Application Deployment
Menulis Dockerfile multi-stage, membangun image, menyusun Docker Compose untuk aplikasi dan database, lalu men-deploy-nya.
Setelah memahami komponen Docker, saatnya mengemas aplikasi sendiri. Modul ini membahas Dockerfile, Docker Compose, dan alur deployment aplikasi Node.js.
Dockerfile
Dockerfile adalah resep untuk membangun image.
Instruksi penting
| Instruksi | Fungsi |
|---|---|
FROM | Image dasar |
WORKDIR | Direktori kerja |
COPY | Menyalin file dari build context |
RUN | Menjalankan perintah saat build |
ENV | Environment variable |
EXPOSE | Dokumentasi port |
USER | User saat container berjalan |
CMD | Perintah default container |
ENTRYPOINT | Entry point utama |
HEALTHCHECK | Cek kesehatan container |
Dockerfile Node.js multi-stage
# Stage 1: dependencies
FROM node:22-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci
# Stage 2: build
FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# Stage 3: runtime
FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=build /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]Keuntungan multi-stage:
- Image akhir lebih kecil.
- Build tools tidak ikut masuk runtime.
- Mengurangi attack surface.
.dockerignore
node_modules
.git
.env
npm-debug.log
Dockerfile
docker-compose.yml.dockerignore mencegah file besar/rahasia masuk ke build context dan image.
Jangan COPY .env ke image
File .env berisi rahasia. Masukkan ke .dockerignore dan berikan environment saat runtime
melalui Compose, Docker secrets, atau platform deployment.
Build dan jalankan
docker build -t myapp:1.0.0 .
docker images | grep myapp
docker run -d --name myapp -p 3000:3000 --env-file .env myapp:1.0.0
docker logs -f myapp
curl -I http://localhost:3000Tag juga dengan latest bila sesuai:
docker tag myapp:1.0.0 myapp:latestDocker Compose
Compose mendefinisikan beberapa container dalam satu file YAML.
Struktur dasar
services:
app:
build: .
container_name: myapp
restart: unless-stopped
ports:
- "3000:3000"
env_file:
- .env
depends_on:
db:
condition: service_healthy
networks:
- app-net
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-net
volumes:
db-data:
networks:
app-net:Environment
Buat .env di direktori Compose:
DB_PASSWORD=ganti-dengan-password-kuat
NODE_ENV=production
PORT=3000Compose membaca .env otomatis untuk substitusi ${DB_PASSWORD}.
Menjalankan
docker compose up -d
docker compose ps
docker compose logs -f app
docker compose exec app sh
docker compose down
docker compose down -v| Perintah | Fungsi |
|---|---|
up -d | Bangun dan jalankan di background |
ps | Status service |
logs -f | Ikuti log |
exec | Masuk ke container |
down | Hentikan dan hapus container |
down -v | Hapus juga volume (hati-hati) |
build | Bangun ulang image |
pull | Ambil image terbaru |
down -v menghapus data volume
docker compose down -v menghapus named volume. Jangan jalankan pada produksi tanpa backup dan
tanpa memahami konsekuensinya.
Deployment dengan Compose
Alur umum di server:
# 1. Ambil kode terbaru
git pull
# 2. Bangun ulang image
docker compose build --pull
# 3. Jalankan dengan zero-downtime terbatas
docker compose up -d
# 4. Cek status dan log
docker compose ps
docker compose logs --tail=100 appUntuk pembaruan bertahap, beberapa strategi:
docker compose up -d --no-deps appuntuk hanya recreate service aplikasi.- Gunakan reverse proxy dengan health check sebelum mengarahkan trafik.
- Simpan image versi sebelumnya untuk rollback.
Rollback sederhana
docker tag myapp:1.0.0 myapp:rollback
docker compose up -d --no-deps appAtau ubah tag image di Compose ke versi sebelumnya lalu up -d.
Integrasi reverse proxy
Di NPM, arahkan proxy host ke http://IP-SERVER:3000 atau http://nama-container:3000 bila NPM
berada di jaringan Docker yang sama.
app.example.com → NPM → myapp:3000Pastikan aplikasi listen di 0.0.0.0 di dalam container.
Troubleshooting
| Gejala | Cek |
|---|---|
| Container langsung exit | docker logs <container> |
port is already allocated | Port host bentrok, docker ps |
| Aplikasi tidak bisa akses DB | Nama host, network, healthcheck |
| Build lambat | Urutan layer, cache, .dockerignore |
| Image besar | Multi-stage, base image, file tidak perlu |
| Data hilang | Volume belum dipasang |
| Permission denied | USER, owner file, bind mount |
Debug container
docker ps -a
docker logs --tail=200 myapp
docker inspect myapp
docker exec -it myapp sh
docker compose configPraktik: deploy aplikasi + database
- Buat
Dockerfilemulti-stage. - Buat
.dockerignore. - Buat
docker-compose.ymldengan serviceappdandb. - Buat
.envdan amankan permission. - Jalankan
docker compose up -d. - Cek
docker compose psdan log. - Uji health endpoint.
- Arahkan reverse proxy ke aplikasi.
- Simpan tag image versi rilis untuk rollback.
Ringkasan
- Dockerfile membangun image; multi-stage menghasilkan image runtime yang kecil.
.dockerignoremencegah file rahasia dan tidak perlu masuk image.- Compose mengelola aplikasi, database, network, dan volume dalam satu file.
- Deployment yang baik memakai image bertag, health check, dan rencana rollback.
Selesai — Paket 1
Anda telah menyelesaikan fondasi DevOps: virtualisasi, Linux, jaringan, administrasi server, Tailscale, domain/Cloudflare, deployment PM2, dan Docker. Lanjutkan ke Paket 2 untuk CI/CD, deployment produksi, observability, DevSecOps, otomasi infrastruktur, dan Kubernetes.
Docker Architecture: Image, Container, Network, dan Volume
Memahami komponen Docker, siklus hidup container, jaringan, volume, registry, serta perintah dasar yang wajib dikuasai.
Paket 2 · Praktik Lanjutan
Sepuluh modul lanjutan dari Git & CI/CD, deployment produksi, high availability, performa, database, observability, DevSecOps, otomasi infrastruktur, hingga Kubernetes.