Dockerfile Golang: Build & Deploy Backend dengan Docker
Docker memungkinkan Anda untuk membungkus aplikasi Golang menjadi container yang ringan, portable, dan mudah di-deploy ke berbagai environment seperti VPS, cloud, atau Kubernetes. Dengan Dockerfile yang tepat, Anda bisa menghasilkan image yang kecil, aman, dan cepat.
Kenapa Menggunakan Docker untuk Golang?
- Environment konsisten (tidak tergantung OS lokal)
- Mudah deploy ke server atau cloud
- Isolasi aplikasi lebih aman
- Cocok untuk microservices architecture
- Mempermudah CI/CD pipeline
Dockerfile Sederhana Golang
FROM golang:1.21-alpine
WORKDIR /app
COPY . .
RUN go build -o app
CMD ["./app"]
Dockerfile di atas adalah versi paling sederhana. Namun, untuk production, kita perlu optimasi agar image lebih kecil dan lebih aman.
Optimasi dengan Multi-Stage Build
Multi-stage build memungkinkan kita memisahkan proses build dan runtime. Hasilnya adalah image final yang jauh lebih kecil karena tidak membawa dependency build.
# ================= BUILD STAGE =================
FROM golang:1.21-alpine AS builder
WORKDIR /app
# Install git (jika butuh dependency private)
RUN apk add --no-cache git
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o app
# ================= FINAL STAGE =================
FROM alpine:latest
WORKDIR /app
# Copy binary dari builder
COPY --from=builder /app/app .
# Expose port (optional)
EXPOSE 8080
CMD ["./app"]
Best Practice Docker Golang
- Gunakan multi-stage build untuk mengurangi ukuran image
- Gunakan base image ringan seperti alpine
- Jangan jalankan aplikasi sebagai root
- Gunakan .dockerignore untuk menghindari file tidak penting
- Cache dependency dengan COPY go.mod terlebih dahulu
- Gunakan environment variable untuk konfigurasi
Menjalankan Container Tanpa Root (Security)
Untuk meningkatkan keamanan, sebaiknya aplikasi tidak dijalankan sebagai root user di dalam container.
FROM alpine:latest
RUN adduser -D appuser
USER appuser
WORKDIR /app
COPY --from=builder /app/app .
CMD ["./app"]
Build dan Run Docker
# Build image
docker build -t golang-app .
# Run container
docker run -p 8080:8080 golang-app
Contoh File .dockerignore
.git
node_modules
.env
*.log
tmp/
vendor/
Deploy ke Production
Setelah image berhasil dibuat, Anda bisa push ke Docker Hub atau registry lain seperti GitHub Container Registry, lalu deploy ke VPS, Kubernetes, atau platform seperti AWS, GCP, dan DigitalOcean.
- Push ke Docker Hub
- Gunakan docker-compose untuk multi-service
- Deploy ke Kubernetes (K8s)
- Gunakan CI/CD seperti GitHub Actions
Kesimpulan
Docker adalah solusi terbaik untuk deployment aplikasi Golang modern. Dengan multi-stage build dan best practice yang tepat, Anda bisa membuat container yang ringan, aman, dan siap production.