Chuyển đến nội dung chính

Bài 1: Giới thiệu Docker - Container và Virtualization

Tìm hiểu Docker là gì, so sánh container vs virtual machine, kiến trúc Docker Engine (daemon, CLI, containerd, runc), lịch sử phát triển container technology và tại sao Docker thay đổi cách chúng ta phát triển phần mềm.

🔒 DevSecOps — Bài 1 Bài 1: Giới thiệu Docker - Container và Virtualization

Docker từ Cơ bản đến Nâng cao

Phần 1: Nền tảng Docker

xdev.asia

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.