Docker Là Gì và Vì Sao Nên Dùng

K
Kai··5 min read

Trong series này chúng ta học Docker từ đầu, đi dần tới Docker Swarm để chạy container trên nhiều máy. Trước khi cài đặt, bài này giải thích Docker là gì và nó giải quyết vấn đề gì.

Vấn đề Docker giải quyết

Một ứng dụng khi chạy cần nhiều thứ đi kèm: phiên bản ngôn ngữ (Node, Python, Java...), các thư viện, biến môi trường, cấu hình hệ điều hành. Khi chuyển ứng dụng từ máy này sang máy khác, những thứ đi kèm đó thường khác nhau, và ứng dụng chạy được ở máy này nhưng lỗi ở máy kia.

Tình huống quen thuộc: code chạy tốt trên máy lập trình viên, đưa lên server thì lỗi vì server cài phiên bản thư viện khác. Câu "máy tôi chạy bình thường mà" xuất phát từ đây.

Docker giải quyết bằng cách đóng gói ứng dụng cùng toàn bộ thứ nó cần vào một đơn vị duy nhất gọi là container. Container chứa sẵn code, runtime, thư viện, cấu hình — nên nó chạy ở máy bạn thế nào thì chạy trên server cũng vậy. Môi trường đi theo ứng dụng, không phụ thuộc vào máy chủ.

Container khác máy ảo (VM) thế nào

Trước Docker, để có môi trường tách biệt người ta dùng máy ảo (virtual machine). Cả hai đều cô lập ứng dụng, nhưng cách làm khác nhau:

  • Máy ảo giả lập cả một máy tính: mỗi VM chạy một hệ điều hành riêng đầy đủ trên một lớp ảo hóa (hypervisor). Vì vậy VM nặng (vài GB), khởi động chậm (tính bằng phút).
  • Container dùng chung nhân (kernel) hệ điều hành của máy chủ, chỉ đóng gói phần ứng dụng và thư viện của nó. Nhờ vậy container nhẹ (tính bằng MB), khởi động nhanh (tính bằng giây), và một máy chạy được nhiều container hơn nhiều so với VM.

Nói ngắn gọn: VM ảo hóa phần cứng, container ảo hóa hệ điều hành. Với việc đóng gói và chạy ứng dụng, container đủ cô lập mà lại nhẹ hơn nhiều.

Các khái niệm cốt lõi

Bốn khái niệm bạn sẽ gặp liên tục:

  • Image: bản đóng gói chỉ-đọc chứa ứng dụng và mọi thứ nó cần để chạy. Hình dung image như một "khuôn" hoặc bản thiết kế.
  • Container: một bản đang chạy của image. Từ một image có thể tạo ra nhiều container giống nhau. Image là khuôn, container là sản phẩm đúc ra từ khuôn đó.
  • Registry: kho chứa image để tải lên và tải về. Phổ biến nhất là Docker Hub. Bạn pull (kéo) image về từ registry, hoặc push (đẩy) image của mình lên.
  • Dockerfile: một file văn bản mô tả cách dựng image — cài gì, copy gì, chạy lệnh nào. Bạn viết Dockerfile rồi build ra image.

Vòng đời cơ bản: viết Dockerfilebuild ra imagerun image thành container → có thể push image lên registry để máy khác dùng.

Vì sao học tới Docker Swarm

Chạy vài container trên một máy là đủ cho lúc học và cho ứng dụng nhỏ. Nhưng khi hệ thống lớn lên, bạn cần chạy nhiều bản của một ứng dụng trên nhiều máy, tự động phân tải, và tự khởi động lại khi một bản chết. Việc điều phối container trên nhiều máy gọi là orchestration.

Docker Swarm là công cụ orchestration tích hợp sẵn trong Docker. Nó gom nhiều máy thành một cụm (cluster), rồi cho phép bạn khai báo "chạy 5 bản của ứng dụng này" và Swarm lo phần phân bổ, theo dõi, thay thế bản chết. Swarm đơn giản hơn Kubernetes và là bước đệm tốt để hiểu orchestration trước khi học những hệ phức tạp hơn.

Series đi từ một container trên máy bạn, tới một cụm Swarm nhiều máy chạy dịch vụ có khả năng mở rộng.

Lộ trình của series

Hai bài đầu (sau bài này) đi sâu vào cách Docker hoạt động bên trong, để phần thực hành về sau bạn hiểu rõ mình đang làm gì chứ không học vẹt:

  1. Kiến trúc Docker — client, daemon, containerd và runc; chuyện gì xảy ra khi docker run.
  2. Container chạy bằng gì — namespaces, cgroups và union filesystem.

Phần thực hành nền tảng:

  1. Cài đặt Docker và chạy container đầu tiên — chạy, xem, dừng, xóa container.
  2. Image và cơ chế layer — pull, tag, quản lý image, Docker Hub.
  3. Viết Dockerfile và build cache — đóng gói ứng dụng của bạn thành image.
  4. Volumes và bind mount — lưu dữ liệu bền vững, không mất khi container bị xóa.
  5. Mạng trong Docker — bridge, veth, port mapping, cho các container nói chuyện với nhau.
  6. Docker Compose — chạy ứng dụng nhiều container bằng một file cấu hình.
  7. Tối ưu image — multi-stage build, image nhỏ và an toàn.

Phần Docker Swarm — điều phối container trên nhiều máy:

  1. Swarm: kiến trúc cluster và Raft — gom nhiều node thành một cụm.
  2. Swarm: service, scale và rolling update — chạy nhiều bản, cập nhật không gián đoạn.
  3. Swarm: overlay network và routing mesh — mạng xuyên nhiều node, phân tải.
  4. Swarm: stack và secrets — deploy cả ứng dụng nhiều dịch vụ lên cụm.

Cách học: đọc tới đâu mở terminal làm tới đó. Bạn không cần biết trước về Docker, nhưng nên quen dùng dòng lệnh cơ bản. Mỗi bài thực hành tạo ra container/image trên máy, nên cuối bài đều có phần dọn dẹp để ổ đĩa không bị đầy.

Cần chuẩn bị

  • Một máy tính (Windows, macOS hoặc Linux) — Bài 1 sẽ cài Docker.
  • Quen dùng terminal ở mức cơ bản (mở, gõ lệnh, đọc kết quả).
  • Phần Swarm (Bài 10–13) cần nhiều node; mình sẽ hướng dẫn cách giả lập nhiều node trên một máy để học mà không cần nhiều server thật.

Hết bài này chưa cần làm gì. Bài 1 ta cài Docker và chạy container đầu tiên.