Docker đã thay đổi cách chúng ta phát triển và triển khai phần mềm. “Chạy được trên máy tôi” không còn là câu nói cửa miệng nữa — nếu nó chạy trong container, nó chạy ở mọi nơi.
Docker Là Gì?#
Docker là nền tảng container hóa. Khác với VM (máy ảo), container dùng chung kernel host, không cần guest OS riêng:
| VM | Container | |
|---|---|---|
| Kích thước | GB | MB |
| Khởi động | Phút | Giây |
| Tài nguyên | Nhiều | Nhẹ |
| Cô lập | Kernel riêng (mạnh) | Chia sẻ kernel (đủ) |
Dockerfile — Công Thức Tạo Container#
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "dist/index.js"]dockerfileMulti-stage Build — Tối Ưu Kích Thước#
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]dockerfileContainer cuối chỉ chứa đúng những gì cần chạy — thường nhỏ hơn 5 lần so với không dùng multi-stage.
Docker Compose — Môi Trường Dev Hoàn Chỉnh#
services:
app:
build: .
ports:
- '3000:3000'
volumes:
- .:/app
- /app/node_modules
environment:
- DATABASE_URL=postgres://user:pass@db:5432/myapp
depends_on:
- db
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=pass
volumes:
pgdata:yamlChạy cả stack với một lệnh:
docker compose up -d
docker compose logs -f
docker compose downbashDocker CLI — Lệnh Cần Nhớ#
# Quản lý container
docker ps # Container đang chạy
docker ps -a # Tất cả container
docker logs -f <container> # Live log
docker exec -it <container> sh # Vào shell trong container
docker stop <container> # Dừng
docker rm <container> # Xóa
# Images
docker images # Danh sách image
docker rmi <image> # Xóa image
docker pull node:20-alpine # Kéo image từ registry
docker build -t myapp . # Build image
# Dọn dẹp
docker system prune -a # Xóa container, image, cache không dùngbashDocker Cho CI/CD#
# .github/workflows/deploy.yml
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t myapp:${{ github.sha }} .
- run: docker push registry.example.com/myapp:${{ github.sha }}yamlDocker Compose Cho Production#
Dùng Docker Compose cũng được, nhưng production nên dùng orchestration:
| Công cụ | Khi nào dùng |
|---|---|
| Docker Compose | 1 server, stack đơn giản |
| Docker Swarm | Nhiều server, tích hợp sẵn |
| Kubernetes | Scale lớn, yêu cầu phức tạp |
Mẹo Hay#
.dockerignore#
node_modules
.git
.env
*.md
disttextGiảm Số Layer#
# Tệ — mỗi RUN tạo một layer
RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*
# Tốt — gộp lại
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*dockerfileKhông Chạy Container Bằng Root#
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuserdockerfileKết Luận#
Docker không còn là “option” — nó là tiêu chuẩn. Dù bạn làm fullstack, backend, hay DevOps, biết Docker giúp bạn:
- Chuẩn hóa môi trường dev
- Deploy nhất quán
- Scale dễ dàng
- Hợp tác với team dễ hơn
Hãy bắt đầu: docker init (Docker mới có lệnh này) hoặc tự viết Dockerfile đầu tiên cho project hiện tại của bạn.