Lớp hình ảnh Docker là gì?

Sửa máy tính tại nhà TPHCM

Hình ảnh Docker bao gồm nhiều lớp cung cấp chung nội dung bạn thấy trong vùng chứa của mình. Nhưng lớp thực sự là gì và nó khác với một hình ảnh hoàn chỉnh như thế nào?

Bạn Đang Xem: Lớp hình ảnh Docker là gì?

Trong bài viết này, bạn sẽ học cách phân biệt hai khái niệm này và tại sao sự khác biệt lại quan trọng. Mặc dù bạn có thể sử dụng Docker mà không cần hiểu biết kỹ lưỡng về các lớp, nhưng có nhận thức về mục đích của chúng sẽ giúp bạn xác định các cơ hội tối ưu hóa.

Hình ảnh là gì?

Một “hình ảnh” của Docker hoạt động giống như một mẫu mà từ đó các vùng chứa nhất quán có thể được tạo. Nếu Docker là một máy ảo truyền thống, hình ảnh có thể được ví như ISO được sử dụng để cài đặt máy ảo của bạn. Đây không phải là một so sánh mạnh mẽ, vì Docker khác với các máy ảo về cả khái niệm và cách triển khai, nhưng dù sao thì đó cũng là một điểm khởi đầu hữu ích.

Hình ảnh xác định trạng thái hệ thống tệp ban đầu của các vùng chứa mới. Họ gói mã nguồn ứng dụng của bạn và các phần phụ thuộc của nó vào một gói độc lập sẵn sàng sử dụng với thời gian chạy vùng chứa. Trong hình ảnh, nội dung hệ thống tệp được biểu diễn dưới dạng nhiều lớp độc lập.

Lớp là gì?

Các lớp là kết quả của cách hình ảnh Docker được xây dựng. Mỗi bước trong Dockerfile tạo ra một “lớp” mới về cơ bản là sự khác biệt của các thay đổi hệ thống tệp kể từ bước cuối cùng. Hướng dẫn siêu dữ liệu chẳng hạn như LABELMAINTAINER không tạo các lớp vì chúng không ảnh hưởng đến hệ thống tệp.

Hình ảnh này có hai hướng dẫn (COPY RUN) vì vậy nó sẽ tạo ra hai lớp:

FROM ubuntu:latest
COPY foo.txt /foo.txt
RUN date > /built-on.txt
  • Bước đầu tiên sao chép foo.txt vào một lớp mới dựa trên ubuntu:latest hình ảnh.
  • Bước thứ hai chạy date lệnh và chuyển đầu ra của nó thành một tệp. Điều này tạo ra một lớp thứ hai dựa trên lớp trước đó.

Tạo ra foo.txt trong thư mục làm việc của bạn:

$ echo "Hello World" > foo.txt

Xem Thêm : Hiểu hướng dẫn Dockerfile VOLUME

Bây giờ xây dựng hình ảnh mẫu:

$ docker build . -t demo:latest
Sending build context to Docker daemon   2.56kB
Step 1/3 : FROM ubuntu:latest
 ---> df5de72bdb3b
Step 2/3 : COPY foo.txt /foo.txt
 ---> 4932aede6a15
Step 3/3 : RUN date > /built-on.txt
 ---> Running in 91d260fc2e68
Removing intermediate container 91d260fc2e68
 ---> 6f653c6a60fa
Successfully built 6f653c6a60fa
Successfully tagged foo:latest

Mỗi bước xây dựng sẽ phát ra ID của lớp đã tạo. Lớp của bước cuối cùng trở thành hình ảnh cuối cùng để nó được gắn thẻ foo:latest.

Trình tự cho thấy rằng các lớp là hình ảnh Docker hợp lệ. Mặc dù thuật ngữ “lớp” thường không được sử dụng để chỉ một hình ảnh được gắn thẻ, nhưng về mặt kỹ thuật, tất cả các hình ảnh được gắn thẻ chỉ là các lớp với một số nhận dạng được chỉ định.

Bạn có thể bắt đầu một vùng chứa từ hình ảnh của lớp trung gian:

$ docker run -it 4932aede6a15 sh
# cat /foo.txt
Hello World
# cat /built-on.txt
cat: /built-on.txt: No such file or directory

Ví dụ này bắt đầu một vùng chứa từ lớp được tạo bởi bước xây dựng thứ hai. foo.txt có sẵn trong thùng chứa nhưng built-on.txt không tồn tại vì nó không được thêm vào cho đến bước thứ ba. Tệp đó chỉ có sẵn trong hệ thống tệp của các lớp tiếp theo.

Vai trò của các lớp

Các lớp chứa các thay đổi được tạo bởi một bước xây dựng, liên quan đến lớp trước đó trong Dockerfile. FROM hướng dẫn là một trường hợp đặc biệt tham chiếu đến lớp cuối cùng của một hình ảnh hiện có.

Các lớp cho phép các bước xây dựng được lưu vào bộ nhớ đệm để tránh công việc thừa. Docker có thể bỏ qua các hướng dẫn không thay đổi trong Dockerfile của bạn bằng cách sử dụng lại lớp đã tạo trước đó. Nó căn cứ bước tiếp theo trên lớp hiện có đó, thay vì xây dựng một lớp mới.

Bạn có thể thấy điều này bằng cách sửa đổi Dockerfile của mình như sau:

