
Bài 5: Tối ưu Docker image bằng multi-stage và distroless
Tách builder khỏi runtime, kiểm tra tương thích libc và native module; giảm thành phần không cần thiết mà không cam kết tỷ lệ dung lượng chưa đo.

Cài Docker Engine từ kho phù hợp, kiểm tra phiên bản và quyền truy cập; phân biệt lưu trữ containerd mới với overlay2 trên máy nâng cấp.
Đối chiếu ngày 24/10/2026. Các nguồn ở cuối bài dùng để kiểm tra phiên bản và giới hạn. Ví dụ phải điều chỉnh theo hệ điều hành và ứng dụng; không phải báo cáo thử nghiệm trên mọi nền tảng.
Docker Engine gồm daemon, CLI và runtime; kiến trúc này không chỉ bắt đầu từ Engine 26/27. Đối chiếu ngày 24/10/2026, release notes chính thức đã có Engine 29.9.2 ngày 20/10/2026. Các lệnh dưới lấy gói từ stable repository; kiểm tra phiên bản thực tế trước nâng cấp.

Kiểm tra gói xung đột trước khi thay kho. Máy có workload cần kiểm kê container, mount, network và backup đã phục hồi thử. Gỡ gói hoặc restart daemon có thể ngắt dịch vụ, không chạy remove hàng loạt khi chưa có kế hoạch.
# Chi Ubuntu; Debian can repository va huong dan rieng
sudo apt remove docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc
# Tren Rocky Linux / RHEL
rpm -qa | grep -E "docker|containerd|podman"
# Chi go goi xung dot sau khi ra soat workload va huong dan OS.
Ví dụ APT dùng keyring riêng với signed-by để giới hạn khóa cho repository. Đây là cách theo hướng dẫn nhà cung cấp, không phải kết luận mọi vị trí keyring khác đều không hợp lệ.
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Đối với hệ sinh thái Enterprise Linux, cài đặt kho lưu trữ RPM chính thức của Docker:
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Mặc định, Docker daemon chỉ cho phép kết nối qua UNIX domain socket thuộc quyền sở hữu của người dùng root. Để người dùng hiện tại có thể gõ lệnh docker mà không cần gõ sudo liên tục:
# Tao group docker neu chua co
getent group docker || sudo groupadd docker
# Them user hien tai vao group docker
sudo usermod -aG docker $USER
# Cap nhat phien lam viec ma khong can dang xuat
newgrp docker
Lưu ý bảo mật: Nhóm docker có quyền tương đương với quyền root trên máy chủ. Chỉ thêm những tài khoản quản trị viên đáng tin cậy vào nhóm này.
Để đảm bảo Docker vận hành ổn định trên máy chủ sản xuất, hạn chế tràn ổ cứng vì file log và đồng bộ với Systemd cgroups, hãy tạo file /etc/docker/daemon.json:
{
"log-driver": "local",
"live-restore": true
}
Hợp nhất phần cấu hình vào daemon.json hiện có, không ghi đè cả file. Driver local có rotation mặc định; đổi mặc định không đổi container đã tạo. Live restore có điều kiện, không thay kế hoạch bảo trì. Engine 29 cài mới dùng containerd image store; máy nâng cấp có thể vẫn dùng overlay2. Kiểm tra docker info, không ép storage-driver hoặc đổi backend máy đang chạy.
Khởi chạy và thiết lập dịch vụ Docker tự động kích hoạt cùng hệ điều hành:
sudo systemctl enable --now docker containerd
sudo systemctl status docker
Kiểm tra kết quả cài đặt và chạy container thử nghiệm mẫu:
# Kiem tra phien ban Engine, Buildx va Compose
docker version
docker compose version
# Chay container test hello-world
docker run --rm hello-world
Ubuntu, RHEL và Rocky không phải một đích cài đặt duy nhất. Rocky là bản tương thích RHEL nhưng cần kiểm tra kho, gói và hỗ trợ trên hệ thống cụ thể. RHEL có hướng dẫn repository RHEL riêng của Docker; không mặc định mọi RPM dùng URL CentOS.
docker version
docker info
apt-cache policy docker-ce
# Tren RPM: dnf list docker-ce --showduplicates
sudo dockerd --validate --config-file=/etc/docker/daemon.jsonChỉ restart trong cửa sổ bảo trì sau validate thành công. Giữ cấu hình cũ để phục hồi và kiểm tra workload sau restart. Nhóm docker có quyền mạnh tương đương root; rootless là lựa chọn riêng cần đánh giá.

Đọc đúng tài liệu theo phiên bản. Địa chỉ, tên và đường dẫn trong ví dụ cần thay theo môi trường. Sơ đồ là khái niệm, không phải screenshot hay benchmark.
Lưu cấu hình và digest cũ, kiểm tra backup phục hồi được, xác nhận endpoint và log sau thay đổi. Rollback phải tính đến dữ liệu đã ghi mới; đổi image không tự phục hồi database.
Đường repository Ubuntu ở trên không dùng cho Debian. Chọn phiên bản Ubuntu còn được hỗ trợ, kiểm tra kiến trúc CPU và fingerprint khóa theo tài liệu Docker. Với RHEL, dùng https://download.docker.com/linux/rhel/docker-ce.repo; phần URL CentOS chỉ là ví dụ cần xác minh cho bản phân phối tương thích, không phải bảo đảm hỗ trợ Rocky từ Docker.

Tách builder khỏi runtime, kiểm tra tương thích libc và native module; giảm thành phần không cần thiết mà không cam kết tỷ lệ dung lượng chưa đo.

Phân biệt tag và digest, save/load với export; chuẩn bị TLS, xác thực và quy trình garbage collection trước khi vận hành private registry.

Chọn nơi lưu dữ liệu, kiểm tra quyền UID/GID và phục hồi thử backup; phân biệt dữ liệu tạm với database cần sao lưu nhất quán theo ứng dụng.

Chọn driver theo phạm vi kết nối, dùng DNS mạng tự tạo và kiểm tra published port; phân biệt mạng Docker Swarm với mô hình CNI của Kubernetes.