關於 Docker 映象的操作,看完這篇就夠啦 !(下)

犬小哈發表於2019-04-01

Docker 映象學習(下)
Docker 映象學習(下)

緊接著上篇《關於 Docker 映象的操作,看完這篇就夠啦 !(上)》,奉上下篇 !!!

映象作為 Docker 三大核心概念中最重要的一個關鍵詞,它有很多操作,是您想學習容器技術不得不掌握的。本文將帶您一步一步,圖文並重,上手操作來學習它。

目錄:

  • 一、Docker 刪除映象
    • 1.1 通過標籤刪除映象
    • 1.2 通過 ID 刪除映象
    • 1.3 刪除映象的限制
    • 1.4 清理映象
  • 二、Docker 建立映象
    • 2.1 基於已有的映象建立
    • 2.2 基於 Dockerfile 建立
  • 三、Docker 匯出&載入映象
    • 3.1 匯出映象
    • 3.2 載入映象
  • 四、Docker 上傳映象
    • 4.1 獲取 Docker ID
    • 4.2 建立映象倉庫
    • 4.3 上傳映象
  • 五、總結

一、Docker 刪除映象

1.1 通過標籤刪除映象

通過如下兩個都可以刪除映象:

docker rmi [image]
複製程式碼

或者:

docker image rm [image]
複製程式碼

支援的子命令如下:

  • -f, -force: 強制刪除映象,即便有容器引用該映象;
  • -no-prune: 不要刪除未帶標籤的父映象;

Docker 檢視映象資訊
Docker 檢視映象資訊

例如,我們想刪除上章節建立的 allen_mysql:5.7 映象,命令如下:

docker rmi allen_mysql:5.7
複製程式碼

Docker 刪除映象
Docker 刪除映象

從上面章節中,我們知道 allen_mysql:5.7docker.io/mysql:5.7 實際上指向的是同一個映象,那麼,您可以能會有疑問,我刪除了 allen_mysql:5.7, 會不會將 docker.io/mysql:5.7 映象也給刪除了?

實際上,當同一個映象擁有多個標籤時,執行 docker rmi 命令,只是會刪除了該映象眾多標籤中,您指定的標籤而已,並不會影響原始的那個映象檔案。

不信的話,我們可以執行 docker images 命令,來看下 docker.io/mysql:5.7 映象還在不在:

Docker 檢視映象資訊
Docker 檢視映象資訊

可以看到,docker.io/mysql:5.7 映象依然存在!

那麼,如果某個映象不存在多個標籤,當且僅當只有一個標籤時,執行刪除命令時,您就要小心了,這會徹底刪除映象。

例如,這個時候,我們再執行 docker rmi docker.io/mysql:5.7 命令:

Docker 刪除映象
Docker 刪除映象

從上圖可以看到,我們已經刪除了 docker.io/mysql:5.7 映象的所有檔案層。該映象在本地已不復存在了!

1.2 通過 ID 刪除映象

除了通過標籤名稱來刪除映象,我們還可以通過制定映象 ID, 來刪除映象,如:

docker rmi ee7cbd482336
複製程式碼

一旦制定了通過 ID 來刪除映象,它會先嚐試刪除所有指向該映象的標籤,然後在刪除映象本身。

1.3 刪除映象的限制

刪除映象很簡單,但也不是我們何時何地都能刪除的,它存在一些限制條件。

當通過該映象建立的容器未被銷燬時,映象是無法被刪除的。為了驗證這一點,我們來做個試驗。首先,我們通過 docker pull alpine 命令,拉取一個最新的 alpine 映象, 然後啟動映象,讓其輸出 hello, docker!:

Docker run alpine
Docker run alpine

接下來,我們來刪除這個映象試試:

Docker 刪除映象
Docker 刪除映象

可以看到提示資訊,無法刪除該映象,因為有容器正在引用他!同時,這段資訊還告訴我們,除非通過新增 -f 子命令,也就是強制刪除,才能移除掉該映象!

docker rmi -f docker.io/alpine
複製程式碼

但是,我們一般不推薦這樣暴力的做法,正確的做法應該是:

  1. 先刪除引用這個映象的容器;
  2. 再刪除這個映象;

