我想到現在第十五天,大家應該都很熟悉,映像檔就是用來製造容器的東西,那究竟什麼是映像檔呢?那映像檔又是怎麼產生的?接下來我們會花個幾天圍繞在這上面。
那今天我們就先來講解,有點抽象又有點重要的容器媽媽:映像檔 Image。
在談到映像檔的細節之前,我們先用具體的事物來比喻映像檔。
我們可以把映像檔當作是一片光碟 ( 應該都有用過吧!? ),這個光碟可以讓我們安裝應用程式,當已安裝的應用程式被刪除後,可以再使用光碟安裝應用程式,正如同映像檔可以建立容器,容器刪掉後,再用映像檔建立容器。
所以映像檔可以說是容器的安裝檔。
那映像檔是如何構成的呢?
還記得第八天時,在 run 出一個容器時,出現以下的 log 嗎
> docker container run httpd
1. Unable to find image 'httpd:latest' locally
2. latest: Pulling from library/httpd
3. 4ee097f9a366: Already exists
4. 94662ba12854: Pull complete
5. 595a05b7c0ad: Pull complete
6. 03682c916abd: Pull complete
7. 7e88a38e211a: Pull complete
8. Digest: sha256:333f7bca9fb72248f301fd2ae4892b86d36cc2fdf4c6aa49a6700f27c8e06daf
9. Status: Downloaded newer image for httpd:latest
10. AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
11. AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
12. [Sun Sep 03 14:42:54.245510 2023] [mpm_event:notice] [pid 1:tid 281473761857568] AH00489: Apache/2.4.57 (Unix) configured -- resuming normal operations
13. [Sun Sep 03 14:42:54.259073 2023] [core:notice] [pid 1:tid 281473761857568] AH00094: Command line: 'httpd -D FOREGROUND'
其中第一行的 httpd:latest
是完整的映像檔名稱。
前面的 httpd
是 image name
,後面的 latest
是映像檔標籤 image tag
。
當我們在定義一個映像檔時,一定會定義一個屬於該映像檔的名字 name
,像是這幾天在練習用的 httpd
、 postgre_sql
,又或是 mysql
、 traefik
等等,這些都是映像檔的名字。
映像檔標籤就是針對同種映像檔進行分類時,所使用的標示。
為什麼我們需要針對映像檔進行分類?
因為映像檔會隨應用程式不斷更新,而不斷產生新的映像檔,如果我們想要保留舊的應用程式,也要有新的應用程式,就會使用 image tag
將同一種的應用程式映像檔分門別類。
像是 mysql:latest
、 mysql:8.0.34-debian
。
那映像檔到底是怎麼製造出來的? 它的構造又是什麼?
映像檔是透過 Dockerfile 定義出來的。 Dockerfile 是一個 yaml 格式的檔案,裡面定義了一個映像檔的組成方式。
之後我們會在寫一篇文章來細說 Dockerfile,這裡我們只要先簡單知道,Dockerfile 就是映像檔的模板,定義著映像檔的樣子,並可透過 Dockerfile 產生出映像檔。
這裡我們一樣用上面的 log 來說明映像層。
第 3 到 7 行,是抓取映像檔的過程。那一行一行是映像檔 httpd
的映像層們。
第 8 行,sha256 後面那串是透過映像檔的內容,所產生的固定長度的編碼,只要映像檔內容有變,這串編碼就會不一樣。
因為映像檔是由一層又一層的映像層堆疊所構成,所以下載時,也是一層又一層的抓取映像層,因此可以看到有好幾個 Pull。
映像檔 httpd
是由 4ee097f9a366
、 94662ba12854
、 595a05b7c0ad
、 03682c916abd
、 7e88a38e211a
構成。
然而第三行的 Already exists
是因為我之前有下載過這個映像檔,在我的 Docker 裡還存在 4ee097f9a366
這一層的快取,因此這一層只需要從快取裡抓就好,不需要再從 Repository 上下載下來,節省時間。
當我們使用映像檔建立容器時,會由 Docker 將他們組裝再一起以建立容器的檔案系統,所以容器裡的檔案系統,就是透過映像層逐一搭建而成的。
不知道大家會不會覺得有點抽象,這映像檔與映像層我也是花了不少時間才能吸收進腦子裡,稍微為今天的文章做個簡單的整理:
Dockerfile --生成--> 映像檔 --生成--> 容器
映像層 + 映像層 + 映像層 + 映像層 --堆疊在一起--> 映像檔
欸!! 這樣看起來,Dockerfile 是不是跟映像層有關係? 沒錯! 竟然被眼尖的你發現了! 之後會在 Dockerfile 的文章裡解釋。
明天我們會再繼續研究映像層,讓大家更清楚映像檔與映像層彼此之間的關係。
如果大家想要找到其他更多的映像檔,可以到 Docker hub 找,上面都有各式各樣官方釋出的映像檔。