
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.

Đánh giá driver LAN trên Linux, giới hạn giao tiếp host–container và rủi ro plugin Hostnic; dùng lab riêng trước khi thay đổi mạng production.
Đố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.
Hostnic là plugin bên thứ ba của Yunify/QingCloud, không phải driver tích hợp trong Docker. README upstream mô tả luồng triển khai cũ và ghi thử với Docker 1.12. Điều đó không xác nhận tương thích Engine 29, kernel hoặc hạ tầng hiện tại. Bài này bỏ lệnh cài yunify/hostnic:latest kèm grant-all-permissions chưa được đối chiếu, đồng thời bỏ số throughput và CPU không có báo cáo thử nghiệm.
Nếu hệ thống cũ bắt buộc dùng Hostnic, kiểm kê repository, commit, binary, API plugin, quyền và NIC đang dùng. Chỉ thử sau khi có đường quản trị dự phòng và kế hoạch phục hồi. Không lấy README lịch sử làm cam kết plugin còn được duy trì hoặc đạt hiệu năng line-rate.

Macvlan chỉ áp dụng cho Linux host, không hỗ trợ Docker Desktop Windows/macOS. Nhiều cloud, Wi-Fi hoặc chính sách port security hạn chế underlay. IPvlan L3 không tự bảo đảm host giao tiếp trực tiếp với container trong mọi cấu hình. Trước khi chọn, xác định ai cần kết nối tới ai, cần L2 hay chỉ IP routing, và có yêu cầu cô lập nào.
Dùng NIC hoặc VLAN riêng. Không chọn NIC SSH làm parent trong lần thử đầu. Ghi interface, route, MTU, subnet, gateway, DHCP pool và port security; có console ngoài băng trước thay đổi ảnh hưởng mạng. Địa chỉ IP container phải được quản trị mạng cấp, loại khỏi DHCP để tránh trùng.
ip -br address
ip route
docker version
docker network ls
# Vi du su dung eth1: thay bang interface lab da xac minh.
Tạo network không tự cấu hình switch hoặc routing upstream. Một network tạo thành công chỉ chứng minh Docker chấp nhận tham số, không chứng minh máy ngoài truy cập được ứng dụng. Kiểm tra từng chặng thay vì đổi đồng thời nhiều tham số.
docker network create -d macvlan \
--subnet=192.0.2.0/24 \
--gateway=192.0.2.1 \
--ip-range=192.0.2.128/27 \
-o parent=eth1 docker_lan_lab
docker run --rm --network docker_lan_lab \
--ip 192.0.2.130 busybox:1.37 ip address
192.0.2.0/24 là dải địa chỉ tài liệu, phải thay bằng mạng lab thực. Docker IPAM không tự xin lease từ DHCP doanh nghiệp trong ví dụ này. Container in interface rồi kết thúc, không phải dịch vụ chờ ping. Nếu thử ứng dụng, chọn image đã kiểm tra và port listener phù hợp, rồi kiểm tra từ một máy LAN khác.
Linux macvlan mặc định không cho host nói trực tiếp với container qua parent theo cách nhiều người kỳ vọng. Nếu máy LAN khác truy cập được nhưng host không được, xem xét giới hạn này trước khi kết luận Docker hỏng. Kiểm tra ARP, VLAN và trùng IP; packet capture cần đúng interface và sự cho phép của đơn vị vận hành.
Nếu host cần truy cập container, thiết kế interface macvlan bổ sung hoặc mạng bridge thứ hai và route phù hợp. Đây là thay đổi mạng cần người quản trị xác minh, không phải lý do tắt firewall hoặc đổi default route để thử. Với ipvlan, đối chiếu mode L2/L3 và route trên mạng upstream, không chỉ cấu hình trong Docker.
docker network inspect docker_lan_lab
ip -s link show eth1
# Tu may lab khac: kiem tra ARP, route va cong ung dung.
So sánh trên cùng phần cứng, MTU, mã hóa, số kết nối và offload. Đo throughput, độ trễ phân vị, packet loss và CPU cả hai đầu; giữ lệnh, cấu hình và thời điểm để tái lập. Một phép đo iperf không đại diện toàn ứng dụng, và bỏ NAT không tự bảo đảm giảm latency trong mọi tình huống. Bài này không công bố benchmark đã thực hiện.
Xác nhận cả kết nối bình thường, mất node và restart trước khi triển khai dịch vụ thật. Khi kết thúc, dừng đúng container lab, xác nhận không còn endpoint rồi mới xóa docker_lan_lab. Không xóa parent NIC hoặc gỡ plugin của hệ thống đang chạy. Nếu mất kết nối, phục hồi cấu hình mạng đã lưu từ console quản trị.

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

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.

Tra trạng thái, đọc log, kiểm tra OOM và giới hạn tài nguyên; hiểu tác động của stop, restart và prune trước khi thao tác trên máy production.

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.