Khóa học Nền tảng Docker và Kubernetes

Khóa học trung cấp có cấu trúc về image Docker, container, volume, mạng, Compose, và workload, dịch vụ, lưu trữ, xử lý sự cố Kubernetes.

Cấp độ: Docker & Kubernetes Độ khó: intermediate 5 bài học 90 phút
Tiến độ khóa học 0 / 5
Quay lại khóa học

Bạn sẽ học được

  • Xây dựng và tối ưu image Docker bằng Dockerfile
  • Chạy và kiểm tra container cùng lưu trữ dữ liệu bền vững bằng volume
  • Kết nối container bằng mạng Docker và Compose
  • Triển khai workload Kubernetes cốt lõi với ConfigMap và Secret
  • Mở dịch vụ ra ngoài và xử lý sự cố cụm Kubernetes

Trước khi bắt đầu

  • Có kinh nghiệm cơ bản với dòng lệnh Linux
  • Quen thuộc với HTTP, cổng và triển khai ứng dụng
  • Ngân hàng luyện Docker và Kubernetes hữu ích cho tự đánh giá

Bài học 1 Image Docker và Dockerfile

Image Docker là một mẫu chỉ đọc chứa ứng dụng, runtime, thư viện và cấu hình của nó. Image được xây dựng từ Dockerfile bằng các lớp: mỗi lệnh như FROM, COPY, RUN hoặc ENV tạo một lớp, và các lớp không thay đổi được lưu cache để quá trình build lại nhanh hơn. Image nhỏ hơn và an toàn hơn ưu tiên image nền tối giản, gộp các lệnh RUN liên quan và chỉ sao chép những tệp ứng dụng cần.

Lệnh FROM chọn image nền. COPY di chuyển tệp từ build context vào image, còn RUN thực thi lệnh trong quá trình build. CMD cung cấp lệnh và đối số mặc định dùng khi container khởi động, và ENTRYPOINT định nghĩa chương trình thực thi luôn chạy. Khi cả hai có mặt, entrypoint nhận các đối số dòng lệnh làm tham số. Có thể thêm health check hoặc người dùng không phải root bằng HEALTHCHECKUSER.

Dùng docker build -t myapp:latest . để xây dựng image và docker image ls để liệt kê image. Gắn tag image bằng số phiên bản có ý nghĩa và tránh chỉ dùng latest trong production. Mục tiêu là một image xác định, nhỏ và có thể tái tạo chỉ từ Dockerfile.

Mẹo luyện tập Image Docker và Dockerfile: Ôn lại bài học này trong các phiên ngắn mỗi ngày. Sau mỗi bài tập, hãy nêu quy tắc hoặc bước bạn đã dùng; nếu không nêu được, hãy ôn lại chủ đề đó trước khi tiếp tục. Kiên trì giúp ghi nhớ tốt hơn một buổi học dài.

Ví dụ

Ứng dụng Node.js chỉ cần các tệp package để cài phụ thuộc và mã nguồn để chạy. Dockerfile bắt đầu bằng FROM node:20-alpine, sao chép package.json trước, chạy npm ci, sao chép mã nguồn, chuyển sang người dùng không phải root và định nghĩa CMD ["node", "server.js"]. Sao chép phụ thuộc trước mã nguồn giúp Docker tái sử dụng lớp phụ thuộc cho đến khi tệp package thay đổi.

Đọc lại câu hỏi trước khi kết thúc và xác nhận câu trả lời đúng ý.

Bài học 2 Vòng đời Container và Lưu trữ bền vững

Container là một instance đang chạy của image. Docker tạo, khởi động, dừng, khởi động lại và xóa container bằng các lệnh như docker create, docker start, docker stopdocker rm. Lệnh tắt thường dùng docker run tạo và khởi động container trong một bước. Dùng docker ps để xem container đang chạy, docker ps -a để bao gồm container đã dừng, và docker logs để kiểm tra đầu ra của ứng dụng.

Hệ thống tệp của container là tạm thời: khi container bị xóa, các thay đổi ghi bên trong sẽ biến mất. Volume và bind mount giải quyết điều này. Volume có tên được Docker quản lý và tồn tại sau khi xóa container; bind mount ánh xạ một thư mục host vào container. Các cờ -v--mount gắn lưu trữ, và các container có thể dùng chung một volume. Mount chỉ đọc ngăn thay đổi ngoài ý muốn.

