Bạn có biết?
Khi bạn tải một ứng dụng từ App Store, bạn đang tải về một file cài đặt đã được đóng gói sẵn — chứa tất cả code, libraries và resources cần thiết. Docker Image cũng tương tự như vậy! Nó là một template chỉ đọc chứa mọi thứ cần thiết để chạy một ứng dụng: code, runtime, libraries, environment variables và config files.
Docker Image là gì?
Docker Image là một template bất biến (immutable template) dùng để tạo Docker container. Hiểu đơn giản:
- ✅ Image = bản thiết kế (blueprint) — chỉ đọc, không thay đổi
- ✅ Container = ngôi nhà được xây từ bản thiết kế — có thể tương tác
- ✅ Registry = kho lưu trữ bản thiết kế (Docker Hub, AWS ECR, v.v.)
Image hoạt động như thế nào?
Docker Image được xây dựng theo kiến trúc lớp (layered filesystem):
- Mỗi lệnh trong Dockerfile tạo ra một layer mới
- Các layer được chồng lên nhau như bánh xếp
- Layer nào đã tồn tại sẽ được reuse (cache) — tiết kiệm thời gian build
- Chỉ có layer trên cùng là writable khi container chạy
+---------------------------+
| Layer 4: COPY app.py | Ứng dụng của bạn
+---------------------------+
| Layer 3: RUN pip install | Dependencies
+---------------------------+
| Layer 2: COPY requirements| File config
+---------------------------+
| Layer 1: FROM python:3.11| Base image
+---------------------------+
Các lệnh cơ bản với Image
docker pull — Tải Image từ Registry
Tải một image từ Docker Hub về máy local:
# Tải image mới nhất
docker pull nginx
# Tải version cụ thể
docker pull nginx:1.25
# Tải từ registry khác
docker pull ghcr.io/owner/image:tag
docker images — Liệt kê Images
Xem tất cả images có trên máy:
# Liệt kê images
docker images
# Output:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# nginx latest a6bd71f48f68 2 days ago 187MB
# python 3.11 3c4e6cfb1e7f 1 week ago 912MB
# ubuntu 22.04 08d22c0ceb15 2 weeks ago 77.8MB
# Chỉ xem image IDs
docker images -q
# Xem image với digest (SHA256)
docker images --digests
docker tag — Đặt tag cho Image
Tạo alias (tag) cho image:
# Tag format: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag nginx:latest myapp/nginx:v1.0
# Tag để push lên registry riêng
docker tag myapp:latest registry.example.com/myapp:latest
docker rmi — Xóa Image
# Xóa image theo tên
docker rmi nginx:latest
# Xóa image theo ID
docker rmi a6bd71f48f68
# Xóa tất cả images không dùng
docker image prune
# Xóa TẤT CẢ images (cẩn thận!)
docker rmi $(docker images -q)
docker inspect — Xem chi tiết Image
# Xem thông tin chi tiết
docker inspect nginx:latest
# Xem environment variables
docker inspect --format='{{.Config.Env}}' nginx:latest
# Xem exposed ports
docker inspect --format='{{.Config.ExposedPorts}}' nginx:latest
Image Registry và Naming Convention
Cấu trúc tên Image
[registry_host[:port]/][namespace/]repository[:tag]
# Ví dụ:
nginx # Docker Hub, library namespace
nginx:1.25 # Docker Hub với tag cụ thể
myuser/myapp:v1.0 # Docker Hub, user namespace
ghcr.io/owner/image:latest # GitHub Container Registry
registry.example.com/app:prod # Private registry
Docker Hub — Registry phổ biến nhất
# Tìm image trên Docker Hub
docker search nginx
# Pull Official Image (được Docker verify)
docker pull nginx
# Pull User Image
docker pull bitnami/redis
Image Layers và Caching
Cách Docker cache layers
Docker sử dụng content-addressable storage — mỗi layer có một hash duy nhất:
# Xem history của image (các layers)
docker history nginx:latest
# Output:
# IMAGE CREATED CREATED BY SIZE
# a6bd71f48f68 2 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daem... 0B
# <missing> 2 days ago /bin/sh -c #(nop) EXPOSE 80 0B
# <missing> 2 days ago /bin/sh -c #(nop) COPY file:xxx in /docker... 1.24kB
# <missing> 2 days ago /bin/sh -c set -x && apt-get update ... 61.1MB
Tối ưu layer caching
# ❌ KHÔNG tối ưu — mỗi lần code đổi, cài lại tất cả dependencies
COPY . /app
RUN pip install -r requirements.txt
# ✅ TỐI ƯU — dependencies được cache nếu requirements.txt không đổi
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY . /app
Use Cases thực tế
1. Pull và chạy ứng dụng nhanh chóng
# Chỉ cần 1 lệnh để chạy web server
docker run -d -p 8080:80 nginx:1.25
# Kiểm tra đang chạy
curl http://localhost:8080
2. Chia sẻ image giữa các môi trường
# Build image trên máy dev
docker build -t myapp:v1.0 .
# Push lên registry
docker push myapp:v1.0
# Pull trên server production
docker pull myapp:v1.0
docker run -d myapp:v1.0
3. Version control cho ứng dụng
# Tag theo semantic version
docker tag myapp:latest myapp:1.0.0
docker tag myapp:latest myapp:1.0
docker tag myapp:latest myapp:1
# Rollback dễ dàng
docker run myapp:1.0.0 # Version cũ
4. Multi-platform images
# Build cho nhiều kiến trúc (ARM + AMD64)
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .
So sánh Image vs Container
| Tiêu chí | Image | Container |
|---|---|---|
| Bản chất | Template chỉ đọc | Instance đang chạy |
| Thay đổi | Immutable (bất biến) | Có thể thay đổi (ephemeral) |
| Lưu trữ | Registry (Docker Hub) | Local filesystem |
| Tạo từ | Dockerfile | Image |
| Ví dụ | Bản thiết kế nhà | Ngôi nhà đã xây |
Best Practices
- Sử dụng Official Images — Được Docker verify, cập nhật thường xuyên
- Pin version cụ thể — Dùng
nginx:1.25thay vìnginx:latest - Giảm số layers — Gộp các lệnh RUN khi có thể
- Sử dụng .dockerignore — Loại trừ file không cần thiết khi build
- Scan image định kỳ —
docker scout quickview nginx:latest - Multi-stage build — Giảm kích thước image cuối cùng
- Không chứa secrets trong image — Dùng environment variables hoặc Docker secrets
Bước tiếp theo
Bạn đã hiểu Docker Image là gì và cách sử dụng! Tiếp theo, hãy tìm hiểu cách quản lý vòng đời Container — tạo, start, stop, exec và monitor containers.
👉 Đọc tiếp: Docker Container: Quản lý vòng đời Container