也就是,根據上圖中提示的,引用該映象的容器 ID (9d59e2278553), 執行刪除命令:

docker rm 9d59e2278553
複製程式碼

然後,再執行刪除映象的命令:

docker rmi 5cb3aa00f899
複製程式碼

Docker 刪除映象
Docker 刪除映象

這個時候,就能正常刪除了!

1.4 清理映象

我們在使用 Docker 一段時間後,系統一般都會殘存一些臨時的、沒有被使用的映象檔案,可以通過以下命令進行清理:

docker image prune
複製程式碼

它支援的子命令有:

  • -a, --all: 刪除所有沒有用的映象,而不僅僅是臨時檔案;
  • -f, --force:強制刪除映象檔案,無需彈出提示確認;

另外,執行完 docker image prune 命令後,還是告訴我們釋放了多少儲存空間!

二、Docker 建立映象

此小節中,您將學習 Docker 如何建立映象?Docker 建立映象主要有三種:

  1. 基於已有的映象建立;
  2. 基於 Dockerfile 來建立;
  3. 基於本地模板來匯入;

我們將主要介紹常用的 1,2 兩種。

2.1 基於已有的映象建立

通過如下命令來建立:

docker container commit
複製程式碼

支援的子命令如下:

  • -a, --author="": 作者資訊;
  • -c, --change=[]: 可以在提交的時候執行 Dockerfile 指令,如 CMD、ENTRYPOINT、ENV、EXPOSE、LABEL、ONBUILD、USER、VOLUME、WORIR 等;
  • -m, --message="": 提交資訊;
  • -p, --pause=true: 提交時,暫停容器執行。

接下來,基於本地已有的 Ubuntu 映象,建立一個新的映象:

Docker 建立映象
Docker 建立映象

首先,讓我將它執行起來,並在其中建立一個 test.txt 檔案:

Docker 建立映象
Docker 建立映象

命令如下:

docker run -it docker.io/ubuntu:latest /bin/bash
root@a0a0c8cfec3a:/# touch test.txt
root@a0a0c8cfec3a:/# exit
複製程式碼

建立完 test.txt 檔案後,需要記住標註的容器 ID: a0a0c8cfec3a, 用它來提交一個新的映象(PS: 你也可以通過名稱來提交映象,這裡只演示通過 ID 的方式)。

執行命令:

docker container commit -m "Added test.txt file" -a "Allen" a0a0c8cfec3a test:0.1
複製程式碼

提交成功後,會返回新建立的映象 ID 資訊,如下圖所示:

Docker 提交新建立的映象
Docker 提交新建立的映象

再次檢視本地映象資訊,可以看到新建立的 test:0.1 映象了:

Docker 檢視映象資訊
Docker 檢視映象資訊

2.2 基於 Dockerfile 建立

通過 Dockerfile 的方式來建立映象,是最常見的一種方式了,也是比較推薦的方式。Dockerfile 是一個文字指令檔案,它描述了是如何基於一個父映象,來建立一個新映象的過程。

下面讓我們來編寫一個簡單的 Dockerfile 檔案,它描述了基於 Ubuntu 父映象,安裝 Python3 環境的映象:

FROM docker.io/ubuntu:latest

LABEL version="1.0" maintainer="Allen <weiwosuo@github>"

RUN apt-get update && \
    apt-get install -y python3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
複製程式碼

建立完成後,通過這個 Dockerfile 檔案,來構建新的映象,執行命令:

docker image build -t python:3 .
複製程式碼

注意:命令的最後有個點,如果不加的話,會構建不成功 !

Docker 通過 Dockerfile 構建映象
Docker 通過 Dockerfile 構建映象

編譯成功後,再次檢視本地映象資訊,就可以看到新構建的 python:3 映象了。

Docker 檢視映象資訊
Docker 檢視映象資訊

三、Docker 匯出&載入映象

此小節中,您將學習 Docker 如何匯出&載入映象。

通常我們會有下面這種需求,需要將映象分享給別人,這個時候,我們可以將映象匯出成 tar 包,別人直接通過載入這個 tar 包,快速地將映象引入到本地映象庫。

