1. Docker là gì?
Docker là một nền tảng mã nguồn mở cho phép bạn đóng gói, phân phối và chạy ứng dụng trong các containers - môi trường cô lập, nhẹ và di động. Được phát triển bởi Solomon Hykes và ra mắt năm 2013, Docker đã cách mạng hóa cách chúng ta phát triển, kiểm thử và triển khai phần mềm.
Docker giải quyết vấn đề kinh điển "Works on my machine" bằng cách đảm bảo ứng dụng chạy nhất quán trên mọi môi trường - từ laptop developer đến production server.
Lịch sử phát triển Container Technology
1979 - chroot: Unix chroot system call - cô lập filesystem đầu tiên
2000 - FreeBSD Jails: Cô lập tiến trình và network
2006 - cgroups: Google phát triển control groups cho Linux kernel
2008 - LXC: Linux Containers - container technology đầu tiên trên Linux
2013 - Docker: Ra mắt, làm container trở nên dễ sử dụng
2015 - OCI: Open Container Initiative chuẩn hóa container format
2017 - containerd: Docker tách runtime thành dự án riêng dưới CNCF
2. Container vs Virtual Machine
Để hiểu Docker, cần phân biệt rõ container và virtual machine (VM):
| Tiêu chí | Container | Virtual Machine |
|---|---|---|
| Kiến trúc | Chia sẻ kernel của host OS | Mỗi VM có OS riêng (guest OS) |
| Khởi động | Mili-giây đến vài giây | Vài phút |
| Kích thước | MB (thường 5-500MB) | GB (thường 1-40GB) |
| RAM sử dụng | Chỉ cần RAM cho app | Cần RAM cho cả guest OS |
| Isolation | Process-level (nhẹ hơn) | Hardware-level (mạnh hơn) |
| Density | Hàng trăm containers/host | Thường 10-20 VMs/host |
| Portability | Rất cao - chạy mọi nơi có Docker | Phụ thuộc hypervisor |
┌─────────────────────────────────────┐ ┌─────────────────────────────────────┐
│ Virtual Machines │ │ Containers │
│ │ │ │
│ ┌───────┐ ┌───────┐ ┌───────┐ │ │ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ App A │ │ App B │ │ App C │ │ │ │ App A │ │ App B │ │ App C │ │
│ ├───────┤ ├───────┤ ├───────┤ │ │ ├───────┤ ├───────┤ ├───────┤ │
│ │ Bins/ │ │ Bins/ │ │ Bins/ │ │ │ │ Bins/ │ │ Bins/ │ │ Bins/ │ │
│ │ Libs │ │ Libs │ │ Libs │ │ │ │ Libs │ │ Libs │ │ Libs │ │
│ ├───────┤ ├───────┤ ├───────┤ │ │ └───────┘ └───────┘ └───────┘ │
│ │Guest │ │Guest │ │Guest │ │ │ ┌─────────────────────────────┐ │
│ │ OS │ │ OS │ │ OS │ │ │ │ Docker Engine │ │
│ └───────┘ └───────┘ └───────┘ │ │ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │ │ ┌─────────────────────────────┐ │
│ │ Hypervisor │ │ │ │ Host OS │ │
│ └─────────────────────────────┘ │ │ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │ │ ┌─────────────────────────────┐ │
│ │ Host OS │ │ │ │ Physical Hardware │ │
│ └─────────────────────────────┘ │ │ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │ └─────────────────────────────────────┘
│ │ Physical Hardware │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
3. Kiến trúc Docker Engine
Docker Engine bao gồm nhiều thành phần hoạt động cùng nhau:
Docker Daemon (dockerd)
Là background service chạy trên host machine, chịu trách nhiệm quản lý Docker objects (images, containers, networks, volumes). Daemon lắng nghe Docker API requests và xử lý chúng.
Docker CLI
Command-line interface cho phép người dùng tương tác với Docker Daemon thông qua REST API. Mỗi lệnh docker bạn gõ sẽ được gửi đến daemon để xử lý.
containerd
Container runtime cấp cao, quản lý vòng đời container (pull images, tạo containers, quản lý storage và networking). Là một dự án của CNCF, có thể sử dụng độc lập không cần Docker.
runc
Container runtime cấp thấp, tuân thủ OCI runtime specification. Chịu trách nhiệm tạo và chạy containers bằng cách sử dụng Linux kernel features (namespaces, cgroups, seccomp).
Docker Architecture:
┌──────────────────────────────────────────┐
│ Docker CLI │
│ (docker build, run, ...) │
└──────────────┬───────────────────────────┘
│ REST API
┌──────────────▼───────────────────────────┐
│ Docker Daemon (dockerd) │
│ ┌─────────────────────────────────────┐ │
│ │ Images │ Networks │ Volumes │ ... │ │
│ └─────────────────────────────────────┘ │
└──────────────┬───────────────────────────┘
│ gRPC
┌──────────────▼───────────────────────────┐
│ containerd │
│ (Container lifecycle management) │
└──────────────┬───────────────────────────┘
│
┌──────────────▼───────────────────────────┐
│ runc │
│ (OCI runtime - creates containers) │
└──────────────┬───────────────────────────┘
│
┌──────────────▼───────────────────────────┐
│ Linux Kernel │
│ (namespaces, cgroups, seccomp) │
└──────────────────────────────────────────┘
4. OCI (Open Container Initiative)
OCI là tổ chức thiết lập các tiêu chuẩn mở cho container technology:
Runtime Specification: Định nghĩa cách chạy container (runc implement spec này)
Image Specification: Định nghĩa format và cấu trúc container image
Distribution Specification: Định nghĩa cách push/pull images từ registries
Nhờ OCI, container images có thể chạy trên nhiều runtimes khác nhau (runc, crun, kata containers, gVisor) mà không cần thay đổi.
5. Docker Desktop vs Docker Engine
| Tiêu chí | Docker Desktop | Docker Engine |
|---|---|---|
| Platform | macOS, Windows, Linux | Linux only |
| GUI | Có (Dashboard) | Không (CLI only) |
| VM | Chạy Linux VM bên trong | Native trên Linux |
| Kubernetes | Tích hợp sẵn | Cần cài riêng |
| License | Miễn phí cho cá nhân/small business | Hoàn toàn miễn phí (Apache 2.0) |
| Use case | Development trên macOS/Windows | Production servers |
6. Use cases thực tế của Docker
Development Environment: Tạo môi trường phát triển nhất quán cho cả team
Microservices: Đóng gói mỗi service thành container độc lập
CI/CD: Build, test, deploy tự động trong container
Cloud Migration: Di chuyển ứng dụng giữa các cloud providers dễ dàng
Legacy App Modernization: Container hóa ứng dụng cũ để dễ quản lý
Edge Computing: Deploy ứng dụng nhẹ trên IoT/Edge devices
7. Tổng kết
Trong bài này, bạn đã nắm được:
Docker là gì và tại sao nó quan trọng
Sự khác biệt giữa container và virtual machine
Kiến trúc Docker Engine với các thành phần: daemon, CLI, containerd, runc
OCI standards và vai trò của chúng
Docker Desktop vs Docker Engine
Ở bài tiếp theo, chúng ta sẽ cài đặt Docker và bắt đầu thực hành với các lệnh cơ bản.