Alpha Web3 & AI
Trang chủ › Điện Toán Đám Mây

Docker và Kubernetes: Containerization cho người mới bắt đầu

Ban biên tập Alpha Web3 & AI · · Cập nhật
Docker và Kubernetes: Containerization cho người mới bắt đầu

Containerization là cách đóng gói ứng dụng cùng toàn bộ thư viện và cấu hình nó cần vào một đơn vị chạy được ở bất kỳ đâu. Docker là công cụ phổ biến nhất để tạo và chạy container trên một máy, còn Kubernetes là hệ thống điều phối hàng trăm container trên nhiều máy. Nếu bạn mới bắt đầu, hãy học Docker trước; bài viết này giải thích vì sao, và khi nào bạn thực sự cần bước tiếp sang Kubernetes.

Vấn đề mà container giải quyết

Câu "trên máy em chạy được mà" quen thuộc với mọi lập trình viên. Ứng dụng chạy tốt trên laptop nhưng lỗi trên máy chủ vì khác phiên bản Python, thiếu thư viện hệ thống, biến môi trường khác. Trước đây, đội vận hành phải viết tài liệu cài đặt dài và cấu hình từng máy chủ bằng tay.

Container giải quyết bằng cách đóng gói mọi thứ ứng dụng cần, trừ nhân hệ điều hành, vào một image. Image này chạy giống hệt nhau trên laptop, máy chủ kiểm thử và production. Thay vì mô tả cách cài đặt, bạn giao chính kết quả cài đặt.

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

Máy ảo giả lập toàn bộ phần cứng và chạy một hệ điều hành đầy đủ bên trong. Container dùng chung nhân hệ điều hành của máy chủ, chỉ cô lập tiến trình, hệ thống file và mạng bằng các cơ chế của nhân Linux như namespaces và cgroups.

Tiêu chíMáy ảoContainer
Thành phầnHệ điều hành khách đầy đủChỉ ứng dụng và thư viện
Kích thướcThường hàng GBThường từ vài chục đến vài trăm MB
Thời gian khởi độngHàng chục giây đến phútThường chỉ vài giây
Mức cô lậpMạnh, tách biệt ở tầng phần cứng ảoNhẹ hơn, chung nhân hệ điều hành

Hai công nghệ không loại trừ nhau. Trên cloud, container thường chạy bên trong máy ảo.

Các khái niệm Docker cần nắm

  • Dockerfile: file văn bản mô tả từng bước tạo image: chọn image nền, sao chép mã, cài thư viện, khai báo lệnh khởi động.
  • Image: bản đóng gói chỉ đọc, gồm nhiều lớp (layer) xếp chồng. Mỗi lệnh trong Dockerfile tạo một lớp; lớp không đổi được dùng lại từ cache.
  • Container: một phiên bản đang chạy của image. Từ một image có thể chạy nhiều container.
  • Registry: kho lưu image, như Docker Hub, GitHub Container Registry hoặc registry của các nhà cung cấp cloud.
  • Volume: nơi lưu dữ liệu bền vững bên ngoài container, vì dữ liệu ghi trong container sẽ mất khi container bị xóa.
  • Docker Compose: công cụ khai báo nhiều container chạy cùng nhau (ứng dụng, cơ sở dữ liệu, cache) trong một file YAML.

Quy trình làm việc cơ bản với Docker

  1. Viết Dockerfile cho ứng dụng: bắt đầu từ image nền chính thức của ngôn ngữ (ví dụ node, python), sao chép file khai báo phụ thuộc, cài đặt, rồi sao chép mã nguồn.
  2. Build image bằng lệnh docker build -t ten-ung-dung .
  3. Chạy thử bằng docker run -p 8080:8080 ten-ung-dung, ánh xạ cổng của container ra máy.
  4. Khi cần cơ sở dữ liệu, viết file Compose và khởi động cả hệ thống bằng docker compose up.
  5. Đẩy image lên registry để máy chủ hoặc pipeline CI kéo về.

Mẹo nhỏ cho Dockerfile: sao chép file khai báo phụ thuộc và cài đặt trước khi sao chép toàn bộ mã nguồn. Khi bạn chỉ sửa mã, Docker dùng lại lớp đã cài thư viện và build nhanh hơn đáng kể. Thêm file .dockerignore để loại thư mục như node_modules hay .git khỏi bối cảnh build.

Khi một máy không còn đủ: Kubernetes xuất hiện

Docker trên một máy là đủ cho môi trường phát triển và nhiều ứng dụng nhỏ. Nhưng khi hệ thống lớn lên, những câu hỏi mới xuất hiện: container chết thì ai khởi động lại? Lượng truy cập tăng thì làm sao chạy thêm bản sao trên máy khác? Cập nhật phiên bản mà không gián đoạn thế nào? Các dịch vụ tìm thấy nhau ra sao khi địa chỉ thay đổi liên tục?

