

Docker Image là thành phần cốt lõi giúp đóng gói và triển khai ứng dụng nhất quán trong môi trường Docker. Thay vì phải cài đặt thủ công runtime, thư viện và dependency trên từng máy chủ, tất cả thành phần cần thiết có thể được đóng gói thành một Image để tạo và chạy Container.
Vậy Docker Image là gì, được cấu tạo như thế nào và khác gì Docker Container? Bài viết dưới đây sẽ làm rõ các khái niệm quan trọng này.
Docker Image là một gói phần mềm được chuẩn hóa chứa các file, binary, thư viện, dependency và cấu hình cần thiết để tạo và chạy Docker Container. Có thể hiểu Image giống như một bản đóng gói sẵn của môi trường ứng dụng, từ đó Docker có thể tạo ra một hoặc nhiều Container có cấu hình nhất quán.
Hai đặc điểm quan trọng của Docker Image là tính bất biến – immutable và cấu trúc nhiều lớp – layers. Sau khi một Image được tạo, nội dung Image không được sửa trực tiếp; khi cần thay đổi, một Image mới sẽ được build dựa trên những thay đổi đó.
Nhờ cơ chế này, cùng một Image có thể được sử dụng xuyên suốt quá trình phát triển, kiểm thử và triển khai production, hạn chế tình trạng môi trường chạy ứng dụng khác biệt giữa các hệ thống.

Docker Image không đơn thuần chỉ chứa source code. Tùy ứng dụng, Image có thể bao gồm nhiều thành phần cần thiết để Container hoạt động.
Một Image phổ biến có thể chứa:
Theo đặc tả OCI Image, một container image về cơ bản bao gồm Image Manifest, Image Configuration, các filesystem layer và có thể có Image Index để mô tả nhiều phiên bản Image dành cho các nền tảng khác nhau.
Người dùng Docker thông thường không cần thao tác trực tiếp với toàn bộ cấu trúc này. Docker Engine và các công cụ container sẽ xử lý chúng trong quá trình build, lưu trữ, truyền tải và chạy Image.
Để hiểu Docker Image, có thể hình dung quy trình cơ bản như sau:
Dockerfile → Build → Docker Image → Registry → Pull → Container
Quá trình thường diễn ra qua các bước:
Developer viết một Dockerfile mô tả cách tạo Image.
Dockerfile có thể quy định:
Ví dụ:
FROM nginx:alpine
COPY . /usr/share/nginx/htmlDockerfile trên sử dụng Nginx Alpine làm Base Image, sau đó copy nội dung ứng dụng vào thư mục phục vụ web của Nginx.
Image có thể được tạo bằng lệnh:
docker build -t my-web:v1 .Docker đọc Dockerfile và build Image dựa trên các instruction được khai báo. Dấu . cuối câu lệnh xác định build context mà Docker sử dụng để tìm Dockerfile và các file liên quan.
Sau khi build hoàn tất, Image có thể tồn tại trên máy local.
Để chia sẻ hoặc triển khai Image trên nhiều hệ thống, Image thường được đẩy lên Container Registry:
docker push username/my-web:v1Registry đóng vai trò là nơi tập trung để lưu trữ và phân phối Container Image.
Server khác có thể tải Image:
docker pull username/my-web:v1Docker sẽ tải những layer cần thiết về hệ thống.
Cuối cùng, Docker có thể tạo Container:
docker run -d username/my-web:v1Lúc này Image vẫn giữ vai trò như một mẫu đóng gói bất biến, còn Container là phiên bản có thể chạy của Image. Docker định nghĩa Container là một runnable instance of an image.
Docker Image không phải một file duy nhất theo nghĩa đơn giản mà được xây dựng từ nhiều thành phần liên kết với nhau.
Base Image là Image được sử dụng làm nền tảng để xây dựng Image mới.
Base Image có thể đã chứa hệ điều hành tối giản, runtime và một số thư viện cơ bản. Developer sau đó chỉ cần bổ sung source code và dependency riêng của ứng dụng.
Việc lựa chọn Base Image ảnh hưởng trực tiếp đến kích thước Image, thời gian download, dependency và bề mặt tấn công. Docker khuyến nghị lựa chọn Base Image từ nguồn tin cậy và ưu tiên Image nhỏ, phù hợp với đúng nhu cầu của ứng dụng.
Một trong những khái niệm quan trọng nhất của Docker Image là Image Layer.
Mỗi layer thể hiện một nhóm thay đổi của filesystem, chẳng hạn:
Các layer được xếp theo thứ tự để tạo thành filesystem hoàn chỉnh mà Container sử dụng. OCI Image Specification cũng quy định các layer được sắp xếp từ base layer trở lên theo đúng thứ tự áp dụng.
Ví dụ một Image có thể gồm:
Sau khi được tạo, các Image Layer mang tính immutable.
Image Configuration lưu các thông tin cần thiết để runtime biết cách sử dụng Image.
Chúng có thể bao gồm:
OCI định nghĩa Image Configuration dưới dạng cấu trúc JSON liên kết thông tin runtime với các filesystem layer của Image.
Image Manifest chứa thông tin tham chiếu đến:
Có thể hiểu Manifest giống như bản mô tả giúp Registry và Container Runtime xác định chính xác những thành phần tạo nên một Image.
Docker Image và Docker Container thường bị nhầm lẫn nhưng thực tế chúng đại diện cho hai trạng thái khác nhau.
Tiêu chí | Docker Image | Docker Container |
| Bản chất | Gói đóng gói ứng dụng | Instance được tạo từ Image |
| Trạng thái | Không trực tiếp chạy | Có thể chạy |
| Khả năng thay đổi | Immutable | Có trạng thái runtime |
| Vai trò | Template để tạo Container | Môi trường thực thi ứng dụng |
| Số lượng | Một Image | Một Image có thể tạo nhiều Container |
| Lệnh phổ biến | docker build | docker run |
Ba khái niệm này tạo thành một chuỗi liên tục:
Dockerfile → Docker Image → Docker Container
Thành phần | Dockerfile | Docker Image | Docker Container |
| Bản chất | File hướng dẫn | Gói ứng dụng | Instance chạy |
| Mục đích | Mô tả cách build | Đóng gói môi trường | Chạy ứng dụng |
| Được tạo từ | Developer viết | Dockerfile | Docker Image |
| Lệnh liên quan | docker build | docker image ls | docker run |
| Trạng thái | File text | Immutable | Runtime |
Docker Image có thể được lưu trên máy local, nhưng trong môi trường nhiều developer hoặc nhiều server, cần một nơi tập trung để phân phối Image.
Đó là nhiệm vụ của Container Registry.
Registry là hệ thống dùng để:
Docker Hub là một Container Registry phổ biến và là Registry mặc định trong nhiều thao tác Docker. Một Repository trên Docker Hub có thể chứa nhiều phiên bản Image được tổ chức bằng tag.
Ngoài Docker Hub, doanh nghiệp cũng có thể sử dụng Registry riêng hoặc các dịch vụ Container Registry khác.
Một số lệnh cơ bản khi quản lý Docker Image:
Lệnh | Công dụng |
| docker build | Build Image từ Dockerfile |
| docker image ls | Liệt kê Image trên máy |
| docker pull | Tải Image từ Registry |
| docker push | Đẩy Image lên Registry |
| docker image inspect | Xem thông tin chi tiết Image |
| docker image history | Xem lịch sử các layer |
| docker image tag | Tạo tag cho Image |
| docker rmi | Xóa Image |
| docker image prune | Xóa Image không còn sử dụng |
docker image inspect giúp xem thông tin chi tiết của Image, trong khi docker image history hiển thị lịch sử xây dựng Image và các bước đã tạo layer.
Khi cần dọn các Image không còn sử dụng, có thể dùng:
docker image pruneCần thận trọng với tùy chọn -a, vì nó có thể xóa tất cả Image không được Container nào tham chiếu.
Image quá lớn có thể làm tăng thời gian build, push, pull và triển khai. Một số nguyên tắc giúp tối ưu Docker Image gồm:
Không nên sử dụng Base Image chứa quá nhiều package không cần thiết. Image nhỏ giúp giảm kích thước dữ liệu và số lượng dependency đi kèm.
Multi-stage build cho phép tách môi trường build khỏi môi trường runtime.
Ví dụ, compiler và build tool có thể tồn tại ở stage đầu nhưng không cần xuất hiện trong production Image cuối cùng.
Cách làm này giúp giảm kích thước Image và hạn chế các thành phần không cần thiết trong môi trường chạy.

