- Docker là gì? Tại sao hữu ích trong development và deployment?
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à gì? Các instructions cơ bản?
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…
- Multi-stage builds trong Docker là gì? Lợi ích?
- Docker là gì? Frontend developer cần biết gì về Docker?
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 đề gì?
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…
- Docker image và container khác nhau thế nào?
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…
- Dockerfile layer cache hoạt động thế nào?
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 đó…
- `CMD` và `ENTRYPOINT` khác nhau thế nào?
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` và `ADD` khác nhau thế nào?
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 trong Docker dùng khi nào?
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` quan trọng thế nào?
.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…
- Docker port publishing và container network cần hiểu gì?
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…
- Environment variables và secrets trong Docker/Compose nên xử lý thế nào?
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…
- Docker `HEALTHCHECK` dùng khi nào?
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.…
- Docker image production nên tối ưu security thế nào?
- Docker tag và digest khác nhau thế nào?
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 nên log và lưu state thế nào?
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, ReplicaSet, StatefulSet và DaemonSet khác nhau thế nào?
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…
- Kubernetes Service types khác nhau thế nào?
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 trong Kubernetes dùng để làm gì?
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, liveness và startup probes khác nhau thế nào?
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ư…
- CPU/memory requests và limits trong Kubernetes dùng để làm gì?
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.…
- Rolling update trong Kubernetes cần cấu hình gì để ít downtime?
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 và selectors trong Kubernetes quan trọng thế nào?
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, PersistentVolumeClaim và StorageClass khác nhau thế nào?
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ự…
- StatefulSet nên dùng cho workload nào?
- Init container dùng khi nào?
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…
- Sidecar container trong Kubernetes dùng khi nào?
- SecurityContext nên cấu hình gì cho Pod/container?
- `imagePullPolicy` và registry strategy cần hiểu gì?
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 và Kustomize khác nhau thế nào?
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…
- Debug Pod lỗi thường dùng lệnh nào?
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…
- NetworkPolicy trong Kubernetes dùng để làm gì?
- CrashLoopBackOff, ImagePullBackOff và Pending thường debug thế nào?
- Docker Compose và Kubernetes nên dùng ở đâu?
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…
- Service mesh là gì? Giải quyết vấn đề gì trong microservice?
- Container khác Virtual Machine ở điểm nào?
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ả: -…
- Cơ chế nào của Linux giúp container cô lập với nhau?
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.…
- Một container đi qua những trạng thái nào trong vòng đời?
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…
- Các restart policy của Docker khác nhau thế nào?
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…
- Làm sao giới hạn CPU và memory cho một container?
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 và toleration hoạt động như thế nào?
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…
- Node affinity và pod affinity/anti-affinity dùng để làm gì?
Đâ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…
- kube-scheduler quyết định đặt một Pod lên node nào bằng cách nào?
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ó…
- Custom Resource (CRD) và Operator pattern là gì?
- Pod nằm trên các node khác nhau giao tiếp với nhau bằng cách nào?
- Infrastructure as Code là gì, và Terraform khác Ansible thế nào?
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ì sao trong Dockerfile phải `COPY package.json` và cài dependency trước khi `COPY` toàn bộ source?
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…
- Chọn base image `alpine`, `slim` hay `distroless` dựa trên gì? Alpine hay gây lỗi gì với Node/Python?
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à…
- Máy build hết dung lượng đĩa vì Docker. Dọn thế nào cho an toàn? `docker system prune` xoá những gì?
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…
- Trong Docker Compose, service `api` kết nối tới `db` bằng host nào? Vì sao `localhost` không chạy?
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…
- Viết `CMD npm start` khác `CMD ["npm", "start"]` thế nào? Exec form và shell form ảnh hưởng gì tới `ENTRYPOINT`?
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` treo đúng 10 giây rồi container mới tắt, và request đang chạy bị cắt giữa chừng. Nguyên nhân và cách sửa?
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ữ…
- Image Node của em đang 1.2 GB. Em dùng multi-stage build để giảm xuống thế nào?
Ý 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…
- Em truyền token private registry qua `ARG` lúc build. Vì sao cách này lộ secret, và thay bằng gì?
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…
- Vì sao không nên để container chạy bằng root? Đổi sang non-root xong app báo lỗi ghi file thì xử lý thế nào?
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ư…
- Container hiện `unhealthy` nhưng Docker không tự restart nó dù đã đặt `restart: always`. Vì sao?
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,…
- Mount source code vào container để hot reload thì `node_modules` biến mất. Vì sao, và bind mount khác named volume chỗ nào?
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…
- Build trên CI luôn miss cache dù Dockerfile không đổi. Nguyên nhân và cách tận dụng cache của BuildKit?
- Image build trên MacBook M1 đẩy lên server báo `exec format error`. Chuyện gì xảy ra và xử lý ra sao?
- Container chết đột ngột với exit code 137. Em chẩn đoán và khắc phục thế nào?
- Em `RUN rm -rf` file lớn ở dòng sau nhưng image không giảm dung lượng. Vì sao? Layer hoạt động thế nào?
- `kubectl get pod` báo STATUS `Running` nhưng cột READY là `0/1` — nghĩa là gì?
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.…
- Đã `kubectl apply` một Ingress nhưng truy cập domain không ra gì. Vì sao?
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…
- Vì sao không nên tạo Pod trực tiếp mà phải qua Deployment?
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ó: -…
- Muốn gọi thử một Service đang chạy trong cluster từ máy local thì làm thế nào?
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…
- Đặt liveness probe sai có thể gây restart loop như thế nào? Thiết kế probe đúng ra sao?
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…
- QoS class của Pod được xác định thế nào? Khi node hết memory thì Pod nào bị evict trước?
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…
- Pod bị `OOMKilled` — bạn chẩn đoán và xử lý thế nào?
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…
- Sửa ConfigMap/Secret thì Pod có tự nhận cấu hình mới không?
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Ó,…
- Gọi Service trong cluster bị 503 / connection refused, Pod vẫn Running — debug theo trình tự nào?
Đ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…
- DNS trong cluster hoạt động thế nào? Vì sao Pod gọi domain ngoài lại chậm?
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ó…
- ResourceQuota và LimitRange khác nhau thế nào? Dùng để làm gì?
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…
- Service có latency p99 cao nhưng biểu đồ CPU chỉ ~30%. CPU limit liên quan gì ở đây?
- Rolling update đã bật readiness probe mà vẫn có request lỗi 502 lúc deploy. Nguyên nhân và cách khắc phục?
- PodDisruptionBudget dùng để làm gì? Nó bảo vệ được và không bảo vệ được trường hợp nào?
- HPA phản ứng chậm khi traffic tăng đột ngột, hoặc scale lên xuống liên tục. Vì sao và chỉnh thế nào?
- Vận hành StatefulSet khác Deployment ở những điểm nào? Scale down thì dữ liệu có mất không?