Docker cơ bản
Khái niệm
Phần tiêu đề “Khái niệm”| 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.
Lệnh hay dùng
Phần tiêu đề “Lệnh hay dùng”docker build -t myapp:1.0 . # build image từ Dockerfile trong thư mục hiện tạidocker run -d -p 8080:80 myapp:1.0 # chạy nền, ánh xạ cổng 8080 máy chủ -> 80 containerdocker ps -a # liệt kê container, kể cả đã dừngdocker logs -f <container> # xem log theo thời gian thựcdocker exec -it <container> sh # mở shell bên trong container đang chạydocker stop <container> # dừng (gửi SIGTERM, chờ 10s rồi SIGKILL)docker rm <container> # xoá container đã dừngdocker images # liệt kê imagedocker rmi <image> # xoá imageVới nhiều dịch vụ, dùng Compose:
docker compose up -d # khởi động toàn bộ stack ở chế độ nềndocker compose logs -f api # log của riêng dịch vụ apidocker compose down -v # dừng và xoá luôn volumeDockerfile gọn nhẹ
Phần tiêu đề “Dockerfile gọn nhẹ”# Giai đoạn buildFROM node:22-alpine AS buildWORKDIR /appCOPY package.json pnpm-lock.yaml ./RUN corepack enable && pnpm install --frozen-lockfileCOPY . .RUN pnpm build
# Giai đoạn chạy — chỉ mang theo kết quả buildFROM node:22-alpineWORKDIR /appENV NODE_ENV=productionCOPY --from=build /app/dist ./distCOPY --from=build /app/node_modules ./node_modulesUSER nodeEXPOSE 3000CMD ["node", "dist/server.js"]Bốn điều đáng nhớ:
- 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.
- 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.
- Không chạy bằng root. Khai báo
USERcho tiến trình ứng dụng. - Có
.dockerignore. Tối thiểu lànode_modules,.git,dist— vừa nhanh vừa tránh lộ file không mong muốn.
Bí mật và cấu hình
Phần tiêu đề “Bí mật và cấu hình”Đừ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).
Dọn ổ đĩa
Phần tiêu đề “Dọn ổ đĩa”docker system df # xem dung lượng đang chiếmdocker system prune # xoá container dừng, mạng thừa, cache builddocker system prune -a --volumes # xoá thêm image không dùng và volume