要想使用這兩個功能,主要是通過如下兩個命令:

  1. docker save
  2. docker load

3.1 匯出映象

檢視本地映象如下:

Docker 檢視映象資訊
Docker 檢視映象資訊

例如,我們想要將 python:3 映象匯出來,執行命令:

docker save -o python_3.tar python:3
複製程式碼

執行成功後,檢視當前目錄:

Docker 匯出檔案
Docker 匯出檔案

可以看到 python_3.tar 映象檔案已經生成。接下來,你可以將它通過複製的方式,分享給別人了!

3.2 載入映象

別人拿到了這個 tar 包後,要如何匯入到本地的映象庫呢?

通過執行如下命令:

docker load -i python_3.tar
複製程式碼

或者:

docker load < python_3.tar
複製程式碼

匯入成功後,檢視本地映象資訊,你就可以獲得別人分享的映象了!怎麼樣,是不是很方便呢!

四、Docker 上傳映象

我們將以上傳到 Docker Hub 上為示例,演示 Docker 如何上傳映象。

4.1 獲取 Docker ID

想要上傳映象到 Docker Hub 上,首先,我們需要註冊 Docker Hub 賬號。開啟 Docker Hub 網址 hub.docker.com,開始註冊:

Docker Hub 註冊賬號
Docker Hub 註冊賬號

填寫您的 Docker ID (也就是賬號),以及密碼,Email, 點選繼續。

接下來,Docker Hub 會傳送驗證郵件,到您填寫的郵箱當中:

Docker Hub 驗證郵件
Docker Hub 驗證郵件

點選驗證即可,接下來,再次返回 Docker Hub 官網,用您剛剛註冊的 Docker ID 和密碼來登入賬號!

Docker Hub 登入頁面
Docker Hub 登入頁面

4.2 建立映象倉庫

登入成功後,會出現如下頁面:

歡迎來到 Docker Hub
歡迎來到 Docker Hub

選擇建立一個映象倉庫:

建立 Python 倉庫
建立 Python 倉庫

填寫倉庫名稱描述資訊是否公開後,點選建立。

倉庫映象展示頁
倉庫映象展示頁

我們看到,倉庫已經建立成功了,但是裡面還沒有任何映象,接下來開始上傳映象,到此新建立的倉庫中。

4.3 上傳映象

進入命令列,用我們剛剛獲取的 Docker ID 以及密碼登入,執行命令:

docker login
複製程式碼

命令列登入 Docker ID
命令列登入 Docker ID

登入成功後,我們開始準備上傳本地的 python:3 映象:

python:3 映象
python:3 映象

首先,我們對其打一個新的標籤,字首與我們新建立的 Docker ID 、倉庫名保持一致:

docker tag python:3 weiwosuoai1991/python:3
複製程式碼

python:3 映象打標籤
python:3 映象打標籤

檢視本地資訊,可以看到,標籤打成功了。接下開,開始上傳!執行命令:

docker push weiwosuoai1991/python:3
複製程式碼

上傳 python:3 映象
上傳 python:3 映象

上傳成功!去 Docker Hub 官網,新建立的倉庫的資訊頁面驗證一下,是否真的成功了:

倉庫映象展示頁
倉庫映象展示頁

大工告成!!!

五、總結

本文中,我們著重學習了 Docker 中如何刪除映象, 建立映象,匯出&載入映象,以及向 Docker Hub 上傳映象。本文是 Docker 映象學習的下篇,後續會帶來更多 Docker 相關的學習文章,祝您學習愉快!

贈送 | 面試&學習福利資源

最近在網上發現一個不錯的 PDF 資源《Java 核心面試知識.pdf》分享給大家,不光是面試,學習,你都值得擁有!!!

獲取方式: 關注公眾號: 小哈學Java, 後臺回覆 資源,既可獲取資源連結,下面是目錄以及部分截圖:

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

重要的事情說兩遍,獲取方式: 關注公眾號: 小哈學Java, 後臺回覆 資源,既可獲取資源連結 !!!

歡迎關注個人公眾號: 小哈學Java

小哈學Java

相關文章