Skip to main content

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 vs Virtual Machines

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ểmContainerVirtual Machine
Khởi độngMillisecondsMinutes
Dung lượngMBsGBs
PerformanceNear-nativeOverhead
IsolationProcess-levelHardware-level
PortabilityCaoTrung 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
Lưu ý bảo mật

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:

Dockerfile
# 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"]
Multi-stage builds

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.

docker-compose.yml
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

  1. bridge: Network mặc định, containers có thể giao tiếp với nhau
  2. host: Container sử dụng network của host
  3. none: Không có networking
  4. 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
DNS Resolution

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

Bảo mật quan trọng

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 scout hoặc trivy
  • Giới hạn resources với --memory--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

ConceptCommandMô tả
Imagesdocker build, docker pullTemplate để tạo containers
Containersdocker run, docker stopRunning instances của images
Volumesdocker volumePersistent data storage
Networksdocker networkContainer communication
Composedocker-composeMulti-container orchestration

Tài liệu tham khảo

"Containers are the future of software deployment" - Solomon Hykes, Docker Founder