Hướng dẫn DevOps
Containerization và Docker là gì? Hướng dẫn container, image, Dockerfile, Compose và bảo mật
Hướng dẫn dễ hiểu về containerization và Docker: container, image, layer, registry, Dockerfile, Docker Compose, multi-stage build, volume, network, bảo mật image, secrets, scanning, SBOM và roadmap triển khai.
💡Điểm chính của bài viết
- Hướng dẫn dễ hiểu về containerization và Docker: container, image, layer, registry, Dockerfile, Docker Compose, multi-stage build, volume, network, bảo mật image, secrets, scanning, SBOM và roadmap triển khai.

Ảnh đã kiểm tra hiển thị được trước khi đưa vào file Markdown. Ảnh trích xuất từ tài liệu Docker Docs, file WebP, không phải SVG.1

Ảnh đã kiểm tra hiển thị được trước khi đưa vào file Markdown. Ảnh trích xuất từ tài liệu Docker Docs, file WebP, không phải SVG.2

Ảnh đã kiểm tra hiển thị được trước khi đưa vào file Markdown. Ảnh trích xuất từ tài liệu Docker Docs, file WebP, không phải SVG.3
Tóm tắt nhanh
Containerization là cách đóng gói ứng dụng cùng dependency, runtime, thư viện và cấu hình cần thiết vào một đơn vị chạy độc lập gọi là container. Container giúp ứng dụng chạy nhất quán giữa máy developer, CI/CD, staging và production.
Docker là bộ công cụ phổ biến để build, phân phối và chạy container. Docker Docs mô tả container image là gói chuẩn hóa chứa tất cả file, binary, library và configuration để chạy container; Docker cũng nhấn mạnh image là immutable và được cấu thành từ các layer.4
Nói dễ hiểu:
Source code + dependencies + runtime
↓ Dockerfile
Docker image
↓ docker run
Container đang chạy
Docker không thay thế Kubernetes, VM hay CI/CD. Docker giúp đóng gói và chạy ứng dụng theo cách portable hơn; Kubernetes thường dùng để điều phối container ở quy mô cluster.
Container giải quyết vấn đề gì?
Trước container, developer thường gặp vấn đề “máy tôi chạy được”:
Máy dev: Node 20, lib A version 1.2, config X
Staging: Node 18, lib A version 1.1, config Y
Production: thiếu system package, lỗi runtime
Container giúp chuẩn hóa môi trường:
App
+ runtime
+ dependencies
+ config mặc định
+ filesystem layers
↓
Container image
↓
Chạy giống nhau hơn trên nhiều môi trường
Lợi ích:
- giảm khác biệt giữa dev/staging/prod;
- deploy nhanh hơn;
- rollback dễ hơn;
- scale service dễ hơn;
- đóng gói dependency rõ ràng;
- dễ tích hợp CI/CD;
- phù hợp microservices;
- chạy local stack bằng Docker Compose.
Docker không phải là gì?
| Docker là | Docker không phải là |
|---|---|
| Công cụ build và chạy container | Công cụ orchestration hoàn chỉnh như Kubernetes |
| Cách đóng gói app và dependency | Bảo mật tự động tuyệt đối |
| Có image, container, registry, volume, network | Thay thế database backup |
| Hữu ích cho local dev và CI/CD | Bắt buộc dùng cho mọi app |
| Có Dockerfile và Compose | Chỉ dành cho microservices |
| Có thể chạy trên Linux/Windows/macOS | VM đầy đủ với kernel riêng cho từng app |
Container chia sẻ kernel của host. Vì vậy container nhẹ hơn VM, nhưng isolation không giống VM. Với workload không tin cậy, cần hardening mạnh hơn hoặc sandbox runtime.
Container, Image, Dockerfile, Registry khác nhau thế nào?
| Khái niệm | Giải thích |
|---|---|
| Image | template immutable chứa filesystem và metadata để tạo container |
| Container | instance đang chạy từ image |
| Dockerfile | file hướng dẫn build image |
| Registry | nơi lưu và phân phối image, ví dụ Docker Hub hoặc private registry |
| Layer | lớp filesystem tạo bởi từng bước build |
| Volume | nơi lưu data bền vững ngoài lifecycle container |
| Network | cơ chế container giao tiếp với nhau hoặc với host |
| Compose | công cụ định nghĩa multi-container app bằng YAML |
Docker Docs mô tả container là isolated process, còn image là gói chuẩn hóa để tạo container.54
Image layer là gì?
Docker image gồm nhiều layer. Mỗi layer đại diện cho thay đổi filesystem từ một instruction trong Dockerfile.
Ví dụ:
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "server.js"]
Các instruction như RUN, COPY, ADD có thể tạo layer mới. Docker dùng layer cache để build nhanh hơn.
Quy tắc thực tế:
- copy dependency manifest trước rồi install dependency;
- copy source code sau để tận dụng cache;
- giảm số file không cần bằng
.dockerignore; - không đưa secret vào image layer;
- dùng multi-stage build để image runtime nhỏ hơn.
Dockerfile cơ bản
Ví dụ Node.js API:
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
Giải thích:
| Dòng | Vai trò |
|---|---|
FROM | chọn base image |
WORKDIR | đặt thư mục làm việc |
COPY | copy file vào image |
RUN | chạy lệnh lúc build image |
USER | chạy app bằng user không phải root |
EXPOSE | khai báo port ứng dụng |
CMD | lệnh mặc định khi container chạy |
Dockerfile nên rõ ràng, ít layer thừa, không chứa secret và có user không phải root nếu có thể.
.dockerignore rất quan trọng
.dockerignore giúp loại file không cần khỏi build context.
Ví dụ:
node_modules
.git
.env
*.log
coverage
dist
tmp
.DS_Store
Nếu không dùng .dockerignore, Docker có thể gửi cả .git, node_modules, file log hoặc file secret vào build context. Điều này làm build chậm và có thể gây leak dữ liệu.
Multi-stage build
Multi-stage build giúp tách môi trường build và môi trường runtime. Docker docs có tài liệu riêng về multi-stage builds.6
Ví dụ Go app:
FROM golang:1.23-alpine AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o /out/app ./cmd/api
FROM alpine:3.20
RUN adduser -D appuser
USER appuser
COPY --from=builder /out/app /app
ENTRYPOINT ["/app"]
Lợi ích:
- image runtime nhỏ hơn;
- không mang compiler/build tools vào production image;
- giảm attack surface;
- build rõ ràng hơn;
- dễ scan hơn.
Docker Compose là gì?
Docker Compose dùng file YAML để định nghĩa và chạy nhiều container cùng nhau. Docker Docs mô tả Compose là công cụ giúp định nghĩa và chạy multi-container Docker applications.7
Ví dụ:
services:
api:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://app:pass@db:5432/app
depends_on:
- db
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
pgdata:
Dùng Compose khi:
- chạy local dev stack;
- demo app;
- integration test;
- chạy app nhỏ trên một server;
- mô phỏng service dependencies.
Không nên xem Compose là thay thế đầy đủ cho Kubernetes nếu cần rolling update, autoscaling, multi-node scheduling, self-healing phức tạp hoặc policy control lớn.
Volume: đừng lưu database trong container layer
Container filesystem có thể bị xóa khi container bị recreate. Với dữ liệu bền vững, dùng volume.
Ví dụ:
docker volume create pgdata
docker run -d \
--name postgres \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16-alpine
Quy tắc:
- database dùng volume;
- upload/user files dùng volume/object storage;
- backup volume định kỳ;
- không giả định container layer là storage bền vững;
- không lưu secret plaintext trong volume nếu chưa có kiểm soát.
Network trong Docker
Container có thể giao tiếp qua Docker network.
Ví dụ tạo network:
docker network create appnet
docker run -d --name db --network appnet postgres:16-alpine
docker run -d --name api --network appnet -p 3000:3000 my-api:latest
Trong cùng network, api có thể gọi db bằng hostname db.
Lưu ý:
- chỉ publish port cần thiết ra host;
- database local không nhất thiết publish ra
0.0.0.0; - tách network cho service nhạy cảm;
- dùng firewall/security group ở môi trường server/cloud;
- trong Kubernetes, dùng NetworkPolicy thay vì chỉ dựa vào Docker network.
Registry và tag
Registry là nơi lưu image. Docker Hub là registry công khai phổ biến, nhưng production thường dùng private registry.
Tag ví dụ:
myapp:latest
myapp:1.4.2
myapp:2026-06-05-a1b2c3
myapp@sha256:...
Khuyến nghị:
- không dùng
latestcho production; - dùng version rõ hoặc Git SHA;
- pin digest cho môi trường quan trọng;
- scan image trước khi push/promote;
- dùng registry access control;
- xóa image cũ theo retention policy;
- ký image nếu cần supply chain security.
Docker Security: các nguyên tắc chính
Docker Docs có mục riêng về Docker Engine security.8 Một số nguyên tắc thực tế:
1. Không chạy container bằng root nếu không cần
RUN adduser -D appuser
USER appuser
2. Drop capabilities
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp
3. Read-only filesystem
docker run --read-only myapp
Nếu app cần ghi tạm, mount tmpfs:
docker run --read-only --tmpfs /tmp myapp
4. Giới hạn tài nguyên
docker run --memory=512m --cpus=1.0 myapp
5. Không mount Docker socket vào container
Rất nguy hiểm:
-v /var/run/docker.sock:/var/run/docker.sock
Container có Docker socket gần như có quyền điều khiển host Docker daemon.
6. Không chạy privileged
Tránh:
docker run --privileged ...
Chỉ dùng khi thật sự hiểu rủi ro.
Image security
Checklist:
- dùng base image chính thức hoặc nguồn tin cậy;
- dùng image nhỏ như alpine/distroless khi phù hợp;
- cập nhật base image định kỳ;
- scan CVE bằng Docker Scout/Trivy/Grype;
- không để secret trong image layer;
- dùng
.dockerignore; - dùng multi-stage build;
- chạy non-root;
- pin version;
- ký image bằng Cosign nếu cần;
- tạo SBOM bằng Syft hoặc Docker tooling phù hợp;
- không deploy image chưa scan vào production.
Docker Scout là nhóm tính năng Docker dùng để phân tích image, dependency, CVE và policy.9
Secrets trong Docker
Không nên đưa secrets vào Dockerfile:
ENV API_KEY=secret
RUN echo "password=secret" > /app/config
Vì chúng có thể nằm trong image history/layers.
Cách tốt hơn:
- dùng secret manager;
- inject secret qua runtime;
- dùng Docker/Compose secrets nếu phù hợp;
- dùng cloud secret manager trong production;
- không log secrets;
- rotate secret nếu lộ;
- scan repo và image để tìm secret.
Ví dụ Compose secrets:
services:
api:
image: my-api
secrets:
- db_password
secrets:
db_password:
file: ./db_password.txt
Docker và Kubernetes khác nhau thế nào?
| Tiêu chí | Docker | Kubernetes |
|---|---|---|
| Mục tiêu chính | build/run container, local dev, image workflow | orchestrate container trên cluster |
| Quy mô | một máy hoặc workflow build/dev | nhiều node, nhiều workload |
| Cấu hình | Dockerfile, Compose | YAML resources, Helm, Kustomize |
| Networking | Docker network | Service, Ingress, NetworkPolicy |
| Storage | Docker volume | PersistentVolume/PVC/StorageClass |
| Rollout | thủ công/Compose đơn giản | rolling update, rollback, probes |
| Self-healing | hạn chế | mạnh hơn |
| Autoscaling | không phải trọng tâm | HPA/VPA/Cluster Autoscaler |
Docker thường nằm ở lớp build/run local; Kubernetes nằm ở lớp orchestration production.
Docker và Podman khác nhau thế nào?
| Tiêu chí | Docker | Podman |
|---|---|---|
| Daemon | Docker dùng daemon dockerd | Podman daemonless theo thiết kế |
| Rootless | có hỗ trợ | rootless là điểm mạnh |
| CLI | docker | podman, tương thích nhiều lệnh Docker |
| Compose | Docker Compose phổ biến | có podman-compose hoặc Quadlet/systemd |
| Kubernetes YAML | không phải trọng tâm | có một số hỗ trợ liên quan pod/K8s |
| Hệ sinh thái | rất rộng | mạnh trong Linux/RHEL/Fedora |
Chọn Docker nếu muốn hệ sinh thái phổ biến, onboarding nhanh, Docker Desktop/Compose tốt. Chọn Podman nếu ưu tiên rootless Linux workflow hoặc môi trường enterprise Linux cụ thể.
CI/CD với Docker
Pipeline phổ biến:
Commit
↓
Run tests
↓
Build image
↓
Scan image
↓
Generate SBOM
↓
Sign image
↓
Push registry
↓
Deploy staging
↓
Promote production
Ví dụ build/tag:
docker build -t registry.example.com/myapp:2026-06-05-a1b2c3 .
docker push registry.example.com/myapp:2026-06-05-a1b2c3
Không nên build image production trực tiếp trên laptop developer. CI/CD nên là nơi build chính thức, có log, secret control và provenance.
Dockerfile best practices
Docker docs có tài liệu riêng về build best practices.10
Checklist:
- chọn base image tin cậy;
- pin version;
- dùng
.dockerignore; - tận dụng build cache;
- đặt lệnh ít thay đổi trước;
- dùng multi-stage build;
- không cài package thừa;
- không chạy root nếu có thể;
- không copy secret;
- dùng
COPYthay vìADDtrừ khi cần tính năng đặc biệt; - xóa cache package manager nếu cần;
- expose đúng port;
- healthcheck nếu phù hợp;
- scan image.
Ví dụ tốt hơn cho Node.js:
FROM node:22-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY . .
USER node
CMD ["node", "server.js"]
Container observability
Cần theo dõi:
- container restart count;
- CPU/memory;
- network I/O;
- disk usage;
- app logs;
- healthcheck;
- latency/error rate;
- image version;
- container exit code;
- OOMKilled;
- dependency status.
Trong production, không chỉ xem docker ps. Cần log aggregation, metrics, tracing và alert.
Roadmap 30/60/90 ngày
Ngày 1–30: học và chuẩn hóa local dev
- Viết Dockerfile cho 1 app.
- Thêm
.dockerignore. - Tạo Compose cho app + database.
- Chạy test trong container.
- Không chạy container bằng root nếu có thể.
- Không đưa secret vào image.
- Document lệnh build/run.
- Thêm image scan cơ bản.
- Dùng tag theo version/Git SHA.
Ngày 31–60: CI/CD và registry
- Build image trong CI/CD.
- Push vào private registry.
- Scan image trong pipeline.
- Tạo SBOM.
- Dùng multi-stage build.
- Thêm non-root user.
- Giới hạn image size.
- Không dùng
latestcho staging/prod. - Thêm secret scanning.
- Review Dockerfile bằng Hadolint.
Ngày 61–90: production hardening
- Ký image bằng Cosign nếu cần.
- Pin image digest.
- Runtime security flags: read-only, cap-drop, resource limits.
- Centralized logs/metrics.
- Backup volume.
- Vulnerability SLA.
- Base image update process.
- Policy chặn image chưa scan/ký.
- Nếu scale lớn, chuẩn bị Kubernetes hoặc orchestrator phù hợp.
- Incident playbook: secret leak trong image, CVE critical, registry compromise.
Sai lầm phổ biến
- Copy toàn bộ repo vào image, gồm
.gitvà.env. - Dùng image
latesttrong production. - Chạy container bằng root.
- Đưa secret vào Dockerfile.
- Không dùng
.dockerignore. - Image quá lớn vì chứa build tools.
- Không scan image.
- Không update base image.
- Mount Docker socket vào container.
- Chạy
--privilegedvì tiện. - Lưu database trong container layer.
- Không backup volume.
- Không đặt memory/CPU limit.
- Không hiểu khác biệt giữa image và container.
- Build production image thủ công trên laptop.
Tooling tham khảo
| Nhu cầu | Tool |
|---|---|
| Build/run container | Docker |
| Multi-container local dev | Docker Compose |
| Rootless/container alternative | Podman |
| Dockerfile lint | Hadolint |
| Image/CVE scanning | Docker Scout, Trivy, Grype |
| SBOM | Syft, Docker Scout |
| Image signing | Cosign/Sigstore |
| Supply chain framework | SLSA |
| Registry | Docker Hub, GHCR, ECR, GCR/Artifact Registry, ACR, Harbor |
| Orchestration | Kubernetes, Nomad, Docker Swarm |
| Observability | OpenTelemetry, Prometheus, Grafana, Loki |
FAQ
Docker là gì?
Docker là bộ công cụ để build, phân phối và chạy container. Docker giúp đóng gói app cùng dependency vào image, rồi chạy image đó thành container.
Container khác VM thế nào?
VM thường có kernel và OS riêng, còn container chia sẻ kernel với host và cô lập process/filesystem/network ở mức OS. Container thường nhẹ hơn, nhưng isolation không giống VM.
Docker image là gì?
Docker image là gói immutable chứa file, binary, library và config để chạy container. Docker Docs nói image là standardized package và được cấu thành từ layers.4
Dockerfile là gì?
Dockerfile là file mô tả cách build image, gồm các instruction như FROM, COPY, RUN, USER, EXPOSE, CMD.
Docker Compose là gì?
Docker Compose là công cụ định nghĩa và chạy multi-container apps bằng YAML, thường dùng cho local dev, test hoặc app nhỏ.7
Có nên dùng Docker cho production không?
Có thể, nhưng cần hardening: image scan, non-root, secret management, resource limit, logging, monitoring, registry control, backup volume và orchestration phù hợp. Với hệ thống lớn, Kubernetes thường phù hợp hơn.
Kết luận
Containerization giúp đóng gói ứng dụng nhất quán hơn giữa development, CI/CD và production. Docker là công cụ phổ biến nhất để build image, chạy container, dùng registry và thiết lập local multi-container app bằng Compose. Tuy nhiên, Docker không tự động đảm bảo bảo mật. Một Dockerfile sai có thể làm image lớn, leak secret, chạy root hoặc tăng attack surface.
Cách triển khai đúng là bắt đầu từ Dockerfile rõ ràng, .dockerignore, multi-stage build, image scan, non-root user và tag/version chuẩn. Sau đó đưa build vào CI/CD, tạo SBOM, ký image, kiểm soát registry, đặt resource limit, thu logs/metrics và chuẩn bị orchestration nếu cần scale. Làm tốt các bước này sẽ giúp Docker trở thành nền tảng ổn định cho DevOps hiện đại.
Nguồn tham khảo
Footnotes
-
Docker Docs image, Docker Desktop Images view. https://docs.docker.com/get-started/docker-concepts/the-basics/images/click-image.webp ↩
-
Docker Docs image, Docker Desktop search image. https://docs.docker.com/get-started/docker-concepts/the-basics/images/select-image.webp ↩
-
Docker Docs image, Docker image layers. https://docs.docker.com/get-started/docker-concepts/the-basics/images/image-layers.webp ↩
-
Docker Docs. “What is an image?” https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-an-image/ ↩ ↩2 ↩3
-
Docker Docs. “What is a container?” https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/ ↩
-
Docker Docs. “Multi-stage builds.” https://docs.docker.com/build/building/multi-stage/ ↩
-
Docker Docs. “Docker Compose.” https://docs.docker.com/compose/ ↩ ↩2
-
Docker Docs. “Docker Engine security.” https://docs.docker.com/engine/security/ ↩
-
Docker Docs. “Docker Scout.” https://docs.docker.com/scout/ ↩
-
Docker Docs. “Docker build best practices.” https://docs.docker.com/build/building/best-practices/ ↩
Được biên soạn bởi PixelRouter Editorial Team
Chúng tôi cung cấp các bài viết chuyên sâu và chính xác về hạ tầng AI, bảo mật API, quản lý tài chính đám mây và tối ưu hóa hệ thống cho nhà phát triển.
Câu hỏi thường gặp
Docker là gì?
Docker là bộ công cụ để build, phân phối và chạy container. Docker giúp đóng gói ứng dụng cùng dependency vào image, rồi chạy image đó thành container.
Containerization là gì?
Containerization là cách đóng gói ứng dụng cùng dependency, runtime, thư viện và cấu hình cần thiết vào một đơn vị chạy độc lập gọi là container, giúp ứng dụng chạy nhất quán hơn giữa máy developer, CI/CD, staging và production.
Container khác VM như thế nào?
VM thường có kernel và hệ điều hành riêng, còn container chia sẻ kernel với host và cô lập process, filesystem, network ở mức hệ điều hành. Container thường nhẹ hơn VM, nhưng mức isolation không giống VM.
Docker image là gì?
Docker image là gói immutable chứa file, binary, library và cấu hình để chạy container. Image được cấu thành từ nhiều layer.
Dockerfile là gì?
Dockerfile là file mô tả cách build image, gồm các instruction như FROM, COPY, RUN, USER, EXPOSE và CMD.
Docker Compose là gì?
Docker Compose là công cụ dùng file YAML để định nghĩa và chạy nhiều container cùng nhau, thường dùng cho local dev, demo app, integration test hoặc app nhỏ.
📂Bài liên quan
Hướng dẫn DevOps
Infrastructure as Code và GitOps là gì? Hướng dẫn Terraform, OpenTofu, Argo CD và Flux cho đội IT
Hướng dẫn dễ hiểu về Infrastructure as Code và GitOps: khái niệm IaC, Terraform, OpenTofu, state, plan/apply, module, drift, Argo CD, Flux, bảo mật secrets, policy-as-code, CI/CD và roadmap triển khai 90 ngày.
Hướng dẫn DevOps
Observability là gì? Hướng dẫn logs, metrics, traces, OpenTelemetry và SLO cho hệ thống IT
Hướng dẫn dễ hiểu về observability trong hệ thống IT: logs, metrics, traces, OpenTelemetry, Prometheus, Grafana, SLI/SLO, alerting, dashboard, incident response và roadmap triển khai 90 ngày.