關於 Docker 鏡像的操做,看完這篇就夠啦 !(下)

Docker 鏡像學習(下)
Docker 鏡像學習(下)

緊接着上篇《關於 Docker 鏡像的操做,看完這篇就夠啦 !(上)》,奉上下篇 !!!python

鏡像做爲 Docker 三大核心概念中最重要的一個關鍵詞,它有不少操做,是您想學習容器技術不得不掌握的。本文將帶您一步一步,圖文並重,上手操做來學習它。mysql

目錄:git

  • 1、Docker 刪除鏡像
    • 1.1 經過標籤刪除鏡像
    • 1.2 經過 ID 刪除鏡像
    • 1.3 刪除鏡像的限制
    • 1.4 清理鏡像
  • 2、Docker 建立鏡像
    • 2.1 基於已有的鏡像建立
    • 2.2 基於 Dockerfile 建立
  • 3、Docker 導出&加載鏡像
    • 3.1 導出鏡像
    • 3.2 加載鏡像
  • 4、Docker 上傳鏡像
    • 4.1 獲取 Docker ID
    • 4.2 建立鏡像倉庫
    • 4.3 上傳鏡像
  • 5、總結

1、Docker 刪除鏡像

1.1 經過標籤刪除鏡像

經過以下兩個均可以刪除鏡像:github

docker rmi [image]
複製代碼

或者:面試

docker image rm [image]
複製代碼

支持的子命令以下:sql

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

Docker 查看鏡像信息
Docker 查看鏡像信息

例如,咱們想刪除上章節建立的 allen_mysql:5.7 鏡像,命令以下:docker

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 鏡像也給刪除了?ubuntu

實際上,當同一個鏡像擁有多個標籤時,執行 docker rmi 命令,只是會刪除了該鏡像衆多標籤中,您指定的標籤而已,並不會影響原始的那個鏡像文件。bash

不信的話,咱們能夠執行 docker images 命令,來看下 docker.io/mysql:5.7 鏡像還在不在:post

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 命令後,仍是告訴咱們釋放了多少存儲空間!

2、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 查看鏡像信息

3、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
複製代碼

導入成功後,查看本地鏡像信息,你就能夠得到別人分享的鏡像了!怎麼樣,是否是很方便呢!

4、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 官網,新建立的倉庫的信息頁面驗證一下,是否真的成功了:

倉庫鏡像展現頁
倉庫鏡像展現頁

大工告成!!!

5、總結

本文中,咱們着重學習了 Docker 中如何刪除鏡像, 建立鏡像,導出&加載鏡像,以及向 Docker Hub 上傳鏡像。本文是 Docker 鏡像學習的下篇,後續會帶來更多 Docker 相關的學習文章,祝您學習愉快!

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

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

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

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

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

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

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

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

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

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

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

歡迎關注我的公衆號: 小哈學Java

小哈學Java
相關文章
相關標籤/搜索