FROM ubuntu:latest
COPY foo.txt /foo.txt
RUN date +%Y-%m-%d > /built-on.txt

Bước xây dựng thứ ba đã thay đổi. Bây giờ hãy xây dựng lại hình ảnh của bạn:

$ docker build . -t demo:latest
Sending build context to Docker daemon  3.584kB
Step 1/3 : FROM ubuntu:latest
 ---> df5de72bdb3b
Step 2/3 : COPY foo.txt /foo.txt
 ---> Using cache
 ---> 4932aede6a15
Step 3/3 : RUN date +%Y-%m-%d > /built-on.txt
 ---> Running in 2b91ec0462c4
Removing intermediate container 2b91ec0462c4
 ---> c6647ff378c1
Successfully built c6647ff378c1
Successfully tagged demo:latest

Xem Thêm : Không ai quan tâm đến nghệ thuật NFT đóng khung của tôi

Bước xây dựng thứ hai hiển thị như Using cache và tạo ra cùng một lớp ID. Docker có thể bỏ qua việc xây dựng lớp này vì nó đã được tạo trước đó và foo.txt không thay đổi kể từ lần xây dựng đầu tiên.

Bộ nhớ đệm này chỉ hoạt động cho đến khi một lớp được sửa đổi. Tất cả các bước sau lớp đó cũng sẽ cần được xây dựng lại để chúng dựa trên bản sửa đổi hệ thống tệp mới.

Các lớp và hoạt động kéo

Một lợi ích khác của các lớp là cách chúng cho phép kéo một phần hình ảnh. Khi bạn đã tải một vài hình ảnh xuống máy của mình, bạn thường thấy các lần kéo mới có thể bỏ qua một số lớp mà bạn đã có. Hình ảnh này chứa 13 lớp nhưng chỉ có sáu lớp được tải xuống bằng thao tác kéo:

docker pull php:8.0-apache
8.0-apache: Pulling from library/php
7a6db449b51b: Already exists 
ad2afdb99a9d: Already exists 
dbc5aa907229: Already exists 
82f252ab4ad1: Already exists 
bf5b34fc9894: Already exists 
6161651d3d95: Already exists 
cf2adf296ef1: Already exists 
f0d7c5221e44: Pull complete 
f647198f6316: Pull complete 
c37afe1da4e5: Pull complete 
09c93531cbca: Pull complete 
fef371007dd3: Pull complete 
52043dbb1c06: Pull complete 
Digest: sha256:429889e8f9eac0a806a005b0728a004303b0d49d77b09496d39158707abd6280
Status: Downloaded newer image for php:8.0-apache
docker.io/library/php:8.0-apache

Các lớp khác đã có trên máy chủ Docker nên chúng có thể được sử dụng lại. Điều này cải thiện hiệu suất và tránh lãng phí băng thông mạng.

Kiểm tra các lớp hình ảnh

Bạn có thể liệt kê các lớp trong một hình ảnh bằng cách chạy docker image history yêu cầu. Mỗi lớp hiển thị ID của hình ảnh đã tạo và lệnh Dockerfile đã gây ra thay đổi. Bạn cũng có thể xem tổng kích thước của nội dung trong lớp.

$ docker image history 
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
6f653c6a60fa   4 minutes ago   /bin/sh -c date > /built-on.txt                 29B       
f8420d1a96f3   4 minutes ago   /bin/sh -c #(nop) COPY file:a5630a7506b26a37...   0B        
df5de72bdb3b   4 weeks ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      4 weeks ago     /bin/sh -c #(nop) ADD file:396eeb65c8d737180...   77.8MB    

Lớp cuối cùng hiển thị là <missing> bởi vì nó đề cập đến một lớp trong ubuntu:latest hình ảnh cơ sở. Điều này không có sẵn cục bộ, vì chỉ lớp cuối cùng của hình ảnh cơ sở (df5de72bdb3b) được kéo xuống trong quá trình xây dựng. Không cần phải kéo tất cả các lớp trung gian một cách độc lập khi bạn muốn sử dụng một hình ảnh cụ thể.

Bản tóm tắt

Hình ảnh và lớp Docker nói chung là các thuật ngữ có thể hoán đổi cho nhau. Lớp là một hình ảnh và một hình ảnh được hình thành từ một hoặc nhiều lớp. Sự khác biệt chính nằm ở các thẻ: một hình ảnh sẽ được gắn thẻ và thiết kế cho người dùng cuối, trong khi thuật ngữ “lớp” thường đề cập đến các hình ảnh trung gian không được gắn thẻ được tạo ra như một phần của hoạt động xây dựng. Những thứ này sẽ không hiển thị trừ khi bạn đi tìm chúng.

Có một chủ đề khác liên quan đến các lớp: các vùng chứa đang chạy thêm một lớp bổ sung có thể ghi lên trên hình ảnh của chúng. Các lớp có nguồn từ hình ảnh của vùng chứa là chỉ đọc nên các sửa đổi hệ thống tệp do vùng chứa thực hiện sẽ nhắm mục tiêu đến lớp có thể ghi tạm thời của nó. Lớp có thể ghi sẽ bị loại bỏ khi vùng chứa bị dừng hoặc bị xóa.

dịch vụ cài win online từ xa

Nguồn: https://trungtamsuamaytinh.com
Danh mục: TIN HỌC

Vui lòng đánh giá về dịch vụ tại nhà