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.

Xuất bản: 5 thg 6, 2026Cập nhật: 5 thg 6, 2026Thời gian đọc: 12 minLượt xem: 2
DockerContainerizationDockerfileDocker ComposeDocker SecurityCI/CD

💡Đ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.

Docker Desktop Images view
Docker Desktop Images view

Ả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

Docker Desktop search image
Docker Desktop search image

Ả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

Docker image layers trong Docker Desktop
Docker image layers trong Docker Desktop

Ả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 containerCông cụ orchestration hoàn chỉnh như Kubernetes
Cách đóng gói app và dependencyBảo mật tự động tuyệt đối
Có image, container, registry, volume, networkThay thế database backup
Hữu ích cho local dev và CI/CDBắt buộc dùng cho mọi app
Có Dockerfile và ComposeChỉ dành cho microservices
Có thể chạy trên Linux/Windows/macOSVM đầ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ệmGiải thích
Imagetemplate immutable chứa filesystem và metadata để tạo container
Containerinstance đang chạy từ image
Dockerfilefile hướng dẫn build image
Registrynơi lưu và phân phối image, ví dụ Docker Hub hoặc private registry
Layerlớp filesystem tạo bởi từng bước build
Volumenơi lưu data bền vững ngoài lifecycle container
Networkcơ chế container giao tiếp với nhau hoặc với host
Composecô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òngVai trò
FROMchọn base image
WORKDIRđặt thư mục làm việc
COPYcopy file vào image
RUNchạy lệnh lúc build image
USERchạy app bằng user không phải root
EXPOSEkhai báo port ứng dụng
CMDlệ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 latest cho 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íDockerKubernetes
Mục tiêu chínhbuild/run container, local dev, image workfloworchestrate container trên cluster
Quy mômột máy hoặc workflow build/devnhiều node, nhiều workload
Cấu hìnhDockerfile, ComposeYAML resources, Helm, Kustomize
NetworkingDocker networkService, Ingress, NetworkPolicy
StorageDocker volumePersistentVolume/PVC/StorageClass
Rolloutthủ công/Compose đơn giảnrolling update, rollback, probes
Self-healinghạn chếmạnh hơn
Autoscalingkhông phải trọng tâmHPA/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íDockerPodman
DaemonDocker dùng daemon dockerdPodman daemonless theo thiết kế
Rootlesscó hỗ trợrootless là điểm mạnh
CLIdockerpodman, tương thích nhiều lệnh Docker
ComposeDocker Compose phổ biếncó podman-compose hoặc Quadlet/systemd
Kubernetes YAMLkhông phải trọng tâmcó một số hỗ trợ liên quan pod/K8s
Hệ sinh tháirất rộngmạ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 COPY thay vì ADD trừ 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 latest cho 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 .git.env.
  • Dùng image latest trong 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 --privileged vì 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ầuTool
Build/run containerDocker
Multi-container local devDocker Compose
Rootless/container alternativePodman
Dockerfile lintHadolint
Image/CVE scanningDocker Scout, Trivy, Grype
SBOMSyft, Docker Scout
Image signingCosign/Sigstore
Supply chain frameworkSLSA
RegistryDocker Hub, GHCR, ECR, GCR/Artifact Registry, ACR, Harbor
OrchestrationKubernetes, Nomad, Docker Swarm
ObservabilityOpenTelemetry, 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

  1. Docker Docs image, Docker Desktop Images view. https://docs.docker.com/get-started/docker-concepts/the-basics/images/click-image.webp

  2. Docker Docs image, Docker Desktop search image. https://docs.docker.com/get-started/docker-concepts/the-basics/images/select-image.webp

  3. Docker Docs image, Docker image layers. https://docs.docker.com/get-started/docker-concepts/the-basics/images/image-layers.webp

  4. Docker Docs. “What is an image?” https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-an-image/ 2 3

  5. Docker Docs. “What is a container?” https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/

  6. Docker Docs. “Multi-stage builds.” https://docs.docker.com/build/building/multi-stage/

  7. Docker Docs. “Docker Compose.” https://docs.docker.com/compose/ 2

  8. Docker Docs. “Docker Engine security.” https://docs.docker.com/engine/security/

  9. Docker Docs. “Docker Scout.” https://docs.docker.com/scout/

  10. Docker Docs. “Docker build best practices.” https://docs.docker.com/build/building/best-practices/

PR

Đượ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ỏ.