Tổng hợp 78 câu hỏi phỏng vấn Docker & Kubernetes kèm đáp án chi tiết, song ngữ Việt–Anh — sắp xếp từ cơ bản đến nâng cao. Ôn luyện miễn phí, tự động lưu tiến độ.
Docker đóng gói app cùng dependency vào container để chạy giống nhau ở mọi môi trường. Container khác VM: VM ảo hoá phần cứng nên nặng, có OS riêng và boot tính bằng phút; container dùng chung kernel của host nên nhẹ, khởi động tính…
Dockerfile là script mô tả cách build image, và mỗi instruction sinh ra một layer được cache. Nguyên tắc quan trọng nhất: đặt thứ ít thay đổi lên trước. - Layer caching: source đổi mà package.json không đổi thì Docker dùng lại layer npm ci…
Docker đóng gói ứng dụng và dependencies vào container, đảm bảo chạy giống nhau trên mọi máy (dev, staging, production). Frontend dev cần biết: (1) Dockerfile multi-stage — stage 1 build app, stage 2 chỉ copy file build sang nginx/node, giảm image từ 1GB xuống…
Docker giải quyết vấn đề môi trường chạy không nhất quán giữa local, CI và production bằng cách đóng gói ứng dụng cùng runtime, dependencies và cấu hình vào container image. Nhờ đó, một image chạy đúng trên máy bạn thì cũng chạy đúng trên…
Image là template bất biến gồm filesystem layers, metadata và command mặc định. Container là runtime instance được tạo từ image, có process, network namespace và writable layer riêng. Một image có thể chạy thành nhiều container. Khi container bị xoá, thay đổi trong writable…
Mỗi instruction trong Dockerfile tạo layer hoặc metadata step. Docker có thể reuse cache nếu instruction và context liên quan không đổi. Vì vậy thứ tự Dockerfile ảnh hưởng tốc độ build rất nhiều. Pattern phổ biến: copy lockfile/package metadata trước, install dependencies, sau đó…
ENTRYPOINT định nghĩa executable chính của container. CMD cung cấp default arguments hoặc command mặc định có thể override khi chạy container. Dùng cùng nhau khi image có một binary chính và cần default args. Ví dụ: Nếu image là tool CLI, ENTRYPOINT giúp người…
COPY copy file/folder từ build context vào image. ADD cũng copy nhưng có thêm behavior như tự giải nén local tar archives và hỗ trợ URL trong một số trường hợp. Trong production Dockerfile, ưu tiên COPY vì rõ ràng và ít bất ngờ hơn.…
Multi-stage build tách stage build và stage runtime. Stage build chứa compiler, dev dependencies và artifacts tạm; stage runtime chỉ copy output cần chạy. Kết quả là image nhỏ hơn, attack surface nhỏ hơn và deploy nhanh hơn. Ví dụ: Không nên ship cả compiler,…
.dockerignore loại file khỏi build context trước khi gửi cho Docker builder. Nó giúp build nhanh hơn, cache ổn định hơn và tránh đưa secrets, logs, nodemodules local hoặc artifacts lớn vào context. Nên ignore .git, local env files, test output, coverage, build artifacts không…
Container có network namespace riêng. Service bên trong có thể listen trên port 8000, nhưng host chỉ truy cập được nếu publish port hoặc cùng network có service khác gọi bằng container/service name. Ví dụ: 8080:8000 nghĩa là host port 8080 trỏ vào container port…
Env vars phù hợp cấu hình không nhạy cảm hoặc secret đã được inject từ secret manager. Không nên commit .env chứa production secrets. Với Compose, có thể dùng envfile cho local và secrets/file mount cho dữ liệu nhạy cảm. Ví dụ Compose local: Production…
HEALTHCHECK cho Docker biết container process còn sống chưa đủ, app có thật sự healthy hay không. Nó có thể gọi endpoint nội bộ, kiểm tra port hoặc chạy command nhẹ. Ví dụ: Healthcheck không nên nặng hoặc phụ thuộc hệ thống ngoài quá xa.…
Tag là tên tham chiếu dễ đọc như app:1.2.0 hoặc app:latest, có thể bị trỏ lại image khác. Digest là content-addressed reference theo hash, bất biến theo nội dung image. Production nên tránh phụ thuộc latest. Dùng version tag rõ ràng và trong môi trường…
Container app nên log ra stdout/stderr để platform thu thập, thay vì ghi file log local khó gom. State quan trọng nên lưu ở database, object storage, queue hoặc volume được backup, không phụ thuộc writable layer của container. Container nên được thiết kế stateless…
Deployment quản lý stateless replicas và rolling updates, tạo ReplicaSet phía dưới. ReplicaSet đảm bảo số Pod replicas nhưng hiếm khi tạo trực tiếp. StatefulSet dùng cho workloads cần identity ổn định, persistent storage và thứ tự rollout. DaemonSet chạy một Pod trên mỗi node…
ClusterIP expose service nội bộ trong cluster. NodePort mở port trên nodes. LoadBalancer yêu cầu cloud/load balancer provider tạo load balancer bên ngoài. ExternalName map service sang DNS name ngoài cluster. Ví dụ ClusterIP: Phần quan trọng là selector phải match labels của Pods, nếu…
Ingress định nghĩa rule HTTP/HTTPS để traffic từ ngoài cluster đi vào Services bên trong, thường dựa trên host/path. Ingress chỉ là Kubernetes resource; cần Ingress Controller như nginx, Traefik hoặc cloud controller để thực thi rule. Khác với Service LoadBalancer expose một Service trực…
Readiness probe quyết định Pod đã sẵn sàng nhận traffic chưa. Liveness probe quyết định container có cần restart không. Startup probe bảo vệ app khởi động chậm để liveness không giết quá sớm. Ví dụ: Không dùng liveness để check dependency bên ngoài như…
Requests là lượng tài nguyên scheduler dùng để đặt Pod lên node. Limits là trần runtime container được phép dùng. CPU limit có thể gây throttling; memory vượt limit thường bị OOMKilled. Ví dụ: Không đặt requests quá thấp để nhồi node nếu app latency-sensitive.…
Deployment rolling update thay Pods cũ bằng Pods mới dần dần. Để ít downtime cần readiness probe đúng, maxUnavailable thấp, maxSurge phù hợp, graceful shutdown và app xử lý SIGTERM. Ví dụ: Nếu readiness probe báo ready quá sớm hoặc shutdown không drain request, rolling…
Labels là key-value metadata gắn lên objects. Selectors cho Service, Deployment, NetworkPolicy hoặc kubectl chọn đúng objects. Nếu labels/selectors sai, Service không route traffic hoặc Deployment không quản lý Pods đúng. Ví dụ: Label taxonomy nên nhất quán từ đầu: app, component, version, environment, team.…
PersistentVolume là storage resource trong cluster. PersistentVolumeClaim là yêu cầu storage từ workload. StorageClass định nghĩa cách provision storage động như disk type, reclaim policy hoặc provisioner. Ví dụ PVC: Stateful app cần backup, restore, resize và migration strategy. PVC chỉ cấp storage, không tự…
Init container chạy xong trước app containers. Nó phù hợp chuẩn bị file/config, chờ dependency nội bộ, chạy migration nhẹ có kiểm soát hoặc setup permission cho volume. Ví dụ: Không nên dùng init container để che lỗi kiến trúc như app không retry được…
imagePullPolicy quyết định kubelet kéo image khi nào: Always, IfNotPresent, hoặc Never. Nếu dùng tag mutable như latest, behavior dễ khó đoán và rollback khó hơn. Production nên dùng immutable version tags hoặc digest, private registry có auth rõ ràng, image scanning trong CI và…
Helm là package manager/template engine cho Kubernetes, phù hợp chart tái sử dụng, values theo môi trường và dependency packaging. Kustomize patch YAML gốc bằng overlays, không dùng template language, tích hợp sẵn với kubectl apply -k. Helm mạnh khi phân phối app/platform package. Kustomize…
Các lệnh cơ bản: xem Pod, describe events, logs container, exec vào container nếu có shell, xem rollout và endpoints Service. Thứ tự tốt là kiểm status, events, logs, config, network, resource. Ví dụ: --previous hữu ích khi container restart. Nếu image tối giản không…
Docker Compose phù hợp local development, integration tests và môi trường nhỏ cần chạy nhiều services nhanh. Kubernetes phù hợp production hoặc platform cần orchestration, scaling, self-healing, rollout, service discovery và policy mạnh. Không cần đưa mọi dự án nhỏ lên Kubernetes nếu team chưa…
VM ảo hoá cả phần cứng: mỗi VM chạy một guest OS đầy đủ trên hypervisor. Container ảo hoá ở tầng OS: nhiều container chia sẻ chung kernel của host, mỗi container chỉ đóng gói app cùng dependencies và một userspace riêng. Hệ quả: -…
Docker không chạy một hypervisor. Nó dựa trên hai nhóm tính năng của Linux kernel: - Namespaces — cô lập góc nhìn của process. Mỗi container có namespace riêng cho pid (danh sách process), net (interface, IP, port), mnt (filesystem), uts (hostname), ipc và user.…
Các trạng thái chính (docker ps -a hiển thị ở cột STATUS): - created — container đã được tạo từ image nhưng chưa start, chưa có process chạy. - running — process chính (PID 1) đang chạy sau docker start/docker run. - paused — toàn…
Restart policy quyết định Docker có tự khởi động lại container khi nó thoát hay khi daemon khởi động lại. Đặt bằng --restart: - no (mặc định) — không bao giờ tự restart. - on-failure[:N] — chỉ restart khi container thoát với exit code khác…
Docker dựa vào cgroups để đặt trần tài nguyên ngay khi chạy. Mặc định container dùng tài nguyên gần như không giới hạn, nên trên host nhiều container cần đặt limit rõ ràng. Memory: - --memory (hard limit): vượt trần thì kernel OOM-kill process trong…
Taint đặt trên node để đẩy Pod ra: theo mặc định Pod sẽ không được schedule lên node đó. Toleration đặt trên Pod để nói rằng nó chấp nhận một taint cụ thể, nhờ đó vẫn có thể lên node bị taint. Taint có dạng…
Đây là các luật hút Pod về đúng chỗ, bổ sung cho taint (vốn để đẩy ra). - Node affinity — chọn node theo label của node. Thay cho nodeSelector cứng, nó hỗ trợ điều kiện mềm/cứng. Ví dụ: chỉ chạy trên node disktype=ssd, hoặc…
Scheduler theo dõi các Pod chưa có node (nodeName rỗng) và với mỗi Pod chạy hai giai đoạn: 1. Filtering (Predicates) — loại bỏ node không thể chạy Pod. Kiểm tra: node có đủ CPU/memory theo requests không, có thoả nodeSelector/node affinity không, taint có…
Infrastructure as Code (IaC) là quản lý hạ tầng (máy chủ, mạng, DNS, cluster...) bằng file cấu hình được version-control, thay vì bấm tay trên console. Lợi ích: tái lập được, review qua pull request, có lịch sử thay đổi, dựng lại môi trường giống…
Vì build cache của Docker bị invalidate theo thứ tự layer: khi một instruction bị coi là thay đổi, mọi layer phía sau nó đều build lại. Nếu copy toàn bộ source trước rồi mới npm install, chỉ cần sửa một dòng code là checksum…
Alpine nhỏ (~5 MB) nhưng dùng musl libc thay vì glibc, và đó là nguồn gốc phần lớn sự cố: - Native module không có prebuilt binary cho musl — Node phải biên dịch lại từ source (cần thêm python3, make, g++), build lâu và…
Dung lượng đĩa thường nằm ở 4 nhóm: image không dùng, container đã dừng, volume không còn container nào dùng, và build cache. Kiểm tra trước khi xoá: docker system prune mặc định xoá: container đã dừng, network không container nào dùng, dangling image (image…
Dùng tên service làm hostname: db:5432. localhost bên trong container trỏ về chính container đó, không phải máy host hay container khác — mỗi container có network namespace riêng. Compose tự tạo một user-defined bridge network cho project và bật DNS nội bộ, nên mọi…
Shell form (CMD npm start) được bọc thành /bin/sh -c "npm start" → shell là PID 1, app là process con. Exec form (CMD ["npm", "start"]) chạy binary trực tiếp → app là PID 1. Khác biệt quan trọng: - Tín hiệu: sh -c không…
docker stop gửi SIGTERM, chờ 10 giây (mặc định) rồi gửi SIGKILL. Treo đủ 10 giây nghĩa là không ai xử lý SIGTERM. Ba nguyên nhân thường gặp: 1. PID 1 là shell — dùng shell form hoặc script start.sh không exec, nên sh giữ…
Ý tưởng: stage build chứa toolchain, stage runtime chỉ chứa artifact. Chỉ layer của stage cuối đi vào image xuất ra — mọi thứ ở stage trước (devDependency, compiler, source TS) bị bỏ lại. Các nguồn dung lượng bị cắt: devDependency (thường là phần lớn…
Vì ARG và mọi lệnh RUN đều được ghi vào metadata của image. Ai có image cũng đọc lại được: Xoá ở layer sau cũng vô ích: layer là bất biến và cộng dồn, file đã nằm ở layer trước thì vẫn tồn tại trong…
Mặc định process trong container chạy bằng root (uid 0), và uid đó trùng với root của host — namespace chỉ tách tiến trình/mạng, không tách user (trừ khi bật user namespace remapping). Nếu kẻ tấn công thoát được container hoặc bind mount trúng thư…
Vì HEALTHCHECK và restart policy là hai cơ chế độc lập. Restart policy chỉ phản ứng khi process chính thoát (exit code khác 0, hoặc bất kỳ exit code nào với always). Container unhealthy mà process vẫn sống thì Docker Engine chỉ đổi trạng thái,…
Vì bind mount .:/app che toàn bộ thư mục /app trong image bằng thư mục host — kể cả nodemodules đã cài lúc build. Host không có nodemodules (hoặc có bản build cho OS khác) → app không tìm thấy module. Cách xử lý: mount…
Container đã chạy nhưng readiness probe chưa pass, nên Pod chưa được coi là sẵn sàng nhận traffic. Hai cột nói hai chuyện khác nhau: - STATUS = trạng thái vòng đời của Pod (Pending, Running, Succeeded...). Running chỉ có nghĩa container đã được start.…
Ingress chỉ là bản mô tả luật routing, nó không tự xử lý request. Muốn nó có tác dụng phải có Ingress controller đang chạy trong cluster (ingress-nginx, Traefik, HAProxy, hoặc controller của cloud provider). Checklist khi Ingress "không làm gì": 1. Có controller chưa…
Pod là đơn vị chạy không có khả năng tự phục hồi. Tạo Pod trần (bare Pod) thì khi node chết hoặc Pod bị xoá, không ai tạo lại — ứng dụng biến mất. Deployment thêm vào bốn thứ mà Pod trần không có: -…
Dùng kubectl port-forward — nó mở một tunnel từ port trên máy bạn tới Pod/Service trong cluster, đi qua API server nên không cần mở firewall hay tạo Service public. Đặc điểm cần nhớ: - Chỉ tồn tại trong lúc lệnh còn chạy, dành cho…
Liveness probe fail thì kubelet giết container và khởi động lại. Nên nếu probe kiểm tra nhầm thứ, hệ thống tự phá chính nó. Hai lỗi phổ biến: 1. Health endpoint kiểm tra cả dependency. Nếu /health gọi DB và DB chậm 5 giây, liveness…
Kubernetes gán QoS class tự động dựa trên cách bạn khai requests và limits: - Guaranteed — mọi container có đủ cả request và limit cho CPU + memory, và request bằng limit. - Burstable — có ít nhất một request/limit được đặt, nhưng không…
OOMKilled nghĩa là container vượt resources.limits.memory và bị OOM killer của kernel giết. Dấu hiệu: RESTARTS tăng, describe cho thấy Last State: Terminated, Reason: OOMKilled, Exit Code: 137. Xác nhận: Log --previous rất quan trọng — log của container hiện tại là của lần restart…
Tuỳ cách gắn vào Pod, và đây là chỗ hay hiểu nhầm. Gắn qua env / envFrom: KHÔNG. Biến môi trường được đưa vào lúc container start; sửa ConfigMap sau đó không ảnh hưởng process đang chạy. Phải tạo Pod mới. Mount thành volume: CÓ,…
Đi từ Service về phía Pod, mỗi bước loại trừ một tầng. 1. Service có Endpoints không? Rỗng là manh mối rõ nhất: hoặc selector không khớp label của Pod, hoặc Pod chưa READY (readiness fail thì bị loại khỏi Endpoints). Đối chiếu spec.selector của…
Mỗi Service có bản ghi DNS dạng <service.<namespace.svc.cluster.local do CoreDNS phục vụ. Trong cùng namespace gọi ngắn gọn api là đủ; khác namespace phải api.payment. Điều làm nhiều người bất ngờ nằm ở /etc/resolv.conf mà kubelet inject vào Pod: ndots:5 nghĩa là: tên nào có…
Cả hai đều là hàng rào tài nguyên ở mức namespace, nhưng ở hai tầng khác nhau. ResourceQuota — trần cho cả namespace. Giới hạn tổng lượng tài nguyên và cả số lượng object mà namespace được dùng. LimitRange — luật cho từng container/Pod. Đặt…