iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
自我挑戰組

淺嚐 Docker:新手莫慌、漫乘鯨魚系列 第 16

Day 16: 什麼是映像檔 Image

  • 分享至 

  • xImage
  •  

前言

我想到現在第十五天,大家應該都很熟悉,映像檔就是用來製造容器的東西,那究竟什麼是映像檔呢?那映像檔又是怎麼產生的?接下來我們會花個幾天圍繞在這上面。

那今天我們就先來講解,有點抽象又有點重要的容器媽媽:映像檔 Image。

什麼是映像檔 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 是完整的映像檔名稱。

前面的 httpdimage name,後面的 latest 是映像檔標籤 image tag

Image Name

當我們在定義一個映像檔時,一定會定義一個屬於該映像檔的名字 name ,像是這幾天在練習用的 httpdpostgre_sql ,又或是 mysqltraefik 等等,這些都是映像檔的名字。

Image Tag

映像檔標籤就是針對同種映像檔進行分類時,所使用的標示。

為什麼我們需要針對映像檔進行分類?

因為映像檔會隨應用程式不斷更新,而不斷產生新的映像檔,如果我們想要保留舊的應用程式,也要有新的應用程式,就會使用 image tag 將同一種的應用程式映像檔分門別類。

像是 mysql:latestmysql:8.0.34-debian

映像檔生成與結構

那映像檔到底是怎麼製造出來的? 它的構造又是什麼?

Dockerfile

映像檔是透過 Dockerfile 定義出來的。 Dockerfile 是一個 yaml 格式的檔案,裡面定義了一個映像檔的組成方式。

之後我們會在寫一篇文章來細說 Dockerfile,這裡我們只要先簡單知道,Dockerfile 就是映像檔的模板,定義著映像檔的樣子,並可透過 Dockerfile 產生出映像檔。

映像層

這裡我們一樣用上面的 log 來說明映像層。

第 3 到 7 行,是抓取映像檔的過程。那一行一行是映像檔 httpd 的映像層們。

第 8 行,sha256 後面那串是透過映像檔的內容,所產生的固定長度的編碼,只要映像檔內容有變,這串編碼就會不一樣。

因為映像檔是由一層又一層的映像層堆疊所構成,所以下載時,也是一層又一層的抓取映像層,因此可以看到有好幾個 Pull。

映像檔 httpd 是由 4ee097f9a36694662ba12854595a05b7c0ad03682c916abd7e88a38e211a 構成。

然而第三行的 Already exists 是因為我之前有下載過這個映像檔,在我的 Docker 裡還存在 4ee097f9a366 這一層的快取,因此這一層只需要從快取裡抓就好,不需要再從 Repository 上下載下來,節省時間。

當我們使用映像檔建立容器時,會由 Docker 將他們組裝再一起以建立容器的檔案系統,所以容器裡的檔案系統,就是透過映像層逐一搭建而成的。

總結

不知道大家會不會覺得有點抽象,這映像檔與映像層我也是花了不少時間才能吸收進腦子裡,稍微為今天的文章做個簡單的整理:

Dockerfile --生成--> 映像檔 --生成--> 容器

映像層 + 映像層 + 映像層 + 映像層 --堆疊在一起--> 映像檔

欸!! 這樣看起來,Dockerfile 是不是跟映像層有關係? 沒錯! 竟然被眼尖的你發現了! 之後會在 Dockerfile 的文章裡解釋。

明天我們會再繼續研究映像層,讓大家更清楚映像檔與映像層彼此之間的關係。

如果大家想要找到其他更多的映像檔,可以到 Docker hub 找,上面都有各式各樣官方釋出的映像檔。


上一篇
Day 15: 容器的資料儲存 - Volume 掛載
下一篇
Day 17: 這樣看映像層
系列文
淺嚐 Docker:新手莫慌、漫乘鯨魚30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言