Sắp xếp Dockerfile hợp lý để những bước ít thay đổi xuất hiện trước, còn source code thường xuyên thay đổi nằm sau.
Điều này giúp Docker tái sử dụng nhiều layer cache hơn.
Password, API key, token hoặc private key không nên được hard-code hoặc copy trực tiếp vào Docker Image.
Image có thể được lưu trong Registry hoặc chia sẻ giữa nhiều hệ thống nên việc nhúng secret có thể tạo ra rủi ro bảo mật.
Base Image và dependency cần được cập nhật để nhận các bản sửa lỗi và bản vá bảo mật mới. Với môi trường production, Image cũng nên được kiểm tra vulnerability trước khi triển khai.
Docker Image được sử dụng rộng rãi trong các mô hình phát triển và vận hành ứng dụng hiện đại, chẳng hạn:
Điểm mạnh lớn nhất của Docker Image nằm ở khả năng đóng gói môi trường chạy ứng dụng thành một đơn vị có thể phân phối và tái sử dụng.
Thay vì phải chuẩn bị lại môi trường trên từng máy chủ, đội ngũ có thể build Image một lần, lưu trên Registry và triển khai cùng Image đó trên nhiều hệ thống.
Không. Docker Image là gói chứa các thành phần cần thiết để tạo Container, còn Container là instance có thể chạy của Image.
Có. Một Docker Image có thể được dùng để tạo nhiều Container độc lập.
Docker Image có tính immutable. Khi cần thay đổi nội dung, thông thường sẽ build một Image mới chứa các thay đổi tương ứng.
Image có thể được lưu trên máy local hoặc trên Container Registry như Docker Hub và các Registry private.
Docker Image là một dạng Container Image được sử dụng trong hệ sinh thái Docker. Các chuẩn OCI giúp định nghĩa định dạng Image theo hướng có thể tương tác giữa nhiều công cụ và Container Runtime khác nhau.
Docker Image là gói đóng gói chứa ứng dụng cùng những thành phần cần thiết để tạo và chạy Container. Cấu trúc layer giúp Image có khả năng tái sử dụng, cache và phân phối hiệu quả, trong khi Dockerfile giúp chuẩn hóa quá trình tạo Image.
Với doanh nghiệp cần xây dựng môi trường hạ tầng linh hoạt để phát triển và triển khai ứng dụng container, VNPT Cloud cung cấp hệ sinh thái hạ tầng điện toán đám mây giúp tối ưu tài nguyên, khả năng mở rộng và vận hành ứng dụng theo nhu cầu.
