【雲原生】Docker鏡像的構成與操作

 作者簡介:運維領域創作者,阿裡雲ACE認證高級工程師
✒️個人主頁:小鵬linux
格言:你未必出類拔萃,但一定與眾不同!
個人社區:小鵬linux歡迎您的加入!
系列專欄:
         階段一:windows基礎
         階段二:Linux基礎知識
         階段三:shell基礎+shell高級
         階段四:學會python,逆天改命
         階段五:Linux網絡服務
         階段六:集群原理及架構
         階段七:雲原生之Docker 
         階段八:雲原生之kubernetes(k8s)
         階段九:技能提升
 

目錄

1. 認識鏡像

1.1 Docker鏡像的概念與構成

1.2 Docker 組件的構建方式

2. 鏡像的操作

2.1 查看鏡像

2.2 獲取鏡像

2.3 創建鏡像

2.4 導入/導出鏡像

2.5 刪除鏡像

結束語


1. 認識鏡像 1.1 Docker鏡像的概念與構成

鏡像 是Docker 三核心概念中最重要的,自 Docker 誕生之日起鏡像就是相關社區最為熱門的關鍵詞。

Docker 運行容器前需要本地存在對應的鏡像,如果鏡像不存在, Docker 會嘗試先從默認鏡像倉庫下載(默認使用 Docker Hub公共註冊服務器中的倉庫),用戶也可以通過配置,使用自定義的鏡像倉庫

鏡像的最底層是一個啟動文件系統(bootfs)鏡像,bootfs 的上層鏡像叫做根鏡像,一般來說,根鏡像是一個操作系統,例如 Ubuntu、CentOS 等,用戶的鏡像必須構建於根鏡像之上,在根鏡像之上,用戶可以構建出各種各樣的其他鏡像。 從上面的介紹讀者可以看出,鏡像的本質其實就是一系列文件的集合,一層套一層的結構有點類似於 Git ,也有點類似於生活中的洋蔥裡面的樣子。

Doctor的鏡像基於聯合文件系統UFS(union FS)

讀取數據時相當於從頂層向下層俯視讀取。當前層有數據隻讀取到當前層的,如果當前層無數據或者當前層數據小於下層,則可以讀取到當前層數據和當前層與下層差異的數據。

Docker 鏡像運行之後變成容器(docker run)

鏡像命名規則:倉庫地址/用戶名/鏡像名:版本號

1.2 Docker 組件的構建方式

2. 鏡像的操作 2.1 查看鏡像

用戶可以通過 docker images 命令查看本地所有鏡像:

[root@localhost ~]# docker images#可以查看本地倉庫下所有的鏡像

[root@localhost ~]# docker images --no-trunc#可以顯示全部ID

各個選項說明:

  • REPOSITORY:表示鏡像的倉庫源

  • TAG:鏡像的標簽

  • IMAGE ID:鏡像ID

  • CREATED:鏡像創建時間

  • SIZE:鏡像大小

[namespace\ubuntu]:這種倉庫名稱由命名空間和實際的倉庫名組成,中間通過 \ 隔開。當開發者在 Docker Hub 上創建一個用戶時,用戶名就是默認的命名空間,這個命令空間是用來區分 Docker Hub 上註冊的不同用戶或者組織(類似於 GitHub 上用戶名的作用),如果讀者想將自己的鏡像上傳到 Docker Hub 上供別人使用,則必須指定命名空間,否則上傳會失敗。

[ubuntu]:這種隻有倉庫名,對於這種沒有命名空間的倉庫名,可以認為其屬於頂級命名空間,該空間的倉庫隻用於官方的鏡像,由 Docker 官方進行管理,但一般會授權給第三方進行開發維護。當然用戶自己創建的鏡像也可以使用這種命名方式,但是將無法上傳到 Docker Hub 上共享。

[hub.c.163.com/library/nginx]:這種指定 url 路徑的方式,一般用於非 Docker Hub 上的鏡像命名,例如一個第三方服務商提供的鏡像或者開發者自己搭建的鏡像中心,都可以使用這種命名方式命名。

使用 docker images 命令可以查看本地所有的鏡像,如果鏡像過多,可以通過通配符進行匹配:
[root@localhost ~]# docker images n*

