Docker Container Basics
Docker là một platform cho phép bạn build, ship và run applications trong containers. Tài liệu này sẽ hướng dẫn bạn từ cơ bản đến nâng cao.
Tổng quan về Containers
Containers chia sẻ kernel của host OS, trong khi VMs chạy full OS riêng. Điều này làm containers nhẹ hơn và khởi động nhanh hơn nhiều.
So sánh Container và VM
| Đặc điểm | Container | Virtual Machine |
|---|---|---|
| Khởi động | Milliseconds | Minutes |
| Dung lượng | MBs | GBs |
| Performance | Near-native | Overhead |
| Isolation | Process-level | Hardware-level |
| Portability | Cao | Trung bình |
Cài đặt Docker
macOS
# Sử dụng Homebrew
brew install --cask docker
# Hoặc download Docker Desktop từ website chính thức
open https://www.docker.com/products/docker-desktop
Ubuntu/Debian
# Update package index
sudo apt-get update
# Cài đặt dependencies
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
# Thêm Docker's official GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Cài đặt Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io
Không chạy Docker daemon với quyền root trong production. Sử dụng rootless mode khi có thể.
Docker Commands cơ bản
Quản lý Images
# Pull image từ Docker Hub
docker pull nginx:latest
# Liệt kê images local
docker images
# Xóa image
docker rmi nginx:latest
# Build image từ Dockerfile
docker build -t myapp:1.0 .
Quản lý Containers
# Chạy container
docker run -d --name my-nginx -p 8080:80 nginx
# Liệt kê containers đang chạy
docker ps
# Liệt kê tất cả containers
docker ps -a
# Dừng container
docker stop my-nginx
# Xóa container
docker rm my-nginx
Dockerfile Best Practices
Dưới đây là ví dụ về một Dockerfile được tối ưu hóa cho Node.js application:
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
# Copy package files first (leverage cache)
COPY package*.json ./
# Install dependencies
RUN npm ci --only=production
# Copy source code
COPY . .
# Build application
RUN npm run build
# Stage 2: Production
FROM node:20-alpine AS production
WORKDIR /app
# Create non-root user
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
# Copy built assets from builder
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
# Switch to non-root user
USER nextjs
# Expose port
EXPOSE 3000
# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
# Start application
CMD ["npm", "start"]
Sử dụng multi-stage builds để giảm kích thước image cuối cùng. Stage đầu tiên chứa build tools, stage cuối chỉ chứa runtime.
Docker Compose
Docker Compose cho phép định nghĩa và chạy multi-container applications.
version: "3.8"
services:
# Web application
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
db:
condition: service_healthy
networks:
- app-network
restart: unless-stopped
# PostgreSQL database
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
# Redis cache
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- app-network
volumes:
postgres_data:
redis_data:
networks:
app-network:
driver: bridge
Các lệnh Docker Compose
# Khởi động tất cả services
docker-compose up -d
# Xem logs
docker-compose logs -f app
# Dừng và xóa containers
docker-compose down
# Rebuild images
docker-compose up -d --build
# Scale service
docker-compose up -d --scale app=3
Networking trong Docker
Network Types
- bridge: Network mặc định, containers có thể giao tiếp với nhau
- host: Container sử dụng network của host
- none: Không có networking
- overlay: Cho Docker Swarm, multi-host networking
# Tạo custom network
docker network create --driver bridge my-network
# Chạy container với network
docker run -d --network my-network --name app1 nginx
# Inspect network
docker network inspect my-network
Trong Docker network, containers có thể resolve nhau bằng container name. Ví dụ: http://app1:80
Volume Management
Các loại Volume
# Named volume (recommended)
docker run -v mydata:/app/data nginx
# Bind mount
docker run -v $(pwd)/config:/app/config nginx
# tmpfs mount (in-memory)
docker run --tmpfs /app/temp nginx
Backup và Restore Volume
# Backup volume
docker run --rm \
-v mydata:/source:ro \
-v $(pwd):/backup \
alpine tar cvf /backup/mydata.tar /source
# Restore volume
docker run --rm \
-v mydata:/target \
-v $(pwd):/backup \
alpine tar xvf /backup/mydata.tar -C /target --strip 1
Security Best Practices
Luôn scan images trước khi deploy lên production!
Checklist bảo mật
- Sử dụng official base images
- Chạy containers với non-root user
- Không lưu secrets trong images
- Scan vulnerabilities với
docker scouthoặctrivy - Giới hạn resources với
--memoryvà--cpus - Sử dụng read-only filesystem khi có thể
# Chạy container với security options
docker run -d \
--name secure-app \
--user 1000:1000 \
--read-only \
--tmpfs /tmp \
--memory 512m \
--cpus 0.5 \
--security-opt no-new-privileges:true \
myapp:latest
Monitoring và Logging
Xem resource usage
# Real-time stats
docker stats
# Formatted output
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Cấu hình logging
# Xem logs
docker logs -f --tail 100 my-container
# Logging drivers
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
Tổng kết
| Concept | Command | Mô tả |
|---|---|---|
| Images | docker build, docker pull | Template để tạo containers |
| Containers | docker run, docker stop | Running instances của images |
| Volumes | docker volume | Persistent data storage |
| Networks | docker network | Container communication |
| Compose | docker-compose | Multi-container orchestration |
Tài liệu tham khảo
"Containers are the future of software deployment" - Solomon Hykes, Docker Founder