2023 iT邦鐵人賽 Day 16 - 什麼是映像檔Image
前言
我想到現在第十五天,大家應該都很熟悉,映像檔就是用來製造容器的東西,那究竟什麼是映像檔呢?那映像檔又是怎麼產生的?接下來我們會花個幾天圍繞在這上面。
那今天我們就先來講解,有點抽象又有點重要的容器媽媽:映像檔 Image。
什麼是映像檔 Image
在談到映像檔的細節之前,我們先用具體的事物來比喻映像檔。
我們可以把映像檔當作是一片光碟 ( 應該都有用過吧!? ),這個光碟可以讓我們安裝應用程式,當已安裝的應用程式被刪除後,可以再使用光碟安裝應用程式,正如同映像檔可以建立容器,容器刪掉後,再用映像檔建立容器。
所以映像檔可以說是容器的安裝檔。
那映像檔是如何構成的呢?
映像檔名稱
還記得第八天時,在 run 出一個容器時,出現以下的 log 嗎
1 | > docker container run httpd |
其中第一行的 httpd:latest
是完整的映像檔名稱。
前面的 httpd
是 image name
,後面的 latest
是映像檔標籤 image tag
。
Image Name
當我們在定義一個映像檔時,一定會定義一個屬於該映像檔的名字 name
,像是這幾天在練習用的 httpd
、 postgre_sql
,又或是 mysql
、 traefik
等等,這些都是映像檔的名字。
Image Tag
映像檔標籤就是針對同種映像檔進行分類時,所使用的標示。
為什麼我們需要針對映像檔進行分類?
因為映像檔會隨應用程式不斷更新,而不斷產生新的映像檔,如果我們想要保留舊的應用程式,也要有新的應用程式,就會使用 image tag
將同一種的應用程式映像檔分門別類。
像是 mysql:latest
、 mysql:8.0.34-debian
。
映像檔生成與結構
那映像檔到底是怎麼製造出來的? 它的構造又是什麼?
Dockerfile
映像檔是透過 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 將他們組裝再一起以建立容器的檔案系統,所以容器裡的檔案系統,就是透過映像層逐一搭建而成的。
總結
不知道大家會不會覺得有點抽象,這映像檔與映像層我也是花了不少時間才能吸收進腦子裡,稍微為今天的文章做個簡單的整理:
1 | Dockerfile --生成--> 映像檔 --生成--> 容器 |
欸!! 這樣看起來,Dockerfile 是不是跟映像層有關係? 沒錯! 竟然被眼尖的你發現了! 之後會在 Dockerfile 的文章裡解釋。
明天我們會再繼續研究映像層,讓大家更清楚映像檔與映像層彼此之間的關係。
如果大家想要找到其他更多的映像檔,可以到 Docker hub 找,上面都有各式各樣官方釋出的映像檔。