Tuần 1 - Ngày 1: Tại Sao Docker?
Mục tiêu học tập
- Hiểu vấn đề mà Docker giải quyết ("works on my machine" problem)
- Phân biệt container vs virtual machine (VM)
- Nắm lịch sử Docker và vị trí trong hệ sinh thái cloud
- Hiểu vai trò của Docker trong AWS (ECS, EKS, Fargate) và khi nào nên dùng container vs serverless
1. Vấn đề trước khi có Docker
"It works on my machine"
Trước Docker, đội phát triển thường gặp vấn đề:
Hậu quả: app chạy ngon trên laptop nhưng crash trên server vì dependency mismatch.
Giải pháp truyền thống: Virtual Machines
VM giải quyết được isolation nhưng có chi phí cao: mỗi VM cần OS riêng (~GB), boot time chậm (~phút), tốn RAM/CPU overhead.
2. Container là gì?
Kiến trúc container
Container dùng chung kernel của host OS (thông qua Linux namespaces + cgroups), chỉ đóng gói app + dependencies. Kết quả:
- Khởi động trong milliseconds (không boot OS)
- Footprint nhỏ (~MB thay vì ~GB)
- Density cao hơn: một server chạy được 100 container thay vì 10 VM
So sánh Container vs VM
| Tiêu chí | Container | Virtual Machine |
|---|---|---|
| Boot time | Milliseconds | Phút |
| Image size | MB | GB |
| OS | Dùng chung kernel host | OS riêng biệt |
| Isolation | Process-level (namespace) | Hardware-level (hypervisor) |
| Overhead | Rất thấp | Cao |
| Portability | Cao (image bao gồm deps) | Trung bình |
| Security boundary | Yếu hơn VM | Mạnh hơn container |
| Use case | Microservices, CI/CD | Legacy apps, strong isolation |
Khi nào vẫn dùng VM? Khi cần kernel khác với host (Windows app trên Linux host), workload cần security isolation cứng (financial, multi-tenant), hoặc stateful legacy app không containerizable.
3. Lịch sử Docker
- 2008: LXC (Linux Containers) — container xuất hiện nhưng khó dùng
- 2013: Docker, Inc. ra mắt Docker Engine — wrapper thân thiện trên LXC, sau chuyển sang runc
- 2014: Docker Hub ra mắt — public registry cho images
- 2015: Docker Compose, Docker Swarm ra mắt
- 2016: OCI (Open Container Initiative) — chuẩn hoá container runtime/image format
- 2017-2020: Kubernetes bá đạo, thay Docker Swarm làm orchestration chuẩn
- 2021: Kubernetes bỏ
dockershim, dùng containerd/CRI-O trực tiếp - 2022: Docker Desktop đổi pricing — free cho personal/small team (<250 nhân viên, <$10M doanh thu), có phí cho enterprise
- 2023-2024: BuildKit mặc định trong Docker Engine, multi-arch build với
docker buildxtrở thành standard
Docker Desktop vs Docker Engine
| Thành phần | Docker Desktop | Docker Engine |
|---|---|---|
| Platform | Mac, Windows | Linux |
| GUI | Có | Không |
| License | Free/có phí | Apache 2.0 miễn phí |
| VM layer | Có (Linux VM trong Mac/Win) | Không cần |
| Dùng cho | Dev laptop | Server/CI |
4. Docker trong hệ sinh thái AWS
Các dịch vụ AWS liên quan đến container
| Service | Mô tả | Khi nào dùng |
|---|---|---|
| Amazon ECR | Private/public Docker registry | Lưu trữ image của bạn trước khi deploy |
| Amazon ECS | AWS-native container orchestration | Đội nhỏ, không muốn học Kubernetes |
| Amazon EKS | Managed Kubernetes | Cần Kubernetes ecosystem, large scale |
| AWS Fargate | Serverless compute cho ECS/EKS | Không muốn quản lý EC2, variable load |
Container vs Serverless (Lambda) trade-off
| Tiêu chí | Container (Fargate/ECS) | Lambda |
|---|---|---|
| Cold start | ~1-10 giây | ~100ms-1s (tuỳ language) |
| Max runtime | Không giới hạn | 15 phút |
| Memory | 0.5 GB - 120 GB | 128 MB - 10 GB |
| Custom runtime | Bất kỳ OS/language | Có (custom runtime layer) |
| Persistent state | Volume, EFS mount | Không (stateless) |
| Cost model | Theo vCPU/GB-giờ | Theo số invocations + GB-s |
| Best for | Long-running, stateful, web server | Event-driven, short bursts, scheduled |
Exam keyword awareness: "least operational overhead" + web app long-running → Fargate. "Event-driven, occasional spikes" → Lambda.
5. Docker Architecture
Các khái niệm cốt lõi
- Image: Template read-only, gồm nhiều layers, được build từ Dockerfile
- Container: Instance đang chạy của image (image + writable layer)
- Registry: Nơi lưu trữ và phân phối images (Docker Hub, ECR, GHCR)
- Dockerfile: File mô tả cách build image
- Layer: Mỗi instruction trong Dockerfile tạo ra một layer; layer được cache và tái sử dụng
Câu hỏi ôn tập
-
Container khác VM ở điểm cơ bản nhất là gì liên quan đến OS kernel?
<details> <summary>Xem đáp án</summary>Container dùng chung kernel của host OS thông qua Linux namespaces và cgroups — không có kernel riêng. VM có hypervisor tạo virtualized hardware riêng, mỗi VM chạy OS đầy đủ với kernel riêng.
Hệ quả: container nhẹ hơn (~MB so với ~GB), khởi động nhanh hơn (ms so với phút), nhưng isolation yếu hơn VM vì dùng chung kernel host.
</details> -
Tại sao container khởi động nhanh hơn VM đáng kể?
<details> <summary>Xem đáp án</summary>VM phải boot một OS đầy đủ (kernel load, init system, services), mất từ vài chục giây đến vài phút. Container chỉ cần khởi tạo một process mới trong namespace đã có — không cần boot OS — nên khởi động trong milliseconds.
</details> -
Khi nào nên chọn Fargate thay vì Lambda cho một web API?
<details> <summary>Xem đáp án</summary>Chọn Fargate khi: (1) request xử lý lâu hơn 15 phút, (2) cần persistent connection (WebSocket, gRPC), (3) app cần nhiều hơn 10 GB memory, (4) cần custom runtime hoặc OS-level dependency, (5) workload steady-state (Lambda cold start ảnh hưởng UX).
Chọn Lambda khi: event-driven, short burst, không cần server chạy liên tục — để giảm chi phí và operational overhead.
</details> -
ECR, ECS và Fargate phối hợp với nhau như thế nào trong một deployment?
<details> <summary>Xem đáp án</summary>ECR là private registry lưu Docker image sau khi bạn
docker push. ECS là orchestration layer: bạn định nghĩa Task Definition tham chiếu image URI trên ECR, sau đó tạo ECS Service với desired count. Fargate là compute layer — ECS chỉ định Fargate pull image từ ECR về và chạy container mà không cần bạn quản lý EC2 instance.Flow:
</details>docker push → ECR→ECS Task Definition (image=ECR URI)→ECS Service → Fargate pulls & runs. -
Docker Desktop miễn phí trong trường hợp nào theo pricing 2024?
<details> <summary>Xem đáp án</summary>Docker Desktop miễn phí cho: cá nhân (personal use), giáo dục, nghiên cứu phi thương mại, và doanh nghiệp có dưới 250 nhân viên VÀ dưới $10 triệu USD doanh thu hàng năm. Nếu công ty vượt một trong hai ngưỡng này thì cần trả phí subscription.
Docker Engine (CLI trên Linux, không có GUI) luôn miễn phí theo Apache 2.0.
</details>
Bài tập thực hành
# Kiểm tra Docker đã cài chưa
docker --version
docker info
# Pull và chạy container đầu tiên
docker run hello-world
# Chạy Ubuntu container tương tác
docker run -it ubuntu:22.04 bash
# Bên trong container:
cat /etc/os-release
ps aux # chỉ thấy process trong container
exit
# So sánh: container đã biến mất
docker ps # không còn container nào running
docker ps -a # nhưng vẫn tồn tại ở trạng thái exited
Tài liệu tham khảo chính thức
Tiếp theo: Ngày 2 — Cài đặt Docker và các lệnh cơ bản