</>Học Dev
Bài học

Tuần 1 - Ngày 1: Tại Sao Docker?

Tuần 1 – Ngày 1

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 đề:

DevlaptopStagingserverProductionPython3.9Python3.7Python3.11libpq12libpq10libpq14OpenSSL1.1OpenSSL1.0OpenSSL3.0Ubuntu22.04CentOS7AmazonLinux2

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

VMHost(baremetal)VM1VM2AppAppOSOS(4GB)(4GB)Hypervisor(VMware/KVM)HostOS(Linux/Windows)

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

ContainerHostAppAAppB+libsA+libsB(~50MB)(~80MB)ContainerRuntime(Docker)HostOSKernel(shared)

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íContainerVirtual Machine
Boot timeMillisecondsPhút
Image sizeMBGB
OSDùng chung kernel hostOS riêng biệt
IsolationProcess-level (namespace)Hardware-level (hypervisor)
OverheadRất thấpCao
PortabilityCao (image bao gồm deps)Trung bình
Security boundaryYếu hơn VMMạnh hơn container
Use caseMicroservices, CI/CDLegacy 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 buildx trở thành standard

Docker Desktop vs Docker Engine

Thành phầnDocker DesktopDocker Engine
PlatformMac, WindowsLinux
GUIKhông
LicenseFree/có phíApache 2.0 miễn phí
VM layerCó (Linux VM trong Mac/Win)Không cần
Dùng choDev laptopServer/CI

4. Docker trong hệ sinh thái AWS

Các dịch vụ AWS liên quan đến container

AWSContainerServicesRegistryOrchestrationComputeECRECSEC2instances(Elastic(bnqunlýOS)AmazonContainerSvc)ECREKSFargate(Elastic(serverlessKubernetes)computekhôngqunlýEC2)
ServiceMô tảKhi nào dùng
Amazon ECRPrivate/public Docker registryLưu trữ image của bạn trước khi deploy
Amazon ECSAWS-native container orchestrationĐội nhỏ, không muốn học Kubernetes
Amazon EKSManaged KubernetesCần Kubernetes ecosystem, large scale
AWS FargateServerless compute cho ECS/EKSKhô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 runtimeKhông giới hạn15 phút
Memory0.5 GB - 120 GB128 MB - 10 GB
Custom runtimeBất kỳ OS/languageCó (custom runtime layer)
Persistent stateVolume, EFS mountKhông (stateless)
Cost modelTheo vCPU/GB-giờTheo số invocations + GB-s
Best forLong-running, stateful, web serverEvent-driven, short bursts, scheduled

Exam keyword awareness: "least operational overhead" + web app long-running → Fargate. "Event-driven, occasional spikes" → Lambda.


5. Docker Architecture

DockerHostDockerCLIDockerDaemon(dockerd)dockerbuilddockerruncontainerddockerpush(containermgmt)runc(OCIruntime)DockerHub/ECR/GHCR(registries)

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

  1. 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>
  2. 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>
  3. 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>
  4. 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: docker push → ECRECS Task Definition (image=ECR URI)ECS Service → Fargate pulls & runs.

    </details>
  5. 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