Trong Docker, hai khái niệm Docker Image và Docker Layer đóng vai trò rất quan trọng để hiểu cách thức Docker hoạt động trong việc đóng gói và triển khai các ứng dụng. Mặc dù chúng có mối quan hệ chặt chẽ với nhau, nhưng vẫn có sự khác biệt rõ ràng về chức năng và vai trò của từng khái niệm. Bài viết này sẽ giúp bạn hiểu rõ sự khác biệt giữa Docker Image và Docker Layer, đồng thời giải thích cách chúng hoạt động cùng nhau để tạo ra môi trường container.
Docker Image là một tập hợp các tệp và hướng dẫn được Docker sử dụng để tạo ra Docker container. Nó là một bản mẫu (template) chỉ đọc, chứa mọi thứ cần thiết để chạy một ứng dụng, bao gồm hệ điều hành, mã nguồn, các tệp thư viện, biến môi trường, và các cài đặt cần thiết. Docker Image là điểm khởi đầu của mọi Docker container, vì container chính là một instance của image.
Mỗi Docker Image bao gồm:
Docker Image là các tệp chỉ đọc. Khi container được khởi động từ một image, Docker tạo ra một layer ghi đè (writeable layer) để chứa dữ liệu và thay đổi trong quá trình hoạt động của container.
Docker Layer (Lớp Docker) là một khái niệm liên quan trực tiếp đến Docker Image, vì mỗi Docker Image được tạo thành từ nhiều layer (lớp). Layer là các lớp file system đại diện cho từng phần của Docker Image. Mỗi lệnh trong Dockerfile (chẳng hạn như RUN
, COPY
, ADD
) tạo ra một layer mới. Layer giúp Docker tối ưu hóa quá trình xây dựng image và sử dụng lại dữ liệu.
Các layer có thể là:
Các layer được lưu trữ trong hệ thống dưới dạng các tệp chỉ đọc và có thể tái sử dụng. Điều này giúp Docker giảm thiểu dung lượng và thời gian cần thiết để xây dựng các image mới, vì các layer đã tồn tại có thể được dùng lại thay vì phải tạo lại từ đầu.
Giả sử bạn có một Dockerfile như sau:
FROM ubuntu:20.04 COPY . /app RUN apt-get update && apt-get install -y python3 CMD ["python3", "/app/app.py"]
Trong trường hợp này:
FROM ubuntu:20.04
tạo ra một Base Layer từ image Ubuntu 20.04.COPY . /app
tạo ra một Layer mới chứa các tệp được sao chép vào thư mục /app
.RUN apt-get update && apt-get install -y python3
tạo ra một Layer mới chứa các thay đổi liên quan đến cài đặt Python3.CMD
không tạo layer mới nhưng chỉ định lệnh sẽ được thực thi khi container khởi động.Mỗi lệnh FROM
, COPY
, RUN
tạo ra một Docker Layer mới. Docker có thể tái sử dụng các layer này trong các build sau nếu không có thay đổi ở các bước tương ứng.
Docker Image là một thực thể hoàn chỉnh và không thay đổi, chứa mọi thứ cần thiết để chạy container. Trong khi đó, Docker Layer là các phần cấu thành của Docker Image, được tạo ra từ mỗi lệnh trong Dockerfile. Docker Layer giúp Docker tối ưu hoá việc lưu trữ và xây dựng image bằng cách cho phép tái sử dụng các phần đã tồn tại. Hiểu rõ sự khác biệt giữa hai khái niệm này sẽ giúp bạn xây dựng và quản lý Docker Image hiệu quả hơn.