Panduan Docker untuk Developer 2026: Tutorial Lengkap dari Dasar
Docker adalah tool wajib untuk developer modern. Dengan Docker, “works on my machine” bukan lagi excuse! Di artikel ini, kita belajar Docker dari nol sampai bisa deploy aplikasi production-ready.
Apa Itu Docker?
Docker adalah platform untuk develop, ship, dan run aplikasi dalam containers. Container adalah package yang berisi aplikasi + semua dependencies-nya.
Kenapa Pakai Docker?
1. Consistency
- Development = Staging = Production
- No more “works on my machine”
- Same environment everywhere
2. Isolation
- Setiap app dalam container terpisah
- Tidak bentrok dependencies
- Clean & organized
3. Portability
- Run anywhere (laptop, server, cloud)
- Easy migration
- Platform independent
4. Efficiency
- Lightweight (vs VM)
- Fast startup (<1 second)
- Resource efficient
5. Scalability
- Easy horizontal scaling
- Load balancing
- Microservices ready
Docker vs Virtual Machine
| Feature | Docker | VM |
|---|---|---|
| Size | MB | GB |
| Startup | Seconds | Minutes |
| Performance | Native | Overhead |
| Isolation | Process-level | OS-level |
| Resource | Shared kernel | Full OS |
Install Docker
Windows/Mac
Download Docker Desktop: https://www.docker.com/products/docker-desktop
Linux (Ubuntu)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
Verify Installation
docker --version
docker run hello-world
Konsep Dasar Docker
1. Image
Blueprint/template untuk container. Read-only.
# Pull image dari Docker Hub
docker pull nginx
docker pull node:20
docker pull mysql:8.0
2. Container
Running instance dari image.
# Run container
docker run nginx
# Run dengan nama
docker run --name my-nginx nginx
# Run di background
docker run -d nginx
# Run dengan port mapping
docker run -d -p 8080:80 nginx
3. Dockerfile
Recipe untuk build custom image.
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
4. Docker Compose
Manage multi-container applications.
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DATABASE_URL=mysql://root:password@db:3306/myapp
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=myapp
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
Docker Commands Essentials
Container Management
# List running containers
docker ps
# List all containers
docker ps -a
# Start container
docker start container_name
# Stop container
docker stop container_name
# Restart container
docker restart container_name
# Remove container
docker rm container_name
# Remove all stopped containers
docker container prune
Image Management
# List images
docker images
# Remove image
docker rmi image_name
# Remove unused images
docker image prune
# Build image
docker build -t my-app:1.0 .
# Tag image
docker tag my-app:1.0 username/my-app:1.0
# Push to Docker Hub
docker push username/my-app:1.0
Logs & Debugging
# View logs
docker logs container_name
# Follow logs
docker logs -f container_name
# Execute command in container
docker exec -it container_name bash
# Inspect container
docker inspect container_name
# View container stats
docker stats
Dockerfile Best Practices
1. Use Official Base Images
# Good
FROM node:20-alpine
# Bad
FROM ubuntu
RUN apt-get install nodejs
2. Multi-Stage Builds
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Production stage
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
CMD ["node", "dist/index.js"]
3. Minimize Layers
# Bad
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
# Good
RUN apt-get update && \
apt-get install -y curl git && \
rm -rf /var/lib/apt/lists/*
4. Use .dockerignore
node_modules
npm-debug.log
.git
.env
*.md
.vscode
5. Don’t Run as Root
FROM node:20-alpine
# Create app user
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
WORKDIR /app
COPY --chown=nodejs:nodejs . .
USER nodejs
CMD ["node", "index.js"]
Docker Compose Examples
Node.js + MongoDB
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- MONGO_URL=mongodb://mongo:27017/myapp
depends_on:
- mongo
mongo:
image: mongo:7
volumes:
- mongo-data:/data/db
ports:
- "27017:27017"
volumes:
mongo-data:
React + Node.js + PostgreSQL
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
backend:
build: ./backend
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
depends_on:
- db
db:
image: postgres:16
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_DB=myapp
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Docker Networking
Network Types
- bridge (default): Isolated network
- host: Use host network
- none: No network
# Create network
docker network create my-network
# Run container in network
docker run -d --network my-network --name app1 nginx
docker run -d --network my-network --name app2 nginx
# Containers can communicate by name
# app1 can ping app2
Docker Volumes
Types of Volumes
- Named volumes: Managed by Docker
- Bind mounts: Mount host directory
- tmpfs: In-memory storage
# Named volume
docker run -v my-data:/app/data nginx
# Bind mount
docker run -v $(pwd):/app nginx
# Read-only mount
docker run -v $(pwd):/app:ro nginx
Production Deployment
1. Docker Swarm
# Initialize swarm
docker swarm init
# Deploy stack
docker stack deploy -c docker-compose.yml myapp
# Scale service
docker service scale myapp_web=5
2. Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 3000
3. Cloud Platforms
- AWS: ECS, EKS, Fargate
- Google Cloud: GKE, Cloud Run
- Azure: AKS, Container Instances
- DigitalOcean: App Platform, Kubernetes
Security Best Practices
1. Scan Images for Vulnerabilities
docker scan my-app:1.0
2. Use Minimal Base Images
# Alpine is smaller & more secure
FROM node:20-alpine
3. Don’t Store Secrets in Images
# Bad
ENV API_KEY=secret123
# Good - use environment variables
# docker run -e API_KEY=secret123 my-app
4. Keep Images Updated
# Rebuild regularly
docker build --no-cache -t my-app:latest .
5. Limit Container Resources
services:
app:
image: my-app
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
Troubleshooting Common Issues
Container Exits Immediately
# Check logs
docker logs container_name
# Run interactively
docker run -it my-app sh
Port Already in Use
# Find process using port
lsof -i :3000
# Use different port
docker run -p 3001:3000 my-app
Permission Denied
# Add user to docker group
sudo usermod -aG docker $USER
# Logout and login again
Out of Disk Space
# Clean up
docker system prune -a
# Remove volumes
docker volume prune
Docker Cheat Sheet
# Build & Run
docker build -t app .
docker run -d -p 3000:3000 app
# Compose
docker-compose up -d
docker-compose down
docker-compose logs -f
# Clean Up
docker system prune -a
docker volume prune
docker network prune
# Debug
docker logs -f container
docker exec -it container sh
docker inspect container
Kesimpulan
Docker adalah game-changer untuk development workflow. Dengan Docker, Anda bisa:
- Consistent environment
- Easy collaboration
- Fast deployment
- Better scalability
- Production-ready apps
Key takeaways:
- Start with official images
- Use Docker Compose for multi-container
- Follow security best practices
- Keep images small & updated
- Practice with real projects
Artikel Terkait
- Cara Membuat API dengan Node.js 2026 - Containerize Node.js apps
- Cloud Computing untuk Startup 2026 - Deploy Docker ke cloud
- Optimasi Database MySQL 2026 - Database dalam container
Butuh bantuan setup Docker untuk project Anda? Hydra Core Digitech siap bantu dari development hingga production deployment. Konsultasi gratis!
