Chuyển đến nội dung chính

Bài 3: Docker Images - Build, Pull và Quản lý

Tìm hiểu Docker images là gì, layer architecture, docker pull/push, quản lý images với docker images, tag, rmi, prune. Hiểu Docker Hub, official images và cách chọn base image phù hợp cho dự án.

🔒 DevSecOps — Bài 3 Bài 3: Docker Images - Build, Pull và Quản lý

Docker từ Cơ bản đến Nâng cao

Phần 1: Nền tảng Docker

xdev.asia

1. Docker Image là gì?

Docker image là một read-only template chứa tất cả những gì cần thiết để chạy ứng dụng: code, runtime, libraries, environment variables và configuration files. Image là "blueprint" để tạo containers.

Layer Architecture

Docker image được xây dựng từ nhiều layers xếp chồng lên nhau. Mỗi instruction trong Dockerfile tạo ra một layer mới:

┌─────────────────────────────────┐
│  Layer 4: COPY app.js /app/     │  ← Writable (Container layer)
├─────────────────────────────────┤
│  Layer 3: RUN npm install       │  ← Read-only
├─────────────────────────────────┤
│  Layer 2: RUN apt-get update    │  ← Read-only
├─────────────────────────────────┤
│  Layer 1: FROM ubuntu:22.04     │  ← Read-only (Base image)
└─────────────────────────────────┘

Ưu điểm của layer architecture:

  • Caching: Layers được cache, chỉ rebuild layers thay đổi

  • Sharing: Nhiều images có thể chia sẻ base layers → tiết kiệm disk

  • Efficiency: Pull image chỉ tải layers chưa có trên máy

2. Docker Hub và Official Images

Docker Hub là public registry lớn nhất, chứa hàng triệu images:

  • Official Images: Được Docker Inc. và maintainers xác nhận (nginx, postgres, node, python...)

  • Verified Publisher: Images từ các vendors đã được xác minh (bitnami, grafana...)

  • Community Images: Images do cộng đồng đóng góp

3. Các lệnh quản lý Images

3.1. Pull images

# Pull image mới nhất (latest tag)
docker pull nginx

Pull image với tag cụ thể

docker pull nginx:1.27-alpine docker pull postgres:16.4 docker pull node:20-slim

Pull từ registry khác

docker pull ghcr.io/owner/image:tag docker pull registry.example.com/myapp:v1.0

3.2. Liệt kê và tìm images

# Liệt kê tất cả images
docker images
docker image ls

Filter images

docker images --filter "dangling=true" # Images không có tag docker images --filter "reference=nginx" docker images --format "{{.Repository}}:{{.Tag}} - {{.Size}}"

Tìm image trên Docker Hub

docker search nginx docker search --filter "is-official=true" postgres

3.3. Tag images

# Tag image với tên mới
docker tag nginx:latest myregistry.com/nginx:v1.0
docker tag myapp:latest myapp:production

Image tagging strategies

Semantic versioning

docker tag myapp:latest myapp:1.0.0 docker tag myapp:latest myapp:1.0 docker tag myapp:latest myapp:1

Git commit hash

docker tag myapp:latest myapp:abc1234

Date-based

docker tag myapp:latest myapp:2026-03-30

3.4. Push images

# Login vào registry
docker login
docker login registry.example.com

Push image

docker push myregistry.com/nginx:v1.0

Push tất cả tags

docker push --all-tags myregistry.com/nginx

3.5. Xem chi tiết và lịch sử

# Xem chi tiết image
docker inspect nginx:latest

Xem lịch sử layers

docker history nginx:latest docker history --no-trunc nginx:latest

Xem manifest

docker manifest inspect nginx:latest

3.6. Xóa và cleanup

# Xóa image
docker rmi nginx:latest
docker image rm nginx:1.27

Xóa tất cả dangling images

docker image prune

Xóa tất cả unused images

docker image prune -a

Force xóa

docker rmi -f image_id

4. Chọn Base Image phù hợp

Base Image Kích thước Use case
ubuntu/debian ~77MB / ~124MB Khi cần đầy đủ package manager
alpine ~7MB Image nhỏ gọn, phù hợp production
slim ~80MB Cân bằng giữa kích thước và compatibility
distroless ~20MB Chỉ chứa app runtime, không có shell
scratch 0MB Cho static binaries (Go, Rust)
# So sánh kích thước
docker pull node:20          # ~1.1GB
docker pull node:20-slim     # ~240MB
docker pull node:20-alpine   # ~130MB

5. Build Image cơ bản với Dockerfile

# Dockerfile đơn giản cho Node.js app
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
# Build image
docker build -t myapp:1.0 .

# Build với build context khác
docker build -t myapp:1.0 -f Dockerfile.prod .

# Build với build args
docker build --build-arg NODE_ENV=production -t myapp:1.0 .

6. Save, Load, Export, Import

# Save image ra file tar (backup/transfer)
docker save -o nginx-backup.tar nginx:latest

Load image từ file tar

docker load -i nginx-backup.tar

Export container filesystem ra tar

docker export my-container -o container-fs.tar

Import từ tar thành image

docker import container-fs.tar myimage:imported

7. Tổng kết

Trong bài này, bạn đã nắm được:

  • Docker image layer architecture và cơ chế caching

  • Docker Hub, official images và verified publishers

  • Các lệnh quản lý images: pull, push, tag, rmi, prune

  • Cách chọn base image phù hợp (alpine, slim, distroless)

  • Build image cơ bản với Dockerfile

  • Save/load images để backup và transfer

Bài tiếp theo sẽ đi sâu vào vòng đời và quản lý Docker containers.