接下來幾天將會介紹所有映像檔有關的知識,從基礎的什麼是映像檔、建立自己的映像檔、映像檔的快取機制、多階段建置等等。
也會理解前幾天在啟動容器時,為何 --publish 80:80
右邊的 port 隨便改會沒辦法啟動,以及 DockerHub 該如何使用,並打造屬於自己的儲存庫。
什麼是映像檔?
首先當然要解釋一下什麼是映像檔,用最簡單的方式來說,就是 Docker 執行容器時的說明書並附上工具包的一個檔案。
映像檔本身都是透過一個叫做 Dockerfile 的檔案建造而成,而在 Dockerfile 中,我們可以一步一步的告訴 Docker,嘿!等等照著這些步驟去執行,中間有些套件工具是需要的,幫我在執行容器時一起放進去吧。
映像檔本身並不是一個作業系統,它只是單純在作業系統上的執行程序,這在 Day 11 容器與虛擬機 時就有詳細的解釋過。
它可以非常的迷你,小到只是一個檔案,像是 Golang 的應用程式在編譯完後就只是一個靜態的執行檔案;它也可以非常的巨大,像是完整的 Ubuntu 作業系統,或是 PHP 的執行環境等等。
所以記住這句話,映像檔就是 Docker 執行容器時的說明書並附上工具包的一個檔案。
從 DockerHub 開始認識映像檔
接下來會用使用到 DockerHub 的一些功能,並且看看這世界上最大的映像檔儲存庫裡面的官方映像檔。
首先登入之後,應該會到自己的個人頁面,新註冊的帳號應該是沒有任何屬於自己的映像檔,就像下圖一樣:

從上圖可以看到我自己個人的映像檔,以及最右邊有一個 Public 的字樣,就說明這些映像檔是可以被公開下載的。
接著在上面的搜尋框中搜尋 nginx 來看看吧!

可以在圖片中看到兩種截然不同的徽章,分別是 DOCKER OFFICIAL IMAGE
以及 VERIFIED PUBLISHER
,這邊分別說明一下差別在哪。
DOCKER OFFICIAL IMAGE
官方映像檔放置在 DockerHub 上,其目的是提供基本的作業系統 ( 例如 Ubuntu、CentOS ) 或服務 ( 例如 postgreSQL、redis 等等 ),希望可以作為大多數使用者的起點。
也為現在流行的程式語言提供類似平台即服務的概念,像是 Ruby、Golang、Node 等等,都有官方認可的映像檔。
同時也是 Dockerfile 的最佳實踐範本,提供非常清晰的說明,讓其他使用者在撰寫 Dockerfile 的時候有一個很好的參考,也確保了安全性以及更新的速度。
這非常重要,因為官方映像檔基本上就是 DockerHub 上最受歡迎的映像檔了。
而且 Docker 這間公司還專門贊助了一個團隊,負責審查和發佈官方映像檔的所有內容,這個團隊和服務本身的軟體開發者 ( 例如 Ubuntu 的開發團隊 )、安全專家以及開源的社區們共同合作。
雖然還是由服務本身的軟體開發者來維護他們的映像檔最好,但這畢竟沒有什麼約束的效力。
他們來幫忙維護官方映像檔比較像是一個互助的過程,這些官方的映像檔也都在 GitHub 上面公開,而且鼓勵大家都可以發 PR 或是參與討論。
VERIFIED PUBLISHER
為所有開發者提供官方的驗證,這些映像檔來自可信賴的來源,減少了從冒牌的儲存庫中拉取危險映像檔的風險。
基本上只要有這個徽章就是可信賴又安全的映像檔,也可以透過嚴格的安全審查和 DockerHub 官方申請這個徽章。
我該用哪一個?
這個答案很簡單,就是使用官方的映像檔,所有你想得到的服務基本上都有官方映像檔的版本,例如你今天需要 Redis 的服務好了,我們就去搜尋 Redis 看看。

可以看到有 DOCKER OFFICIAL IMAGE
的標示,直接用下去就對了,不用太擔心出問題。
官方的映像檔沒有前綴?
不知道透過剛剛的圖片有沒有發現,只要是官方的映像檔都沒有前綴耶,就只有單純的服務名稱而已!
那這個前綴代表什麼呢?代表的是你 DockerHub 的暱稱,也就是右上角的大頭貼旁邊的名字。
在後面我們會完全的解析映像檔的全名,其實他比你想像的還要冗長,只是在 DockerHub 的幫助下,看起來簡潔有力而已。
學會看官方映像檔的使用說明
這是我自己發現一件奇怪的事,大部分的 Web 工程師都會認真的看套件在 GitHub 的 README 使用說明,或是官方網站的文件。
但像我在剛開始使用映像檔的時候好像都只是 docker container run
而已,不知道為什麼 DockerHub 的使用說明常常被忽略,我自己真的很常忘記看,導致服務開不起來的時候才又回去認真看。
以剛剛搜尋完 Redis 的結果,我們點擊進入 Redis 的頁面,可以看到說明中會有 How to use this image 的小節,只要仔細閱讀觀看的話,都沒什麼太大的問題。

按照前幾天學過的指令,現在的你應該可以看得出來有些指令是之前就有教過的,例如 --name、-d ( --detach ) 、--network、--rm
都是!
結語
今天從 DockerHub 來看映像檔,明天將會先從介紹映像檔的標籤開始,雖然到現在都還沒有提過標籤,但其實在使用容器時,就已經出現過了!