‫Được rồi, trong bài giảng này, chúng ta sẽ nói về các lớp hình ảnh.
‫Vì vậy, đây là một khái niệm cơ bản về cách Docker hoạt động. Nó sử dụng một cái gì đó được gọi là hệ
‫thống tệp liên hiệp để trình bày một loạt các thay đổi hệ thống tệp như một hệ thống tệp thực tế.
‫Chúng ta sẽ đi sâu vào lịch sử và kiểm tra các lệnh và xem cách chúng ta có thể sử dụng
‫chúng để hiểu hình ảnh thực sự được làm bằng gì. Chúng ta sẽ tìm hiểu một chút về khái niệm copy
‫on write về cách một vùng chứa chạy như một lớp bổ sung trên đầu một hình ảnh.
‫Ý tôi là gì bởi các lớp hình ảnh?
‫Nó thực sự minh bạch hoàn toàn đối với bạn khi bạn đang sử dụng Docker, nhưng khi bạn bắt đầu tìm
‫hiểu các lệnh nhất định, như lệnh history, kiểm tra và cam kết, bạn bắt đầu có cảm giác
‫rằng một hình ảnh không phải là một khối dữ liệu lớn. đến và đi trong một đoạn rất lớn.
‫Đúng?
‫Nếu bạn nhận thấy thời điểm chúng tôi thực sự kéo Docker, một số thời điểm nhất định bạn có thể thấy
‫các từ chỉ ra rằng có thứ gì đó mà bạn đã có, như bạn đã lưu vào bộ nhớ cache một
‫số phần của nó rồi và tất cả đều là do hình ảnh được thiết kế bằng cách sử dụng khái niệm hệ thống tệp liên minh về việc
‫tạo các lớp về những thay đổi.
‫Nếu chúng ta có thể nhanh chóng xem xét những gì chúng ta có trong Docker ... trong hình ảnh Docker thực sự ...
‫Một thời gian trước, chúng tôi đã chơi với các thẻ với Nginx. Đúng? Chúng tôi nhớ rằng ID hình
‫ảnh Nginx giống nhau và chúng tôi có các thẻ khác nhau cho cùng một tên hình ảnh.
‫Vì vậy, hãy thực hiện nhanh lịch sử docker trên nginx mới nhất.
‫Tôi đang nhìn gì ở đây?
‫Đây không phải là danh sách những điều đã thực sự xảy ra trong vùng chứa vì đây là về một hình ảnh.
‫Đây thực sự là lịch sử của các lớp hình ảnh.
‫Mọi hình ảnh đều bắt đầu từ đầu với một lớp trống được gọi là vết xước.
‫Sau đó, mọi tập hợp các thay đổi xảy ra sau đó trên hệ thống tệp, trong hình ảnh, là một lớp khác.
‫Bạn có thể có một lớp, bạn có thể có hàng chục lớp và một số lớp có thể không thay đổi
‫về kích thước tệp.
‫Bạn sẽ nhận thấy ở đây rằng chúng tôi thực sự có một thay đổi ở đây chỉ đơn giản là thay đổi siêu dữ liệu về
‫lệnh mà chúng tôi thực sự sẽ chạy. Chúng tôi sẽ đề cập đến vấn đề đó một chút khi
‫xem qua Dockerfile.
‫Tuy nhiên, hiện tại, bạn thực sự có thể thấy rằng cái này đã thêm một lượng lớn tệp 123MB.
‫Sau đó, chúng tôi đã thực hiện một thay đổi ở đây và một thay đổi ở đây và tôi tình cờ
‫biết được nhờ Dockerfiles rằng đây thực sự chỉ là thông tin siêu dữ liệu Dockerfile.
‫Khi bạn đi lên, chúng tôi có một số thay đổi dữ liệu khác.
‫Bạn sẽ thấy rằng điều này thực sự khá khác trong một hình ảnh khác.
‫Vì vậy, nếu chúng ta truy cập vào lịch sử docker mysql, nó có một tập hợp các lớp hình ảnh hoàn toàn khác.
‫Hãy để tôi vẽ cái này cho bạn một chút và có thể điều này sẽ hữu ích.
‫Khi chúng tôi bắt đầu một hình ảnh, khi chúng tôi
‫tạo một hình ảnh mới, chúng tôi bắt đầu với một lớp. Mỗi lớp đều có SHA duy nhất của riêng nó, giúp hệ thống xác định xem lớp đó
‫có thực sự giống với một lớp khác hay không.
‫Hãy chỉ nói rằng ở phần đầu của một trong số của bạn, bạn có thể có Ubuntu ở dưới cùng.
‫Đó là lớp đầu tiên trong hình ảnh của bạn.
‫Sau đó, bạn tạo một Dockerfile, tệp này thêm một số tệp khác và đó là một lớp khác trên
‫đầu hình ảnh đó. Có lẽ chúng tôi sử dụng Apt cho điều đó.
‫Sau đó, trong Dockerfile của bạn, bạn thực hiện một thay đổi biến môi trường. Đó là hình ảnh của bạn.
‫ĐƯỢC RỒI?
‫Bạn có thể có một hình ảnh khác bắt đầu từ debian: jessie và sau đó trên hình ảnh đó, bạn cũng
‫có thể sử dụng Apt để
‫cài đặt một số thứ, giả sử MySQL. Bạn có thể sao chép một số tệp, bạn có thể mở một cổng.
‫Vì vậy, mỗi một trong những thay đổi này mà bạn thường thực hiện trong Dockerfile, nhưng bạn cũng có thể thực
‫hiện bằng lệnh commit docker mà chúng tôi sẽ kiểm tra sau một phút.
‫Đây cũng là một hình ảnh khác và tất cả chúng được gộp lại với nhau.
‫Điều gì xảy ra nếu tôi có một hình ảnh khác cũng sử dụng cùng một phiên bản jessie?
‫Chà, hình ảnh đó có thể có những thay đổi riêng trên cùng
‫lớp mà tôi có trong bộ nhớ cache của mình. Đây là nơi mà khái niệm cơ bản về bộ nhớ cache của các lớp
‫hình ảnh giúp chúng ta tiết kiệm rất nhiều thời gian và không gian. Bởi vì chúng ta không cần tải xuống các lớp mà chúng
‫ta đã có và hãy nhớ rằng nó sử dụng SHA duy nhất cho mỗi lớp nên nó được đảm bảo
‫là lớp chính xác mà nó cần. Nó biết cách đối sánh chúng giữa Docker Hub và bộ nhớ cache cục bộ của chúng tôi. Khi chúng tôi thực hiện các
‫thay đổi đối với hình ảnh của mình, chúng sẽ tạo ra nhiều lớp hơn.
‫Nếu chúng tôi quyết định rằng chúng tôi muốn có cùng một hình ảnh làm hình ảnh cơ sở cho nhiều lớp hơn, thì nó
‫chỉ lưu trữ một bản sao của mỗi lớp.
‫Trong hệ thống này, thực sự, một trong những lợi ích lớn nhất là chúng tôi không bao giờ lưu trữ cùng một dữ liệu hình
‫ảnh nhiều lần trên hệ thống tệp của mình.
‫Điều đó cũng có nghĩa là khi chúng tôi tải lên và tải xuống, chúng tôi không
‫cần phải tải
‫lên và tải xuống cùng các lớp mà chúng tôi đã có ở phía bên kia. Nếu bạn có hình ảnh của riêng mình và do
‫bạn tự tạo hình ảnh tùy chỉnh, sau đó bạn thêm vào, giả sử, một máy chủ Apache ở trên cùng như một lớp
‫khác trong Dockerfile của bạn, và sau đó bạn phải mở cổng 80. Sau đó, cuối cùng, bạn thực sự yêu cầu nó sao chép trong mã nguồn nhưng cuối cùng bạn
‫thực sự có hai Dockerfiles khác nhau cho hai trang web khác nhau và mọi dòng trong Dockerfiles
‫đều giống nhau ngoại trừ đoạn cuối cùng mà bạn đã sao chép Trang web. A vào hình ảnh và sau đó là Trang
‫web B, bạn sẽ có hai hình ảnh. Chúng tôi sẽ hiển thị điều đó trong một phút. Cái này tạo nên một hình ảnh
‫và cái này tạo nên một hình ảnh, nhưng các tệp duy nhất thực sự được lưu trữ là cái này,
‫cái này, lớp này và sau đó là lớp nhỏ này và sau đó là lớp nhỏ này.
‫Vì vậy, chúng tôi không bao giờ lưu trữ toàn bộ chồng lớp hình ảnh nhiều lần nếu nó thực sự là các lớp giống nhau.
‫Làm thế nào điều này hoạt động với các thùng chứa?
‫Nếu bạn có hình ảnh của mình, giả sử chúng tôi có hình ảnh Apache của mình và chúng tôi quyết định chạy một
‫vùng chứa khỏi nó, tất cả những gì Docker làm là tạo một lớp đọc / ghi mới cho vùng chứa
‫đó trên đầu hình ảnh Apache đó. Khi chúng tôi xem xét hệ thống tệp và những thứ này, tất
‫cả các vùng chứa và hình ảnh đều trông giống như một hệ thống tệp thông thường, nhưng bên dưới trình điều khiển lưu trữ được Docker
‫sử dụng thực sự là phân lớp, giống như một chồng bánh kếp, tất cả những thay
‫đổi này trên đầu trang của nhau.
‫Vì vậy, nếu tôi chạy hai vùng chứa cùng một lúc trên cùng một hình ảnh Apache, vùng chứa 1 và vùng chứa 2 sẽ chỉ hiển
‫thị, về không gian tệp, chúng sẽ chỉ là sự khác biệt giữa những gì đã xảy ra trên
‫vùng chứa trực tiếp đang chạy đó và những gì đang diễn ra trong hình ảnh cơ sở, ở chế độ chỉ đọc.
‫Khi bạn đang chạy Vùng chứa và bạn đang thay đổi các tệp đi qua hình
‫ảnh, giả sử tôi đã bắt đầu vùng chứa 3 và tôi thực sự đã vào và thay đổi một tệp có trong hình ảnh này trong vùng
‫chứa đang chạy ...
‫điều này được gọi là copy-on-write.
‫Điều đó làm là hệ thống tệp sẽ lấy tệp đó ra khỏi hình ảnh và sao chép nó vào sự khác biệt này ...
‫trên này này... và lưu trữ một bản sao của tệp đó trong lớp vùng chứa.
‫Vì vậy, bây giờ vùng chứa thực sự chỉ là tiến trình đang
‫chạy và những tệp khác với chúng trong hình ảnh Apache.
‫Nếu chúng ta quay trở lại danh sách hình ảnh của mình và xem lại các lệnh này, và chúng ta nhìn
‫vào phần dưới cùng và xem ngày tháng khác nhau như thế nào? Chúng ta thực sự có thể thấy hình ảnh này đã được thay
‫đổi trong Docker Hub và được cập nhật theo thời gian, rằng những thay đổi này
‫không được thay đổi ở lớp dưới cùng trong bốn tuần và sau đó những thay đổi mới nhất đã diễn ra trong
‫hai tuần qua.
‫Nhân tiện, đừng lo lắng về phần bị thiếu.
‫Đó thực sự chỉ là một sự nhầm lẫn bên trong giao diện Docker.
‫Nó không có nghĩa là có gì đó sai hoặc nó bị định cấu hình sai. Điều đó có nghĩa là thực sự, hình ảnh mysql này
‫ngay tại đây là ID hình ảnh này.
‫Các lớp khác trong hình ảnh thực sự không phải là hình ảnh.
‫Chúng chỉ là các lớp bên trong hình ảnh này
‫và vì vậy chúng không nhất thiết phải có ID hình ảnh của riêng mình ở đó.
‫Cá nhân tôi nghĩ rằng có một chút sai lệch trong giao diện khi nói điều đó, nhưng đó là cách họ viết nó.
‫Vì vậy, bây giờ chúng ta đã hiểu về lệnh lịch sử để cho chúng ta
‫thấy một hình ảnh có thể được tạo ra như thế nào, hãy sử dụng lệnh kiểm tra.
‫Điều này làm là điều này cung cấp cho chúng tôi tất cả các chi tiết về hình ảnh.
‫Về cơ bản đây là siêu dữ liệu. Hãy nhớ khi chúng ta nói về một hình ảnh được
‫tạo thành từ hai phần, các tệp nhị phân và các phần phụ
‫thuộc của nó, và sau đó là siêu dữ liệu về hình ảnh đó? Chà, việc kiểm tra sẽ trả lại cho bạn siêu dữ liệu.
‫Bên cạnh chỉ thông tin cơ bản, như ID hình ảnh và các thẻ của nó, bạn sẽ nhận được tất cả các loại chi tiết về cách hình
‫ảnh này dự kiến sẽ được chạy.
‫Nó thực sự có tùy chọn để hiển thị hai cổng này bên trong hình ảnh để bạn biết khi nào bạn muốn khởi động
‫nó, cổng nào bạn cần mở bên trong máy chủ Docker của mình nếu bạn muốn nó chấp nhận kết nối.
‫Bạn thực sự có thể thấy rằng các biến môi trường đã được chuyển vào, bao gồm
‫cả phiên bản Nginx mà nó đang chạy và đường dẫn. Bạn thực sự có thể thấy lệnh nó sẽ chạy khi bạn khởi động hình
‫ảnh theo mặc định.
‫Một lần nữa, rất nhiều điều này thực sự có thể được thay đổi giống như chúng ta đã làm trước đó với lệnh
‫chạy bộ chứa docker.
‫Nhưng những điều này đang cho chúng ta thấy tất cả các giá trị mặc định và một số thông tin thú
‫vị khác như tác giả, và ở phía dưới đây, rằng đó là một kiến trúc của AMD64, khá giống với những gì mà tất cả các PC
‫và Mac thông thường chạy ngày nay.
‫Chúng tôi thực sự không có quá nhiều máy 32 bit, vì vậy đây chỉ là kiến trúc 64 bit
‫tiêu chuẩn của Intel và nó được thiết kế để chạy trên hệ điều hành Linux.
‫Ok, đánh giá nhanh.
‫Vì vậy, chúng tôi đã tìm hiểu rất nhiều về hình ảnh và cách chúng được tạo thành, và chúng
‫tôi phát hiện ra rằng chúng thực sự không phức tạp như vậy. Thực sự, chúng chỉ là một loạt các thay đổi trên hệ thống tệp và siêu dữ liệu về những thay đổi đó.
‫Bạn đã biết rằng mỗi lớp có danh tính duy nhất của riêng nó là SHA.
‫Chúng chỉ được lưu trữ một lần trên mỗi hệ thống, vì vậy trên mỗi daemon Docker, mỗi lớp chỉ được thể hiện một
‫lần trong hệ thống tệp.
‫Điều đó giúp chúng tôi tiết kiệm rất nhiều dung lượng cũng như thời gian chuyển tải hình ảnh qua lại giữa
‫các cơ quan đăng ký, như Docker Hub. Và, thực sự, khi bạn bắt đầu một
‫vùng chứa, nó chỉ là một lớp thay đổi duy nhất trên đầu một hình ảnh hiện có.
‫Vì vậy, nó thực sự thường rất nhỏ. Chúng tôi đã tìm hiểu về lịch sử và kiểm tra các lệnh cũng như cách chúng
‫có thể dạy chúng tôi những gì đang xảy ra bên trong một hình ảnh và cách nó được tạo ra.