Để gỡ lỗi, docker exec -it container bash mở shell bên trong container đang chạy, và docker inspect hiển thị chi tiết cấu hình và trạng thái. Chỉ gắn chính sách --restart khi ứng dụng cần tự phục hồi, và giữ log cùng dữ liệu bên ngoài container khi bản thân container có thể thay thế được.

Mẹo luyện tập Vòng đời Container và Lưu trữ bền vững: Ôn lại bài học này trong các phiên ngắn mỗi ngày. Sau mỗi bài tập, hãy nêu quy tắc hoặc bước bạn đã dùng; nếu không nêu được, hãy ôn lại chủ đề đó trước khi tiếp tục. Kiên trì giúp ghi nhớ tốt hơn một buổi học dài.

Ví dụ

Một container cơ sở dữ liệu được khởi động bằng docker run -d --name postgres -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres:16. Volume có tên pgdata giữ các tệp cơ sở dữ liệu sau docker rm postgres, nên container thay thế dùng cùng volume sẽ khôi phục cùng dữ liệu.

Đọc lại câu hỏi trước khi kết thúc và xác nhận câu trả lời đúng ý.

Bài học 3 Mạng Docker và Compose

Mạng Docker cho phép container giao tiếp theo tên hoặc IP. Mạng bridge mặc định cung cấp DNS tự động giữa các container trên cùng mạng, còn mạng host dùng chung network stack của host và loại bỏ sự cô lập. Nên dùng mạng bridge do người dùng định nghĩa vì hỗ trợ phân giải DNS và có thể gắn hoặc tách mà không cần tạo lại container. Công bố cổng container ra host bằng -p 8080:80; bên trái là cổng host và bên phải là cổng container.

Docker Compose định nghĩa ứng dụng nhiều container trong một tệp YAML. Các service khai báo image, build context, cổng, volume, biến môi trường và mạng. Chạy docker compose up -d tạo mạng và khởi động các service cùng nhau; docker compose down xóa container và mạng mặc định trong khi giữ lại volume có tên. Compose cũng hỗ trợ dependency, health check và mở rộng replica của service.

Gỡ lỗi kết nối bằng docker network ls, docker network inspectdocker exec. Lỗi thường gặp là container web không truy cập được cơ sở dữ liệu vì chúng ở mạng khác nhau hoặc vì ứng dụng dùng localhost thay vì tên service. Hãy dùng tên service trong Compose để DNS tích hợp phân giải đúng container.

Mẹo luyện tập Mạng Docker và Compose: Ôn lại bài học này trong các phiên ngắn mỗi ngày. Sau mỗi bài tập, hãy nêu quy tắc hoặc bước bạn đã dùng; nếu không nêu được, hãy ôn lại chủ đề đó trước khi tiếp tục. Kiên trì giúp ghi nhớ tốt hơn một buổi học dài.

Ví dụ

Tệp compose định nghĩa service webdb. Service web ánh xạ "8080:3000" và kết nối đến cơ sở dữ liệu bằng hostname db và cổng 5432. Service cơ sở dữ liệu gắn một volume có tên và đặt health check khi khởi động. Chạy docker compose up -d khởi động cả hai service trên một mạng riêng, và trình duyệt truy cập ứng dụng tại http://localhost:8080.

Đọc lại câu hỏi trước khi kết thúc và xác nhận câu trả lời đúng ý.

Bài học 4 Workload cốt lõi Kubernetes

Kubernetes chạy các ứng dụng đóng gói container trên một cụm node. Đơn vị triển khai nhỏ nhất là Pod, bao bọc một hoặc nhiều container với lưu trữ, mạng và vòng đời dùng chung. Pod thường được tạo bởi controller. Deployment quản lý các replica không trạng thái với rolling update và rollback; StatefulSet cung cấp định danh mạng ổn định và mở rộng có thứ tự cho ứng dụng stateful; DaemonSet chạy đúng một Pod trên mọi node được chọn; Job chạy workload đến khi hoàn tất; và CronJob chạy Job theo lịch.

