Bỏ qua để đến nội dung

Docker cơ bản

Khái niệm Là gì
Image Bản đóng gói bất biến: mã nguồn, thư viện, môi trường chạy. Gồm nhiều lớp (layer) xếp chồng.
Container Một tiến trình chạy từ image, có thêm lớp ghi tạm ở trên cùng.
Volume Vùng lưu trữ do Docker quản lý, sống lâu hơn container.
Network Mạng ảo để các container gọi nhau bằng tên dịch vụ.
Registry Kho chứa image: Docker Hub, GHCR, Amazon ECR.

Container không phải máy ảo: dùng chung nhân (kernel) của máy chủ, chỉ cô lập tiến trình và hệ thống file. Vì vậy khởi động tính bằng mili giây chứ không phải chục giây.

Terminal window
docker build -t myapp:1.0 . # build image từ Dockerfile trong thư mục hiện tại
docker run -d -p 8080:80 myapp:1.0 # chạy nền, ánh xạ cổng 8080 máy chủ -> 80 container
docker ps -a # liệt kê container, kể cả đã dừng
docker logs -f <container> # xem log theo thời gian thực
docker exec -it <container> sh # mở shell bên trong container đang chạy
docker stop <container> # dừng (gửi SIGTERM, chờ 10s rồi SIGKILL)
docker rm <container> # xoá container đã dừng
docker images # liệt kê image
docker rmi <image> # xoá image

Với nhiều dịch vụ, dùng Compose:

Terminal window
docker compose up -d # khởi động toàn bộ stack ở chế độ nền
docker compose logs -f api # log của riêng dịch vụ api
docker compose down -v # dừng và xoá luôn volume
Dockerfile
# Giai đoạn build
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
# Giai đoạn chạy — chỉ mang theo kết quả build
FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]

Bốn điều đáng nhớ:

  1. Copy file phụ thuộc trước mã nguồn. Docker cache theo lớp; đổi một dòng mã mà phải cài lại toàn bộ thư viện là do sai thứ tự này.
  2. Build nhiều giai đoạn (multi-stage). Trình biên dịch và công cụ build không cần có mặt trong image chạy thật.
  3. Không chạy bằng root. Khai báo USER cho tiến trình ứng dụng.
  4. .dockerignore. Tối thiểu là node_modules, .git, dist — vừa nhanh vừa tránh lộ file không mong muốn.

Đừng đưa bí mật vào Dockerfile bằng ENV hay ARG: giá trị nằm lại trong lịch sử lớp của image và ai kéo được image thì đọc được. Truyền lúc chạy bằng biến môi trường, file .env không commit, hoặc dịch vụ quản lý bí mật (AWS Secrets Manager, Vault).

Terminal window
docker system df # xem dung lượng đang chiếm
docker system prune # xoá container dừng, mạng thừa, cache build
docker system prune -a --volumes # xoá thêm image không dùng và volume