緊接着上篇《關於 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
: 不要刪除未帶標簽的父鏡像;
例如,我們想刪除上章節創建的 allen_mysql:5.7
鏡像,命令如下:
docker rmi allen_mysql:5.7
從上面章節中,我們知道 allen_mysql:5.7
和 docker.io/mysql:5.7
實際上指向的是同一個鏡像,那么,您可以能會有疑問,我刪除了 allen_mysql:5.7
, 會不會將 docker.io/mysql:5.7
鏡像也給刪除了?
實際上,當同一個鏡像擁有多個標簽時,執行 docker rmi
命令,只是會刪除了該鏡像眾多標簽中,您指定的標簽而已,並不會影響原始的那個鏡像文件。
不信的話,我們可以執行 docker images
命令,來看下 docker.io/mysql:5.7
鏡像還在不在:
可以看到,docker.io/mysql:5.7
鏡像依然存在!
那么,如果某個鏡像不存在多個標簽,當且僅當只有一個標簽時,執行刪除命令時,您就要小心了,這會徹底刪除鏡像。
例如,這個時候,我們再執行 docker rmi docker.io/mysql:5.7
命令:
從上圖可以看到,我們已經刪除了 docker.io/mysql:5.7
鏡像的所有文件層。該鏡像在本地已不復存在了!
1.2 通過 ID 刪除鏡像
除了通過標簽名稱來刪除鏡像,我們還可以通過制定鏡像 ID, 來刪除鏡像,如:
docker rmi ee7cbd482336
一旦制定了通過 ID 來刪除鏡像,它會先嘗試刪除所有指向該鏡像的標簽,然后在刪除鏡像本身。
1.3 刪除鏡像的限制
刪除鏡像很簡單,但也不是我們何時何地都能刪除的,它存在一些限制條件。
當通過該鏡像創建的容器未被銷毀時,鏡像是無法被刪除的。為了驗證這一點,我們來做個試驗。首先,我們通過 docker pull alpine
命令,拉取一個最新的 alpine
鏡像, 然后啟動鏡像,讓其輸出 hello, docker!
:
接下來,我們來刪除這個鏡像試試:
可以看到提示信息,無法刪除該鏡像,因為有容器正在引用他!同時,這段信息還告訴我們,除非通過添加 -f
子命令,也就是強制刪除,才能移除掉該鏡像!
docker rmi -f docker.io/alpine
但是,我們一般不推薦這樣暴力的做法,正確的做法應該是:
- 先刪除引用這個鏡像的容器;
- 再刪除這個鏡像;
也就是,根據上圖中提示的,引用該鏡像的容器 ID (9d59e2278553
), 執行刪除命令:
docker rm 9d59e2278553
然后,再執行刪除鏡像的命令:
docker rmi 5cb3aa00f899
這個時候,就能正常刪除了!
1.4 清理鏡像
我們在使用 Docker 一段時間后,系統一般都會殘存一些臨時的、沒有被使用的鏡像文件,可以通過以下命令進行清理:
docker image prune
它支持的子命令有:
-a, --all
: 刪除所有沒有用的鏡像,而不僅僅是臨時文件;-f, --force
:強制刪除鏡像文件,無需彈出提示確認;
另外,執行完 docker image prune
命令后,還是告訴我們釋放了多少存儲空間!
二、Docker 創建鏡像
此小節中,您將學習 Docker 如何創建鏡像?Docker 創建鏡像主要有三種:
- 基於已有的鏡像創建;
- 基於 Dockerfile 來創建;
- 基於本地模板來導入;
我們將主要介紹常用的 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 鏡像,創建一個新的鏡像:
首先,讓我將它運行起來,並在其中創建一個 test.txt 文件:
命令如下:
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 信息,如下圖所示:
再次查看本地鏡像信息,可以看到新創建的 test:0.1
鏡像了:
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 .
注意:命令的最后有個點,如果不加的話,會構建不成功 !
編譯成功后,再次查看本地鏡像信息,就可以看到新構建的 python:3 鏡像了。
三、Docker 導出&加載鏡像
此小節中,您將學習 Docker 如何導出&加載鏡像。
通常我們會有下面這種需求,需要將鏡像分享給別人,這個時候,我們可以將鏡像導出成 tar 包,別人直接通過加載這個 tar 包,快速地將鏡像引入到本地鏡像庫。
要想使用這兩個功能,主要是通過如下兩個命令:
docker save
docker load
3.1 導出鏡像
查看本地鏡像如下:
例如,我們想要將 python:3 鏡像導出來,執行命令:
docker save -o python_3.tar python:3
執行成功后,查看當前目錄:
可以看到 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 網址 https://hub.docker.com,開始注冊:
填寫您的 Docker ID (也就是賬號),以及密碼,Email, 點擊繼續。
接下來,Docker Hub 會發送驗證郵件,到您填寫的郵箱當中:
點擊驗證即可,接下來,再次返回 Docker Hub 官網,用您剛剛注冊的 Docker ID 和密碼來登錄賬號!
4.2 創建鏡像倉庫
登錄成功后,會出現如下頁面:
選擇創建一個鏡像倉庫:
填寫倉庫名稱、描述信息、是否公開后,點擊創建。
我們看到,倉庫已經創建成功了,但是里面還沒有任何鏡像,接下來開始上傳鏡像,到此新創建的倉庫中。
4.3 上傳鏡像
進入命令行,用我們剛剛獲取的 Docker ID 以及密碼登錄,執行命令:
docker login
登錄成功后,我們開始准備上傳本地的 python:3
鏡像:
首先,我們對其打一個新的標簽,前綴與我們新創建的 Docker ID 、倉庫名保持一致:
docker tag python:3 weiwosuoai1991/python:3
查看本地信息,可以看到,標簽打成功了。接下開,開始上傳!執行命令:
docker push weiwosuoai1991/python:3
上傳成功!去 Docker Hub 官網,新創建的倉庫的信息頁面驗證一下,是否真的成功了:
大工告成!!!
五、總結
本文中,我們着重學習了 Docker 中如何刪除鏡像, 創建鏡像,導出&加載鏡像,以及向 Docker Hub 上傳鏡像。本文是 Docker 鏡像學習的下篇,后續會帶來更多 Docker 相關的學習文章,祝您學習愉快!
六、贈送 | 面試&學習福利資源
最近在網上發現一個不錯的 PDF 資源《Java 核心面試知識.pdf》分享給大家,不光是面試,學習,你都值得擁有!!!
獲取方式: 關注公眾號: 小哈學Java, 后台回復 資源,既可獲取資源鏈接,下面是目錄以及部分截圖:
重要的事情說兩遍,獲取方式: 關注公眾號: 小哈學Java, 后台回復 資源,既可獲取資源鏈接 !!!