<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Docker 鏡像詳細(xì)講解

          共 17196字,需瀏覽 35分鐘

           ·

          2022-07-26 15:20


          前言
          大家好,本文是對(duì) Docker 鏡像的詳細(xì)講解,講解了如何安裝 Docker、配置 Docker 鏡像加速以及操作 Docker 鏡像。希望對(duì)大家有所幫助~

          安裝 Docker
          1.1 CentOS
          Docker  要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 ,查看本頁面的前提條件來驗(yàn)證你的 CentOS 版本是否支持Docker 
          通過 uname -r 命令查看你當(dāng)前的內(nèi)核版本
          uname -r

          使用 root 權(quán)限登錄 CentOS。確保 yum 包更新到最新

          sudo yum update
          卸載舊版本(如果安裝過舊版本的話)
          sudo yum remove docker  docker-common docker-selinux docker-engine
          安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個(gè)是devicemapper驅(qū)動(dòng)依賴的
          sudo yum install -y yum-utils device-mapper-persistent-data lvm2

          設(shè)置yum源

          • 官方源
          sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
          • 阿里云源

          sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
          • 清華大學(xué)源

          sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
          安裝docker
          sudo yum install docker-ce
          也可以查看所有倉庫中所有docker版本,并選擇特定版本安裝
          yum list docker-ce --showduplicates | sort -rsudo yum install docker-ce-版本號(hào).ce
          啟動(dòng)并加入開機(jī)啟動(dòng)
          sudo systemctl start dockersudo systemctl enable docker
          驗(yàn)證安裝是否成功(有client和service兩部分表示docker安裝啟動(dòng)都成功了)
          docker version
          1.2 Ubuntu
          系統(tǒng)要求

          Docker CE 支持以下版本的 Ubuntu 操作系統(tǒng):

          • Artful 17.10 (Docker CE 17.11 Edge +)
          • Xenial 16.04 (LTS)
          • Trusty 14.04 (LTS)

          Docker CE 可以安裝在 64 位的 x86平臺(tái)或 ARM 平臺(tái)上。Ubuntu 發(fā)行版中,LTS(Long-Term-Support)長(zhǎng)期支持版本,會(huì)獲得 5 年的升級(jí)維護(hù)支持,這樣的版本會(huì)更穩(wěn)定,因此在生產(chǎn)環(huán)境中推薦使用 LTS 版本,當(dāng)前最新的 LTS 版本為 Ubuntu 16.04。

          卸載舊版本
          舊版本的 Docker 稱為 docker 或者 docker-engine,使用以下命令卸載舊版本:
          sudo apt-get remove docker \               docker-engine \               docker.io

          使用腳本自動(dòng)安裝

          在測(cè)試或開發(fā)環(huán)境中 Docker 官方為了簡(jiǎn)化安裝流程,提供了一套便捷的安裝腳本,Ubuntu 系統(tǒng)上可以使用這套安裝腳本:
          curl -fsSL get.docker.com -o get-docker.shsudo sh get-docker.sh --mirror AzureChinaCloud
          執(zhí)行這個(gè)命令后,腳本就會(huì)自動(dòng)的將一切準(zhǔn)備工作做好,并且把 Docker CE 的 Edge 版本安裝在系統(tǒng)中
          啟動(dòng) Docker CE
          sudo systemctl enable dockersudo systemctl start docker
          卸載 Docker
          • 先執(zhí)行命令:apt-get autoremove docker-ce

          • 刪除 /etc/apt/sources.list.d 目錄下的 docker.list 文件


          Docker 鏡像加速器

          國內(nèi)從 Docker Hub 拉取鏡像有時(shí)會(huì)遇到困難,此時(shí)可以配置鏡像加速器。Docker 官方和國內(nèi)很多云服務(wù)商都提供了國內(nèi)加速器服務(wù),例如:
          • Docker 官方提供的中國 registry mirror
          • 阿里云加速器
          • DaoCloud 加速器
          我們以Docker阿里云加速器為例進(jìn)行介紹。
          首先登錄阿里云(沒有賬號(hào)請(qǐng)先注冊(cè)),搜索 容器鏡像服務(wù),找到你的專屬加速器地址。
          地址:
          https://www.aliyun.com/
          2.1 Ubuntu 14.04、Debian 7 Wheezy
          對(duì)于使用 upstart 的系統(tǒng)而言,編輯 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址:
          DOCKER_OPTS="--registry-mirror=https://xxxxxxxx.mirror.aliyuncs.com"
          重新啟動(dòng)服務(wù)。
          sudo service docker restart
          2.2 Ubuntu 16.04+、Debian 8+、CentOS 7
          對(duì)于使用 systemd 的系統(tǒng),請(qǐng)?jiān)?/etc/docker/daemon.json 中寫入如下內(nèi)容(如果文件不存在請(qǐng)新建該文件)
          {  "registry-mirrors": [    "https://xxxxxxxx.mirror.aliyuncs.com"  ]}
          注意,一定要保證該文件符合 json 規(guī)范,否則 Docker 將不能啟動(dòng)。
          之后重新啟動(dòng)服務(wù)。
          sudo systemctl daemon-reloadsudo systemctl restart docker
          2.3 Windows 10
          對(duì)于使用 Windows 10 的系統(tǒng),在系統(tǒng)右下角托盤 Docker 圖標(biāo)內(nèi)右鍵菜單選擇 Settings ,打開配置窗口后左側(cè)導(dǎo)航菜單選擇 Daemon 。在 Registry mirrors 一欄中填寫加速器地址 https://registry.docker-cn.com ,之后點(diǎn)擊 Apply 保存后 Docker 就會(huì)重啟并應(yīng)用配置的鏡像地址了。
          2.4 macOS
          對(duì)于使用 macOS 的用戶,在任務(wù)欄點(diǎn)擊 Docker for mac 應(yīng)用圖標(biāo) -> Perferences... -> Daemon -> Registry mirrors。在列表中填寫加速器地址 https://registry.docker-cn.com 。修改完成之后,點(diǎn)擊 Apply & Restart 按鈕,Docker 就會(huì)重啟并應(yīng)用配置的鏡像地址了。
          2.5 檢查加速器是否生效
          配置加速器之后,如果拉取鏡像仍然十分緩慢,請(qǐng)手動(dòng)檢查加速器配置是否生效,在命令行執(zhí)行 docker info ,如果從結(jié)果中看到了如下內(nèi)容,說明配置成功。
          Registry Mirrors: https://xxxxxxxx.mirror.aliyuncs.com


          Docker 鏡像

          3.1 獲取鏡像
          之前提到過,Docker Hub 上有大量的高質(zhì)量的鏡像可以用,這里我們就說一下怎么獲取這些鏡像。
          從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull 。其命令格式為:
          docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/]倉庫名[:標(biāo)簽]
          具體的選項(xiàng)可以通過 docker pull --help 命令看到,這里我們說一下鏡像名稱的格式。
          • Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號(hào)] 。默認(rèn)地址是 Docker Hub。
          倉庫名:如之前所說,這里的倉庫名是兩段式名稱,即 <用戶名>/<軟件名> 。對(duì)于 Docker Hub ,如果不給出用戶名,則默認(rèn)為 library ,也就是官方鏡像。
          比如:
          $ docker pull ubuntu:16.0416.04: Pulling from library/ubuntu4f53fa4d2cf0: Pull complete 6af7c939e38e: Pull complete 903d0ffd64f6: Pull complete 04feeed388b7: Pull complete Digest: sha256:185fec2d6dbe9165f35e4a1136b4cf09363b328d4f850695393ca191aa1475fdStatus: Downloaded newer image for ubuntu:16.04docker.io/library/ubuntu:16.04
          上面的命令中沒有給出 Docker 鏡像倉庫地址,因此將會(huì)從 Docker Hub 獲取鏡像。而鏡像名稱是 ubuntu:16.04 ,因此將會(huì)獲取官方鏡像 library/ubuntu 倉庫中標(biāo)簽為 16.04 的鏡像。
          從下載過程中可以看到我們之前提及的分層存儲(chǔ)的概念,鏡像是由多層存儲(chǔ)所構(gòu)成。下載也是一層層的去下載,并非單一文件。下載過程中給出了每一層的 ID 的前 12 位。并且下載結(jié)束后,給出該鏡像完整的 sha256 的摘要,以確保下載一致性。
          在使用上面命令的時(shí)候,你可能會(huì)發(fā)現(xiàn),你所看到的層 ID 以及 sha256 的摘要和這里不一樣。這是因?yàn)楣俜界R像是一致在維護(hù)的,有任何新的 bug,或者版本更新,都會(huì)進(jìn)行修復(fù)再以原來的標(biāo)簽發(fā)布,這樣可有確保任何使用這個(gè)標(biāo)簽的用戶可以獲得更安全、更穩(wěn)定的鏡像。
          如果從 Docker Hub 下載鏡像非常緩慢,可以參照 鏡像加速器 一節(jié)配置加速器。
          3.1.1 運(yùn)行
          有了鏡像后,我們就能夠以這個(gè)鏡像為基礎(chǔ)啟動(dòng)并運(yùn)行一個(gè)容器。以上面的 ubuntu:16.04 為例,如果我們打算啟動(dòng)里面的 bash 并且進(jìn)行交互式操作的話,可以執(zhí)行下面的命令。
          $ docker run -it --rm \    ubuntu:16.04 \    bash
          root@e7009c6ce357:/# cat /etc/os-releaseNAME="Ubuntu"VERSION="16.04.4 LTS, Trusty Tahr"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu 16.04.4 LTS"VERSION_ID="16.04"HOME_URL="http://www.ubuntu.com/"SUPPORT_URL="http://help.ubuntu.com/"BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
          docker run 就是運(yùn)行容器的命令,我們這里簡(jiǎn)要的說明一下上面用到的參數(shù)。
          • it :這是兩個(gè)參數(shù),一個(gè)是 -i :交互式操作,一個(gè)是 -t 終端。我們這里打算進(jìn)入 bash 執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端。
          • --rm :這個(gè)參數(shù)是說容器退出后隨之將其刪除。默認(rèn)情況下,為了排障需求,退出的容器并不會(huì)立即刪除,除非手動(dòng) docker rm 。我們這里只是隨便執(zhí)行個(gè)命令,看看結(jié)果,不需要排障和保留結(jié)果,因此使用 --rm 可以避免浪費(fèi)空間。
          • ubuntu:16.04 :這是指用 ubuntu:16.04 鏡像為基礎(chǔ)來啟動(dòng)容器。
          • bash :放在鏡像名后的是命令,這里我們希望有個(gè)交互式 Shell,因此用的是 bash。
          進(jìn)入容器后,我們可以在 Shell 下操作,執(zhí)行任何所需的命令。這里,我們執(zhí)行了 cat /etc/os-release ,這是 Linux 常用的查看當(dāng)前系統(tǒng)版本的命令,從返回的結(jié)果可以看到容器內(nèi)是 Ubuntu 16.04.4 LTS 系統(tǒng)。
          最后們通過 exit 或者 Ctrl + D 退出了這個(gè)容器。
          3.2 列出鏡像
          要想列出已經(jīng)下載下來的鏡像,可以使用 docker image ls 命令。
          $ docker image lsREPOSITORY           TAG                 IMAGE ID            CREATED             SIZEredis                latest              5f515359c7f8        5 days ago          183 MBnginx                latest              05a60462f8ba        5 days ago          181 MBmongo                3.2                 fe9198c04d62        5 days ago          342 MB<none>               <none>              00285df0df87        5 days ago          342 MBubuntu               16.04               f753707788c5        4 weeks ago         127 MBubuntu               latest              f753707788c5        4 weeks ago         127 MBubuntu               14.04               1e0c3dd64ccd        4 weeks ago         188 MB
          列表包含了 倉庫名 、標(biāo)簽 、鏡像 ID 、創(chuàng)建時(shí)間 、以及 所占用的空間。
          其中倉庫名、標(biāo)簽在之前的基礎(chǔ)概念已經(jīng)介紹過了。鏡像 ID 則是鏡像的唯一標(biāo)識(shí),一個(gè)鏡像可以對(duì)應(yīng)多個(gè)標(biāo)簽。因此,在上面的例子中,我們可以看到 ubuntu:16.04 和 ubuntu:latest 擁有相同的 ID,因?yàn)樗鼈儗?duì)應(yīng)的是同一個(gè)鏡像。
          3.2.1 鏡像體積
          如果仔細(xì)觀察,會(huì)注意到,這里標(biāo)識(shí)的所占用空間和在 Docker Hub 上看到的鏡像大小不同。比如, ubuntu:16.04 鏡像大小,在這里是 127MB ,但是在 Docker Hub 顯示的卻是 50MB 。這是因?yàn)?Docker Hub 中顯示的體積是壓縮后的體積。在鏡像下載和上傳過程中鏡像是保持著壓縮狀態(tài)的,因此 Docker Hub 所顯示的是鏡像下載到本地后,展開的大小,準(zhǔn)確說,是展開后的各層所占空間的總和,因?yàn)殓R像到本地后,查看空間的時(shí)候,更關(guān)心的是本地磁盤空間占用的大小。
          另外一個(gè)需要注意的問題是, docker image ls 列表中的鏡像體積總和并非是所有鏡像實(shí)際硬盤消耗,由于 Docker 鏡像是多層存儲(chǔ)結(jié)構(gòu),并且可以繼承、復(fù)用,因此不同鏡像可能會(huì)因?yàn)槭褂孟嗤幕A(chǔ)鏡像,從而擁有共同的層。由于 Docker 使用 Union FS,相同的層只需要保存一份即可,因此實(shí)際鏡像硬盤占用空間很可能要比這個(gè)列表鏡像大小的總和要小的多。
          你可以通過以下命令來便捷的查看鏡像、容器、數(shù)據(jù)卷所占用空間。
          $ docker system dfTYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLEImages              24                  0                   1.992GB             1.992GB (100%)Containers          1                   0                   62.82MB             62.82MB (100%)Local Volumes       9                   0                   652.2MB             652.2MB (100%)Build Cache  
          3.2.2 虛懸鏡像
          尚明的鏡像列表中,還可以看到一個(gè)特殊的鏡像,這個(gè)鏡像既沒有倉庫名,也沒有標(biāo)簽,均為 <none>。:
          <none>               <none>              00285df0df87        5 days ago          342 MB
          這個(gè)鏡像原本是有鏡像名和標(biāo)簽的,原來為 mongo:3.2,隨著官方鏡像維護(hù),發(fā)布了新版本后,重新 docker pull mongo:3.2 時(shí), mongo:3.2 這個(gè)鏡像名被轉(zhuǎn)移到了新下載的鏡像身上,而舊的鏡像上的這個(gè)名稱則被取消,從而成為了 <none> 。除了 docker pull 可能導(dǎo)致這種情況, docker build 也同樣可以導(dǎo)致這種現(xiàn)象。由于新舊鏡像同名,舊鏡像名稱被取消,從而出現(xiàn)倉庫名、標(biāo)簽均為 <none> 的鏡像。這類無標(biāo)簽鏡像也被稱之為 虛懸鏡像(dangling image),可以用下面的命令專門顯示這類鏡像:
          $ docker image ls -f dangling=trueREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE<none>              <none>              00285df0df87        5 days ago          342 MB
          一般來說,虛懸鏡像已經(jīng)失去了存在的價(jià)值,是可以隨意刪除的,可以用下面的命令刪除。
          $ docker image prune

          3.2.3 中間層鏡像

          為了加速鏡像構(gòu)建、重復(fù)利用資源,Docker 會(huì)利用 中間層鏡像。所以在使用一段時(shí)間后,可能會(huì)看到一些依賴的中間層鏡像。默認(rèn)的 docker image ls 列表中只會(huì)顯示頂層鏡像,如果希望顯示包括中間層鏡像在內(nèi)的所有鏡像的話,需要加 -a 參數(shù)。
          $ docker image ls -a
          這樣會(huì)看到很多無標(biāo)簽的鏡像,與之前的虛懸鏡像不同,這些無標(biāo)簽的鏡像很多都是中間層鏡像,是其他鏡像所依賴的鏡像。這些無標(biāo)簽鏡像不應(yīng)該刪除,否者會(huì)導(dǎo)致上層鏡像因?yàn)橐蕾噥G失而出錯(cuò)。實(shí)際上,這些鏡像也沒必要?jiǎng)h除,因?yàn)橹罢f過,相同的層只會(huì)存一遍,而這些鏡像是別的鏡像的依賴,因此并不會(huì)因?yàn)樗鼈儽涣谐鰜矶啻媪艘环荩瑹o論如何你也會(huì)需要它們。只要?jiǎng)h除那些依賴它們的鏡像后,這些依賴的中間層鏡像也會(huì)被連帶刪除。
          3.2.4 列出部分鏡像
          不加任何參數(shù)的情況下,docker image ls 會(huì)列出所有頂級(jí)鏡像,但是有時(shí)候我們只希望列出部分鏡像。docker iimage ls 有好幾個(gè)參數(shù)可以幫助做到這個(gè)事情。
          根據(jù)倉庫名列出鏡像
          $ docker image ls ubuntuREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEubuntu              16.04               f753707788c5        4 weeks ago         127 MBubuntu              latest              f753707788c5        4 weeks ago         127 MBubuntu              14.04               1e0c3dd64ccd        4 weeks ago         188 MB
          列出特定的某個(gè)鏡像,也就是說指定倉庫名和標(biāo)簽
          $ docker image ls ubuntu:16.04REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEubuntu              16.04               f753707788c5        4 weeks ago         127 MB
          除此之外,docker image ls 還支持強(qiáng)大的過濾器參數(shù) --filter,或者簡(jiǎn)寫 -f。之前我們已經(jīng)看到了使用過濾器來列出虛懸鏡像的用法,塔還有更多的用法。比如,我們希望在 mongo:3.2 之后建立的鏡像,可以用下面的命令:
          $ docker image ls -f since=mongo:3.2REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEredis               latest              5f515359c7f8        5 days ago          183 MBnginx               latest              05a60462f8ba        5 days ago          181 MB
          想查看某個(gè)位置之前的鏡像也可以,只需要把 since 換成 before 即可。此外,如果鏡像構(gòu)建時(shí),定義了 LABEL ,還可以通過 LABEL 來過濾。
          $ docker image ls -f label=com.example.version=0.1...
          3.2.5 以特定格式顯示
          默認(rèn)情況下, docker image ls 會(huì)輸出一個(gè)完整的表格,但是我們并非所有時(shí)候都會(huì)需要這些內(nèi)容。比如,剛才刪除虛懸鏡像的時(shí)候,我們需要利用 docker image ls 把所有的虛懸鏡像的 ID 列出來,然后才可以交給 docker image rm 命令作為參數(shù)來刪除指定的這些鏡像,這個(gè)時(shí)候就用到了 -q 參數(shù)。
          $ docker image ls -q5f515359c7f805a60462f8bafe9198c04d6200285df0df87f753707788c5f753707788c51e0c3dd64ccd
          --filter 配合 -q 產(chǎn)生出指定范圍的 ID 列表,然后送給另一個(gè) docker 命令作為參數(shù),從而針對(duì)這組實(shí)體成批的進(jìn)行某種操作的做法在 Docker 命令行使用過程中非常常見,不僅僅是鏡像,將來我們會(huì)在各個(gè)命令中看到這類搭配已完成很強(qiáng)大的功能。因此每次在文檔看到過濾器后,可以多注意一下它們的用法。
          另外一些時(shí)候,我們可能只是對(duì)表格的結(jié)構(gòu)不滿意,希望自己組織列;或者不希望有標(biāo)題,這樣方便其它程序解析結(jié)果等,這就用到了 Go 的模板語法。
          比如,下面的命令會(huì)直接列出鏡像結(jié)果,并且只包含鏡像ID 和倉庫名:
          $ docker image ls --format "{{.ID}}: {{.Repository}}"5f515359c7f8: redis05a60462f8ba: nginxfe9198c04d62: mongo00285df0df87: <none>f753707788c5: ubuntuf753707788c5: ubuntu1e0c3dd64ccd: ubuntu
          或者打算以表格等距顯示,并且有標(biāo)題行,和默認(rèn)一樣,不過自己定義列:
          docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
          3.3 刪除本地鏡像
          如果想要?jiǎng)h除本地的鏡像,可以使用 docker image rm 命令,其格式為:
          docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]
          3.3.1 用 ID、鏡像名、摘要?jiǎng)h除鏡像
          其中, <鏡像> 可以是 鏡像短 ID、鏡像長(zhǎng) ID、鏡像名 或者 鏡像摘要。
          比如我們有這么一些鏡像:
          $ docker image lsREPOSITORY                  TAG                 IMAGE ID            CREATED             SIZEcentos                      latest              0584b3d2cf6d        3 weeks ago         196.5 MBredis                       alpine              501ad78535f0        3 weeks ago         21.03 MBdocker                      latest              cf693ec9b5c7        3 weeks ago         105.1 MBnginx                       latest              e43d811ce2f4        5 weeks ago         181.5 MB
          我們可以用鏡像的完整 ID,也稱為 長(zhǎng) ID ,來刪除鏡像。使用腳本的時(shí)候可能會(huì)用長(zhǎng) ID,但是人工輸入就太累了,所以更多的時(shí)候使用 短 ID 來刪除鏡像。docker image ls 默認(rèn)列出的就已經(jīng)是短 ID 了,一般取前 3 個(gè)字符以上,只要足夠區(qū)分于別的鏡像就可以了。
          比如這里,如果我們要?jiǎng)h除 redis:alpine 鏡像,可以執(zhí)行:
          $ docker image rm 501Untagged: redis:alpineUntagged: redis@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86dDeleted: sha256:501ad78535f015d88872e13fa87a828425117e3d28075d0c117932b05bf189b7Deleted: sha256:96167737e29ca8e9d74982ef2a0dda76ed7b430da55e321c071f0dbff8c2899bDeleted: sha256:32770d1dcf835f192cafd6b9263b7b597a1778a403a109e2cc2ee866f74adf23Deleted: sha256:127227698ad74a5846ff5153475e03439d96d4b1c7f2a449c7a826ef74a2d2faDeleted: sha256:1333ecc582459bac54e1437335c0816bc17634e131ea0cc48daa27d32c75eab3Deleted: sha256:4fc455b921edf9c4aea207c51ab39b10b06540c8b4825ba57b3feed1668fa7c7
          我們也可以用 鏡像名 ,也就是 <倉庫名>:<標(biāo)簽> ,來刪除鏡像。
          $ docker image rm centosUntagged: centos:latestUntagged: centos@sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366cDeleted: sha256:0584b3d2cf6d235ee310cf14b54667d889887b838d3f3d3033acd70fc3c48b8aDeleted: sha256:97ca462ad9eeae25941546209454496e1d66749d53dfa2ee32bf1faabd239d38
          當(dāng)然,更精確的是使用 鏡像摘要 刪除鏡像。
          $ docker image ls --digestsREPOSITORY                  TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZEnode                        slim                sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228   6e0c4c8e3913        3 weeks ago         214 MB
          $ docker image rm node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228Untagged: node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228
          3.3.2 Untagged 和 Deleted
          如果觀察上面這幾個(gè)命令的運(yùn)行輸出信息的話,你會(huì)注意到刪除行為分為兩類,一類是 Untagged,另一類是 Deleted。我們之前介紹過,鏡像的唯一標(biāo)識(shí)是其 ID 和摘要,而一個(gè)鏡像可以有多個(gè)標(biāo)簽。
          因此當(dāng)我們使用上面命令刪除鏡像的時(shí)候,實(shí)際上是在要求刪除某個(gè)標(biāo)簽的鏡像。所以首先需要做的是將滿足我們要求的所有鏡像標(biāo)簽都取消,這就是我們看到的 Untagged 的信息。因?yàn)橐粋€(gè)鏡像可以對(duì)應(yīng)多個(gè)標(biāo)簽,因此當(dāng)我們刪除了所指定的標(biāo)簽后,可能還有別的標(biāo)簽指向了這個(gè)鏡像,如果是這種情況,那么 Delete 行為就不會(huì)發(fā)生。所以并非所有的 docker image rm 都會(huì)產(chǎn)生刪除鏡像的行為,有可能僅僅是取消了某個(gè)標(biāo)簽而已。
          當(dāng)該鏡像所有的標(biāo)簽都被取消了,該鏡像很可能會(huì)失去了存在的意義,因此會(huì)觸發(fā)刪除行為。鏡像是多層存儲(chǔ)結(jié)構(gòu),因此在刪除的時(shí)候也是從上層向基礎(chǔ)層方向依次進(jìn)行判斷刪除。鏡像的多層結(jié)構(gòu)讓鏡像復(fù)用變動(dòng)非常容易,因此很有可能某個(gè)其它鏡像正依賴于當(dāng)前鏡像的某一層。這種情況,依舊不會(huì)觸發(fā)刪除該層的行為。直到?jīng)]有任何層依賴當(dāng)前層時(shí),才會(huì)真實(shí)的刪除當(dāng)前層。這就是為什么,有時(shí)候會(huì)奇怪,為什么明明沒有別的標(biāo)簽指向這個(gè)鏡像,但是它還是存在的原因,也是為什么有時(shí)候會(huì)發(fā)現(xiàn)所刪除的層數(shù)和自己 docker pull 看到的層數(shù)不一樣的源。
          除了鏡像依賴以外,還需要注意的是容器對(duì)鏡像的依賴。如果有用這個(gè)鏡像啟動(dòng)的容器存在(即使容器沒有運(yùn)行),那么同樣不可以刪除這個(gè)鏡像。之前講過,容器是以鏡像為基礎(chǔ),再加一層容器存儲(chǔ)層,組成這樣的多層存儲(chǔ)結(jié)構(gòu)去運(yùn)行的。因此該鏡像如果被這個(gè)容器所依賴的,那么刪除必然會(huì)導(dǎo)致故障。如果這些容器是不需要的,應(yīng)該先將它們刪除,然后再來刪除鏡像。
          3.3.3 用 docker image ls 命令來配合
          像其它可以承接多個(gè)實(shí)體的命令一樣,可以使用 docker image ls -q 來配合使用 docker image rm ,這樣可以成批的刪除希望刪除的鏡像。我們?cè)?“鏡像列表”章節(jié)介紹過很多過濾鏡像列表的方式都可以拿過來使用。
          比如,我們需要?jiǎng)h除所有倉庫名為 redis 的鏡像:
          docker image rm $(docker image ls -q redis)
          或者刪除所有在 mongo:3.2 之前的鏡像:
          docker image rm $(docker image ls -q -f before=mongo:3.2)
          充分利用你的想象力和 Linux 命令行的強(qiáng)大,你可以完成很多非常贊的功能。
          3.3.4 CentOS/RHEL 的用戶需要注意的事項(xiàng)
          在 Ubuntu/Debian 上有 UnionFS 可以使用,如 aufs 或者 overlay2,而 CentOS 和 RHEL 的內(nèi)核中沒有相關(guān)驅(qū)動(dòng)。因此對(duì)于這類系統(tǒng),一般使用 devicemapper 驅(qū)動(dòng)利用 LVM 的一些機(jī)制來模擬分層存儲(chǔ)。這樣的做法除了性能比較差外,穩(wěn)定性一般也不好,而且配置相對(duì)復(fù)雜。
          Docker 安裝在 CentOS/RHEL 上后,會(huì)默認(rèn)選擇 devicemapper,但是為了簡(jiǎn)化配置,其 devicemapper 是跑在一個(gè)稀疏文件模擬的塊設(shè)備上,也被稱為 loop-lvm。這樣的選擇是因?yàn)椴恍枰~外配置就可以運(yùn)行 Docker,這是自動(dòng)配置唯一能做到的事情。但是 loop-lvm 的做法非常不好,其穩(wěn)定性、性能更差,無論是日志還是 docker info 中都會(huì)看到警告信息。官方文檔有明確的文章講解了如何配置塊設(shè)備給 devicemapper 驅(qū)動(dòng)做存儲(chǔ)層的做法,這類做法也被稱為配置 direct-lvm。
          除了前面說到的問題外,devicemapper + loop-lvm 還有一個(gè)缺陷,因?yàn)樗窍∈栉募?,所以它?huì)不斷增長(zhǎng)。用戶在使用過程中會(huì)注意到 /var/lib/docker/devicemapper/devicemapper/data 不斷增長(zhǎng),而且無法控制。很多人會(huì)希望刪除鏡像或者可以解決這個(gè)問題,結(jié)果發(fā)現(xiàn)效果并不明顯。原因就是這個(gè)稀疏文件的空間釋放后基本不進(jìn)行垃圾回收的問題。因此往往會(huì)出現(xiàn)即使刪除了文件內(nèi)容,空間卻無法回收,隨著使用這個(gè)稀疏文件一直在不斷增長(zhǎng)。
          所以對(duì)于 CentOS/RHEL 的用戶來說,在沒有辦法使用 UnionFS 的情況下,一定要配置 direct-lvm 給 devicemapper,無論是為了性能、穩(wěn)定性還是空間利用率。
          或許有人注意到了 CentOS 7 中存在被 backports 回來的 overlay 驅(qū)動(dòng),不過 CentOS 里的這個(gè)驅(qū)動(dòng)達(dá)不到生產(chǎn)環(huán)境使用的穩(wěn)定程度,所以不推薦使用。
          讀到這里,想必你知道如何的安裝Docker,以及了解了Docker非常重要的鏡像。

          來源:CSDN 博客

          (版權(quán)歸原作者所有,侵刪)

          10T 技術(shù)資源大放送!包括但不限于:Linux、虛擬化、容器、云計(jì)算、網(wǎng)絡(luò)、Python、Go 等。在開源Linux公眾號(hào)內(nèi)回復(fù)「10T」,即可免費(fèi)獲?。?/span>

          shell編程100例(附PDF下載)
          IPv6技術(shù)白皮書(附PDF下載)
          Linux主流發(fā)行版本配置IP總結(jié)(Ubuntu、CentOS、Redhat、Suse)
          批量安裝Windows系統(tǒng)
          無人值守批量安裝服務(wù)器
          運(yùn)維必備的《網(wǎng)絡(luò)端口大全》,看這一份就夠了。
          收藏:服務(wù)器和存儲(chǔ)知識(shí)入門
          什么叫SSH?原理詳解,看這一篇就夠了!
          Nginx面試40問(收藏吃灰)
          20 個(gè) Linux 服務(wù)器性能調(diào)優(yōu)技巧
          超詳細(xì)!一文帶你了解LVS四層負(fù)載均衡企業(yè)級(jí)實(shí)踐!
          收藏 | Linux系統(tǒng)日志位置及包含的日志內(nèi)容介紹
          100 道 Linux 常見面試題,建議收藏,慢慢讀~
          服務(wù)器12種基本故障+排查方法
          IT運(yùn)維管理常用工具大全,讓你成為真正的高手
          什么是QoS?

          Linux學(xué)習(xí)指南

          有收獲,點(diǎn)個(gè)在看 

          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  97人妻在线视频 | 一级无码片 | 欧美19p | 青娱乐亚洲精品视频 | 黄色视频在线观看免费 |