Cấu hình được tách khỏi mã bằng ConfigMap và Secret. ConfigMap giữ dữ liệu không nhạy cảm như biến môi trường hoặc tệp cấu hình, còn Secret lưu các giá trị nhạy cảm như mật khẩu và API token. Cả hai có thể được gắn làm volume hoặc đưa vào làm biến môi trường. Secret được mã hóa base64 trong API nhưng vẫn cần bảo vệ bằng RBAC và mã hóa khi lưu trữ.

Controller điều chỉnh trạng thái mong muốn: bạn khai báo số replica mong muốn, và Kubernetes tạo hoặc xóa Pod cho đến khi thực tế khớp. Label và selector kết nối controller với Pod, vì vậy hãy dùng các label có ý nghĩa như apptier. Áp dụng manifest bằng kubectl apply -f và kiểm tra trạng thái workload bằng kubectl get pods, kubectl describe deploymentkubectl rollout status.

Mẹo luyện tập Workload cốt lõi Kubernetes: Ôn lại bài học này trong các phiên ngắn mỗi ngày. Sau mỗi bài tập, hãy nêu quy tắc hoặc bước bạn đã dùng; nếu không nêu được, hãy ôn lại chủ đề đó trước khi tiếp tục. Kiên trì giúp ghi nhớ tốt hơn một buổi học dài.

Ví dụ

Manifest Deployment khai báo ba replica của container nginx với label app: web. ConfigMap cung cấp giá trị APP_MODE, và Secret cung cấp DB_PASSWORD. Nếu một node gặp sự cố, controller tạo Pod thay thế trên các node khỏe mạnh, giữ số lượng mong muốn là ba.

Đọc lại câu hỏi trước khi kết thúc và xác nhận câu trả lời đúng ý.

Bài học 5 Dịch vụ, Lưu trữ và Xử lý sự cố Kubernetes

Service cung cấp endpoint mạng ổn định cho một nhóm Pod. ClusterIP phơi bày Service bên trong cụm, NodePort mở một cổng trên mọi node, và LoadBalancer tích hợp với nhà cung cấp đám mây cho lưu lượng bên ngoài. Ingress định tuyến lưu lượng HTTP và HTTPS đến Service theo hostname và path, thường thông qua ingress controller. Selector trong Service phải khớp label của Pod, và targetPort của Service phải khớp cổng container.

Lưu trữ bền vững dùng PersistentVolumeClaim (PVC) để yêu cầu lưu trữ, PersistentVolume (PV) để cung cấp, và StorageClass để xác định hành vi cấp phát. PVC được gắn với PV có thể mount vào Pod; ReclaimPolicy kiểm soát việc volume được giữ lại hay xóa khi PVC được giải phóng. Workload stateful như cơ sở dữ liệu nên dùng lưu trữ ổn định và hiểu cách volume claim ánh xạ đến Pod.

Xử lý sự cố theo một trình tự có cấu trúc: kubectl get pods để xem trạng thái, kubectl describe pod cho sự kiện và điều kiện, kubectl logs cho đầu ra ứng dụng, và kubectl exec để kiểm tra tương tác. Kiểm tra lỗi kéo image, nguyên nhân CrashLoopBackOff, readiness probe, selector Service và network policy. Quy trình rà soát gồm xây dựng image, kiểm thử cục bộ, triển khai thay đổi nhỏ và rollback nhanh giúp thực hành Kubernetes trở thành kỹ năng lặp lại được.

Mẹo luyện tập Dịch vụ, Lưu trữ và Xử lý sự cố Kubernetes: Ôn lại bài học này trong các phiên ngắn mỗi ngày. Sau mỗi bài tập, hãy nêu quy tắc hoặc bước bạn đã dùng; nếu không nêu được, hãy ôn lại chủ đề đó trước khi tiếp tục. Kiên trì giúp ghi nhớ tốt hơn một buổi học dài.

Ví dụ

Một Pod nằm ở trạng thái CrashLoopBackOff sau khi triển khai một image tag mới. kubectl describe pod hiển thị exit code của container, kubectl logs phát hiện một biến môi trường bị thiếu, và Deployment tham chiếu một ConfigMap không tồn tại. Sau khi tạo ConfigMap và triển khai lại, Pod đạt trạng thái Running và Service bắt đầu trả lại lưu lượng.

Đọc lại câu hỏi trước khi kết thúc và xác nhận câu trả lời đúng ý.