iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
DevOps

現代化小白也要嘗試的容器手札系列 第 10

Day 10. Docker Images 深入探討

鬆獅容器小白10連拍

https://ithelp.ithome.com.tw/upload/images/20201005/20025481FzfEckLQp3.jpg

苦口婆心重聲容器映像檔是Docker重要元件服務之一

了解一個技術名詞,通常會需要先知道它對有甚麼用途,主要目的有以下兩點:

  • 從倉庫取得映像檔
  • 管理本地主機上的映像

從倉庫取得映像檔
Docker在執行容器前都需要本地端存在能對應的容器映像檔案,如果映像檔並不存在時,Docker便會從容器映像倉庫取出下載,預設是Docker Hub伺服器中的公用倉庫。主要來記錄一下針對映像檔這服務中需要用到的知識與工具指令,

可以使用docker pull指令從倉庫取出所需映像,以下示範是從Docker Hub倉庫下載一個CentOS作業系統映像檔。
而下載映像的過程中,會把取得映像的每一層訊息都輸出顯示。
該命令實際上相當於docker pull registry.hub.docker.com/ubuntu:latest 命令,即是從註冊伺服器registry.hub.docker.com 的倉庫中來下載標記為x.x版本的映像檔。
https://ithelp.ithome.com.tw/upload/images/20200917/20025481RFmhoKgGQj.png

進入CentOS容器中命令模式確認目前下載的版本的確是目前最新的8.2版
https://ithelp.ithome.com.tw/upload/images/20200917/20025481EcVd4VVdW4.png

docker run -it centos bash 同等於 docker run -t -i centos /bin/bash
目的是啟動一個bash終端才能與容器內本身進行操作互動,互動範例:檢視自身CentOS容器上所分配到的IP為何?
經查看後是172.17.0.3,另外也可以對外部如Google的DNS進行ping的測試確認。
https://ithelp.ithome.com.tw/upload/images/20200917/20025481UannAHwbzo.png

退出後回到Ubuntu宿主機器在檢視一下網路IP發現上述的容器是被分配在docker0的專屬網路上
https://ithelp.ithome.com.tw/upload/images/20200917/20025481AM8rLd9bAz.png

透過docker images來顯示本機是否已有的映像檔,如果已經有在容器執行時就不用再另外Pull可以直接執行。
下圖範例中訊息說明:

  • 來自哪個倉庫如:CentOS
  • 映像檔版本標記:如果有指定會顯示版本號,如果沒有指定一律抓取當前最新版本,以latest顯示
  • 映像檔ID:唯一碼
  • 建立時間
  • 映像檔大小

補充:TAG是用戶對於同個倉庫下不同映像檔的發行版本識別,如:6.0、6.5、7.1等...

https://ithelp.ithome.com.tw/upload/images/20200917/20025481XMjNoNptfm.png

修改已有映像檔
先使用下載的映像檔啟動容器,我們來試試在目前的CentOS上來安裝自己想要新增的套件。我就拿一個處理JSON是前端開發編程的工具:jq來嘗試到CentOS容器內安裝。
https://ithelp.ithome.com.tw/upload/images/20200918/20025481yKIxgQTIww.png
jq套件顯示安裝完成。
https://ithelp.ithome.com.tw/upload/images/20200918/20025481L6cxakbux9.png

docker commit -m "yum -y install jq" -a "Gary Docker update" 7e708c669f53 centos-jq

  • -m 是指提交的說明訊息就跟跟我們使用的版控一樣
  • -a 可以指定更新用戶訊息
  • ID 剛剛安裝程式後修改容器的ID
  • 最後自訂新映像檔名稱,當建立成功後會產生出新的映像檔ID

我們比對Commit前後的映像檔變化,除了增加了你剛剛的映像檔外在空間上也增加了約25MB。
https://ithelp.ithome.com.tw/upload/images/20200918/20025481vHMbzKvHQQ.png

我們在docker Run剛剛建立的centos-jq進入互動模式,並jq指令確認其版本與相關指令無誤,非常方便。
https://ithelp.ithome.com.tw/upload/images/20200918/200254810dF3mHAQaT.png

docker save -o centos-jq.tar centos-jq
這就是把剛剛建立好的映像檔想要備份到本機成一個檔案的做法
https://ithelp.ithome.com.tw/upload/images/20200918/20025481FZMZsxkil1.png

docker rmi centos-jq
docker rmi -f centos-jq
docker load --input centos-jq.tar
上述是備份檔案的概念,接下來模擬手殘移除映像,雖然明明有防呆了但還是依然故我,
好啦!就是要展現一下再恢復回來的能力,圖中顯示到從原來移除後又還原回來
https://ithelp.ithome.com.tw/upload/images/20200918/20025481s7ER0Eg0P5.png

最後腦補一下容器增量變更維護的呢?每個映像檔其實都是多層次來做構建,容器透過Union FS的檔案系統將各層整合到同個映像檔中。
通常Union FS有兩個作用:

  • 不透過LVM、RAID將多個磁碟掛到同個目錄下。
  • 另個常用就是將一個唯讀與寫入的分支整在一起,Live CD基於此方法允許在不改變映像檔的基礎上允許用戶進行寫入操作。

我剛剛是說人話嗎?我自己都無腦了,引用一下大大文件好了>>Linux UnionFS


上一篇
Day 9. 好奇心殺死貓,一探究竟Docker info
下一篇
Day11. 利用 Dockerfile 簡單撰寫自己的映像
系列文
現代化小白也要嘗試的容器手札30

尚未有邦友留言

立即登入留言