如果需要查看鏡像的詳細信息,也可以通過 docker inspect 命令來查看

2.2 獲取鏡像

鏡像是運行容器的前提,官方的Docker Hub網站已經提供瞭數十萬個鏡像供大傢開放下載。

可以使用 docker [image] pu 命令直接從 Docker Hub 鏡像源來下載鏡像

該命今的格式為 docke [image] pull NAME [ TAG]

其中 IMAGE_NAME 表示的是鏡像的名稱,而 TAG 是鏡像的標簽,也就是說我們需要通過 “鏡像 + 標簽” 的方式來下載鏡像。

註意:大傢也可以不顯式地指定 TAG, 它會默認下載 latest 標簽,也就是下載倉庫中最新版本的鏡像。這裡並不推薦下載 latest 標簽,因為該鏡像的內容會跟蹤鏡像的最新版本,並隨之變化,所以它是不穩定的。在生產環境中,可能會出現莫名其妙的 bug, 推薦最好還是指定具體的 TAG
[root@localhost ~]# docker search nginx#隻能查看鏡像名,看不到版本號。

搜索結果的參數如下:

  • NAME:表示鏡像的名稱。

  • DESCRIPTION:表示鏡像的簡要描述。

  • STARS:表示用戶對鏡像的評分,評分越高越可以放心使用。

  • OFFICIAL:是否為官方鏡像。

  • AUTOMATED:是否使用瞭自動構建。

瀏覽器搜素https://c.163yun.com/hub#/home網易官方鏡像,登錄,點擊鏡像倉庫,點擊鏡像中心,搜素centos,點擊public/centos,點擊版本,復制下載地址。hub.c.163.com/public/centos:6.7-tools

[root@localhost ~]# docker pull hub.c.163.com/public/centos:7.2-tools#將版本號修改為需要的版本號用docker pull命令下載即可。
下載完成後,我們就可以使用這個鏡像瞭。
[root@localhost ~]# docker run -itd -name 163nginx -p 80:80 hub.c.163.com/library/ngxin:latest

2.3 創建鏡像

docker build是構建鏡像用到的重要命令。從docker build的幫助信息中看到,build這 個子命令的功能非常強大。通過豐富的參數設置,可以控制鏡像構建的各項細節。

常用的參數如下。

  • -с:控制CPU使用。

  • -f:選擇Dockerfile名稱。 ,

  • -m:設置構建內存上限。

  • -q:不顯示構建過程的ー些信息。

  • -t:為構建的鏡像打上標簽。

構建鏡像的基本命令格式是:

[root@localhost ~]# docker build -t user_name/image_name .

其中命令後面的小數點符號不能省略,它表示當前目錄的Dockerfile文件。Docker鏡像構建是 講究上下文的,因此不能把Dockerfile亂放,關於build的詳細用法在下ー篇博文結合Dockerfile講解。

除瞭使用docker build構建鏡像,還可以使用docker commit提交鏡像。docker commit 會把容器提交打包為鏡像,這樣提交的鏡像會保存容器內的數據,而且第三方無法獲得鏡像的 Dockerfile,也就無法再構建一個完全一樣的鏡像出來,從這點看,並不推薦用戶使用docker commit 提交鏡像。

但是在某些時候,我們需要使用docker commit來保存容器狀態,這個時候我們還是需要使 用這個方法保存容器的。下面以ー個簡單的例子說明,首先啟動ー個容器:

[root@localhost ~]# docker run -d --name=test ubuntu

然後進入該容器內部,在工作目錄下新建一個test.txt文件,在裡面寫入內容:

[root@localhost ~]# docker exec -it test bashcontainer:echo "Text” > test.txt && exit

提交鏡像,鏡像名稱是usemame/test:

[root@localhost ~]# do-cker commit test username/test

再把剛オ提交的鏡像運行:

[root@localhost ~]# docker run -dit --rm username/test bashcontainer:cat test.txtcontainer:Text

可以看到:剛オtest容器新建的文件被保留下來瞭,usemame/test鏡像裡面包含瞭該文件

 commit的參數如下〇

  • -a:添加作者信息,方便維護。

  • -с:修改 Dockerfile 指令,目前支持的有 CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBUILD I USER | VOLUME | WORKDIR。

  • -m:類似git commit -m提交修改信息。

  • -p:暫停正在commit的操作。 

