Docker Certified Associate(DCA)認證考試學習-Docker Images Docker Certified Associate(DCA)認證相關資源、Docker Images

Published on Sunday, February 12, 2023

Docker Images

在第一篇的文章中: Docker Certified Associate(DCA)認證考試學習-準備環境 我們運行了以下命令

docker run hello-world

從字面上看只能知道我們請Docker運行一個叫做hello-world的東西,然後終端機就輸出文字了,那麼背後到底做了什麼呢?
先來讀看看docker run文檔,開頭就說明了此命令的用途

從image建立並執行成一個新的container

並且得出以下幾個重點

  • docker run 有一個必填項 IMAGE
  • docker 會在image之上建立一個可讀寫層
  • 可以使用docker api /containers/create/containers/(id)/start 也能達成同樣效果
  • 可以使用docker start 來執行停止狀態中的container
  • 可以使用docker ps -a 列出所有狀態的container

有了以上資訊我們現在瞭解hello-world就是一個image,
所以完整的動作就是我們請Docker透過使用名稱叫做hello-world的image建立一個新的container,如果找不到image就去網路上下載
那麼我們接下來到docker hub上看看hello-world image DCAImageBasic-dockerhub-helloworld

到docker hub一搜尋hello-world,怎麼出現這麼多結果而且名字也都是一樣,那麼docker是怎麼知道該下載哪一個image呢?
首先可以看出image有四種等級分類:

  • Docker Official Image #Docker官方推出的一系列Image,由官方維護
  • Verified Publisher #Docker官方認可的第三方Image,後續由各發布廠商維護
  • Sponsored OSS #Docker官方贊助的開源專案,後續由官方贊助的開源團隊進行維護
  • 無認證 #由一般使用者自行發布的Image

為什麼需要分這些等級呢?
是因為經常有駭客會自行發布惡意的image來誘騙使用者進行下載,如果不注意的話可能自己的主機會變成別人挖礦的節點
所以有著官方認可的image可以視為相對安全,我們一般使用者可以放心下載。

有了以上知識後可以辨別出image的名稱有兩種格式

  • hello-world
  • rancher/hello-world

這是因為某些常用的名稱為了避免重複,所以每個image發布前都要在名稱前加上自己的帳號,不過官方的帳號不再此限制之中

也就是說我們一開始運行的命令,其實呢就是暗指官方發布的image這樣就不會跟其他人發布的搞混了

docker run hello-world

接下來我們點進官方image看看有什麼內容 DCAImageBasic-helloworld-offical 主要有以下重點

  • docker pull 範例
  • docker Tags
  • 說明image裡面包了什麼內容

需要注意tag的部分,像我們上方的命令直接run hello-world,沒有指定版本預設會是抓最新latest版本

但這是不好的習慣,比較好的做法需要在image最後面明確指定tag,大部分的image都會使用tag作為發布版本的基準,所以要保持指定版本的習慣 例如以下範例我們去下載名為alpine的image

docker pull alpine:3.15
docker pull alpine:3.16
docker pull alpine:3.17

這個範例就是有指定版本,如果不指定版本直接使用預設最新latest版本,短時間可能不會有問題,但時間長了可能會有不相容的問題產生
假設現在最新latest版本的alpine是3.17,但是因為程式會一直改版所以幾個月後alpine可能就到了3.18
之後維護者會把latest版本會變成3.18,這時如果你有一些只兼容3.17的程式就會造成問題,所以指定版本是最好的做法

hello-world image Github

因為hello-world image是開源的所以我們可以上去Github大概看看 為甚麼運行之後終端機會輸出文字,看看它背後的原理是什麼Github

可以看到倉庫主要是根據架構做分類,但主要就兩個文件Dockerfilehello 在github上我們可以直接查看Dockerfile裡面的內容只有三行,hello為一個可執行檔

FROM scratch
COPY hello /
CMD ["/hello"]

從以上內容可以從字面上大概猜出意思

  • Dockerfile使用了scratch當底層
  • 然後複製hello執行檔到根目錄
  • 最後執行一段命令

也就是說底層可以想像是我們的電腦,然後我們從某個地方得到一個執行檔,最後運行此執行檔
這兩邊的行為應該會輸出同樣的結果才對,那我們來試試看 首先我們在play with docker建立一台機器,之後把倉庫clone下來

git clone https://github.com/docker-library/hello-world
cp hello-world/amd64/hello-world/hello /
/hello
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

確實跟預計的一樣終端機輸出了與container一樣的內容,所以可以把Dockerfile想像成一段腳本,其實跟我們手動操作並無兩樣


Summary

今天瞭解了docker hub該怎麼使用以及為甚麼要使用tags,並且大略瞭解Dockerfile的操作邏輯,之後幾篇再來詳細深入瞭解