Container Platform for Everyone
3 Weeks - 15 Days - Complete Guide
Docker adalah platform untuk mengembangkan, mengirim, dan menjalankan aplikasi dalam container
| Hari | Topik | Praktik |
|---|---|---|
| 1 | Pengenalan Docker | Apa itu Docker? |
| 2 | Instalasi | Install Docker di Linux/Windows |
| 3 | Docker Commands | Dasar commands |
| 4 | Images | Cari, pull, run image |
| 5 | Containers | Create, start, stop container |
Image - Template readonly untuk containerContainer - Instance dari image yang berjalanDockerfile - Blueprint untuk build imageRegistry - Tempat menyimpan image (Docker Hub)# Update apt
sudo apt update
# Install dependencies
sudo apt install -y ca-certificates curl gnupg
# Add Docker GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker --version
docker run hello-world
# Info dan Version
docker --version
docker info
docker ps
# Container
docker run hello-world
docker run -it ubuntu bash
docker ps -a
docker start <container_id>
docker stop <container_id>
docker rm <container_id>
# Images
docker images
docker pull nginx:latest
docker rmi <image_id>
-d # Detached mode (background)
-i # Interactive
-t # TTY
-p # Port mapping
-v # Volume
--name # Nama container
-e # Environment variable
# Cari image
docker search nginx
# Pull image
docker pull nginx:latest
docker pull ubuntu:22.04
# List images
docker images
docker images -a
# Hapus by ID
docker rmi <image_id>
# Hapus dangling images
docker image prune
# Hapus semua unused images
docker image prune -a
# Lihat layers
docker history nginx:latest
# Create dan start container
docker run -d --name myapp nginx
# Stop container
docker stop myapp
# Start container
docker start myapp
# Restart container
docker restart myapp
# Hapus container
docker rm myapp
# Force remove
docker rm -f myapp
# Lihat logs
docker logs myapp
docker logs -f myapp
docker logs --tail 100 myapp
# Exec into container
docker exec -it myapp bash
docker exec myapp ls /app
| Hari | Topik | Praktik |
|---|---|---|
| 1 | Dockerfile | Membuat custom image |
| 2 | Build Image | Build dari Dockerfile |
| 3 | Volumes | Data persistence |
| 4 | Networking | Docker networks |
| 5 | Docker Compose | Multi-container apps |
# Use base image
FROM node:18-alpine
# Set working directory
WORKDIR /app
# Copy files
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy source
COPY . .
# Expose port
EXPOSE 3000
# Start command
CMD ["node", "index.js"]
FROM - Base imageRUN - Execute commandsCOPY - Copy filesWORKDIR - Working directoryEXPOSE - PortCMD - Default command# Build dari Dockerfile
docker build -t myapp:latest .
# Build dengan context
docker build -t myapp:latest -f ./Dockerfile.prod .
# Tag image
docker tag myapp:latest myregistry.com/myapp:v1
# Push ke registry
docker push myregistry.com/myapp:v1
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
dist
# Create volume
docker volume create mydata
# Mount ke container
docker run -v mydata:/app/data nginx
# List volumes
docker volume ls
# Inspect volume
docker volume inspect mydata
# Mount current directory
docker run -v $(pwd):/app nginx
# Read-only
docker run -v $(pwd):/app:ro nginx
# Create network
docker network create mynetwork
# Connect container ke network
docker network connect mynetwork mycontainer
# List networks
docker network ls
# Inspect network
docker network inspect bridge
# Disconnect
docker network disconnect mynetwork mycontainer
# Map port 8080 host ke 80 container
docker run -p 8080:80 nginx
# Multiple ports
docker run -p 8080:80 -p 443:443 nginx
# Random port
docker run -p 80 nginx
services:
web:
image: nginx
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
networks:
- frontend
- backend
db:
image: postgres:15
volumes:
- dbdata:/var/lib/postgresql/data
networks:
- backend
networks:
frontend:
backend:
volumes:
dbdata:
docker compose up -d
docker compose down
docker compose logs -f
docker compose build
| Hari | Topik | Praktik |
|---|---|---|
| 1 | Multi-stage Builds | Optimize image size |
| 2 | Health Checks | |
| 3 | Resource Limits | CPU dan memory limits |
| 4 | Security | Best practices |
| 5 | Monitoring | Logs dan metrics |
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
# Build
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# Run
FROM alpine:latest
COPY --from=builder /app/main /main
CMD ["/main"]
FROM nginx:latest
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
# Untuk PostgreSQL
HEALTHCHECK --interval=10s --timeout=3s --start-period=10s \
CMD pg_isready -U postgres || exit 1
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
docker inspect --format='{{.State.Health.Status}}' container_name
# Batasi memory 512MB
docker run -m 512m nginx
# Memory reservation
docker run -m 512m --memory-reservation=256m nginx
# Batasi 1 CPU
docker run --cpus=1 nginx
# Batasi CPU quota
docker run --cpu-quota=50000 nginx
# CPU set
docker run --cpuset-cpus="0,1" nginx
services:
app:
image: nginx
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
# Jangan jalanin sebagai root
docker run -u 1000 myapp
# Read-only root filesystem
docker run --read-only myapp
# Drop all capabilities
docker run --cap-drop ALL myapp
# Specific capabilities only
docker run --cap-add NET_BIND_SERVICE myapp
# No new privileges
docker run --security-opt=no-new-privileges myapp
docker scout cves myimage:latest
docker scout recommendations myimage:latest
# Images
docker images, docker pull, docker rmi
# Containers
docker run, docker ps, docker stop, docker rm
# Logs & Exec
docker logs, docker exec -it
# Volumes
docker volume create, docker volume ls
# Networks
docker network create, docker network ls
# Compose
docker compose up -d, docker compose down
FROM, RUN, COPY, WORKDIR, EXPOSE, ENV, CMD, ENTRYPOINT
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
# Build
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# Run
FROM alpine:latest
COPY --from=builder /app/main /main
CMD ["/main"]
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.env.*
dist
coverage
*.log
.DS_Store
FROM nginx:latest
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
docker inspect --format='{{.State.Health.Status}}' container_name
# Login
docker login
# Pull
docker pull nginx:latest
# Tag
docker tag myapp:latest myregistry.com/myapp:v1
# Push
docker push myregistry.com/myapp:v1
# Logout
docker logout
# Jalankan registry sendiri
docker run -d -p 5000:5000 --name registry registry:2
# Push ke private registry
docker tag myapp:latest localhost:5000/myapp:latest
docker push localhost:5000/myapp:latest
# Pull dari private registry
docker pull localhost:5000/myapp:latest
docker scout cves myimage:latest
docker scout recommendations myimage:latest
Apa fungsi Dockerfile?
Apa beda CMD dan ENTRYPOINT di Dockerfile?
Apa itu volume dalam Docker?