2.4 導入/導出鏡像

如果在兩臺主機之 間需要傳輸鏡像,ー個辦法就是把鏡像推送到倉庫,然後讓另一臺主機拉回來,但是這樣有個中轉, 不僅麻煩還不安全,有時候我們不希望鏡像發佈到互聯網中。而自己搭建私有鏡像倉庫顯然不是三 兩句命令就能搞定的,於是就需要一組可以導出/導入鏡像的命令瞭。

導出鏡像:使用docker save可以導出鏡像到本地文件系統:

[root@localhost ~]# docker save -о ubuntu.tar ubuntu[root@localhost ~]# ls[root@localhost ~]# ubuntu.tar

導入鏡像:使用docker load可以加載ー個導出的鏡像包到本地倉庫。

[root@localhost ~]# docker load -i ubuntu.tar
或者:
[root@localhost ~]# docker load < ubuntu.tar

導入鏡像時不必指定鏡像名稱。

2.5 刪除鏡像

鏡像可以通過 docker rmi 命令進行刪除,參數為鏡像的 id 或者鏡像名,參數可以有多個,多個參數之間用空格隔開。如下:
[root@localhost ~]# docker rmi 345342433 ngxin:latest

有的時候,無法刪除一個鏡像,大部分原因是因為該鏡像被一個容器所依賴,此時需要先刪除容器,然後就可以刪除鏡像瞭.

本地鏡像多瞭,有些不需要,我們當然想要刪除它們。刪除鏡像的命令是docker rmi,刪除 鏡像時不指定鏡像的tag則會默認刪除鏡像的latest標簽。可以在命令後面接上多個鏡像名稱,刪除多個鏡像。

使用docker rmi命令刪除鏡像時,要確保沒有容器使用該鏡像,也就是說,沒有容器是使用該 鏡像啟動的,オ可以刪除,否則會報錯。

刪除鏡像時可以使用鏡像的ID也可以使用鏡像名稱,docker rmi有一個參數-f,該參數可以強制刪除鏡像,即便有容器正在使用該鏡像。但是這樣隻會刪除鏡像標簽,不影響正在運行的容器, 實際上隻要容器還在運行,鏡像就不會被真正刪除,用戶可以使用docker commit操作提交容器來恢復鏡像。

刪除ー個鏡像(默認刪除latest標簽)

[root@localhost ~]# docker rmi hello-worldUntagged: hello-world:latest Deleted: sha256:c0ec52a519810bbabO06186fe5ecl07f477885601bl3b29f0blc940d03c2ac46 Deleted: sha256:f004cl7c62d27346bd7ad32afd616d6fl35ab7b7d67fa704906c3b6790133b5'9 #刪除ー個標簽 [root@localhost ~]# docker rmi ubuntu:'testUntagged: ubuntu:test

鏡像實際上是以ID為標準保存在Docker中的,即使鏡像沒有使用標簽,鏡像也是 可以存在的,出現這種情況的原因有很多,例如強制刪除瞭一個正在運行著容器的鏡像,又或者構 建的新鏡像的tag覆蓋瞭原來舊鏡像的tag等。

時間長瞭,我們沒有tag說明這些鏡像是什麼作用就會很難管理,所以我們需要刪除這些鏡像, 數量少時我們可以手動一條一條地刪除,數量多時我們可以配合Docker其他命令

刪除所有未打 dangling標簽的鏡像:

[root@localhost ~]# docker rmi $(docker images -q -f dangling=true)

刪除所有鏡像:

[root@localhost ~]# docker rmi $(docker images -q)

拓展:創建shanchu別名刪除所有容器:

[root@localhost ~]# vim /usr/local/bin/shanchu#創建文件,添加如下內容:#!/bin/bash/usr/bin/docker rm -f $(/usr/bin/docker ps -a -q)[root@localhost ~]# chmod a+x /usr/local/bin/shanchu[root@localhost ~]# shanchu                #即可刪除所有容器

結束語

本文來自網絡,不代表程式碼花園立場,如有侵權,請聯系管理員。https://www.codegarden.cn/article/31265/
返回顶部