Kubernetes, dự án mã nguồn mở khởi nguồn từ Google và hiện thuộc Cloud Native Computing Foundation, trả lời các câu hỏi này. Bạn khai báo trạng thái mong muốn, ví dụ "luôn có ba bản sao của dịch vụ web, mỗi bản tối đa 512 MB RAM", và Kubernetes liên tục điều chỉnh cụm máy để đạt trạng thái đó.

Những gì Kubernetes làm thay bạn

  • Xếp container vào máy còn đủ tài nguyên.
  • Khởi động lại container lỗi, thay thế máy hỏng.
  • Tăng giảm số bản sao theo tải.
  • Cập nhật cuốn chiếu và quay lại phiên bản cũ.
  • Cung cấp tên dịch vụ ổn định và cân bằng tải nội bộ.
  • Quản lý cấu hình và bí mật tách khỏi image.

Để đi sâu vào các đối tượng như Pod, Deployment, Service, bạn có thể đọc tiếp hướng dẫn Kubernetes cho người mới bắt đầu.

Bạn có thực sự cần Kubernetes?

Kubernetes mạnh nhưng phức tạp: có nhiều khái niệm, cần người hiểu để vận hành, và chi phí quản lý cụm không nhỏ. Với nhiều đội, lựa chọn đơn giản hơn là đủ:

  • Một máy chủ với Docker Compose cho ứng dụng nhỏ, lưu lượng ổn định.
  • Dịch vụ chạy container được quản lý như AWS App Runner, Google Cloud Run, Azure Container Apps: bạn đưa image, nền tảng lo phần còn lại.
  • Nền tảng serverless cho tác vụ hướng sự kiện.

Kubernetes đáng giá khi bạn có nhiều dịch vụ, nhiều đội, yêu cầu mở rộng phức tạp hoặc muốn tránh phụ thuộc một nhà cung cấp. Kiến trúc nhiều dịch vụ nhỏ là lý do phổ biến khiến đội chuyển sang K8s; bài so sánh microservices và monolithic giúp bạn đánh giá mình đã đến lúc đó chưa.

Lưu ý an toàn ngay từ đầu

  • Dùng image nền chính thức hoặc từ nguồn tin cậy, ghim phiên bản cụ thể.
  • Không chạy tiến trình bằng root trong container nếu không cần.
  • Không đưa mật khẩu, khóa API vào Dockerfile hay image.
  • Quét image định kỳ để phát hiện thư viện có lỗ hổng đã công bố.
  • Cập nhật image nền thường xuyên để nhận bản vá bảo mật.

Lộ trình học gợi ý

  1. Cài Docker Desktop hoặc Docker Engine, chạy vài image có sẵn để làm quen lệnh.
  2. Container hóa một ứng dụng nhỏ của bạn, viết Dockerfile và tối ưu thứ tự lớp.
  3. Dùng Docker Compose để chạy ứng dụng cùng cơ sở dữ liệu.
  4. Đưa việc build image vào pipeline CI.
  5. Thử Kubernetes cục bộ với kind, minikube hoặc k3d; triển khai lại chính ứng dụng ấy.
  6. Tìm hiểu dịch vụ Kubernetes được quản lý (EKS, GKE, AKS) khi đã nắm khái niệm.

Học theo thứ tự này giúp mỗi khái niệm mới dựa trên nền tảng đã vững, thay vì cùng lúc đối mặt với cả Docker lẫn hàng chục đối tượng của Kubernetes.

Câu hỏi thường gặp

Docker có miễn phí không?

Docker Engine là mã nguồn mở và miễn phí. Docker Desktop miễn phí cho cá nhân, giáo dục và doanh nghiệp nhỏ, nhưng doanh nghiệp vượt ngưỡng quy mô theo điều khoản của Docker cần mua gói trả phí; nên kiểm tra điều khoản hiện hành.

Kubernetes có thay thế Docker không?

Không hẳn. Kubernetes điều phối container, còn việc build image vẫn thường dùng Docker hoặc công cụ tương đương. Kubernetes hiện chạy container thông qua runtime như containerd, nhưng image build bằng Docker vẫn chạy bình thường vì tuân theo chuẩn OCI.

Chạy Docker trên Windows hay macOS được không?

Được. Docker Desktop trên Windows và macOS chạy một máy ảo Linux nhẹ phía sau để chứa container Linux. Trên Windows cũng có thể dùng WSL 2 làm nền.

Container có an toàn bằng máy ảo không?

Mức cô lập của container mỏng hơn vì dùng chung nhân hệ điều hành. Với khối lượng công việc cần cô lập mạnh giữa nhiều khách hàng, người ta thường kết hợp container với máy ảo hoặc dùng runtime sandbox chuyên dụng.

Bài liên quan