Docker從理論到實踐(四)------Dokcer鏡像

鏡像

它是Docker的三大核心之一。

Docker運行容器前需要本地存在對應的鏡像,如果本地沒有存在對應的鏡像,Docker將會嘗試從默認鏡像倉庫下載(默認使用Docker Hub公共註冊服務器中的倉庫),當然,我們也可以通過配置,使用自定義的鏡像倉庫,如DaoCloud、阿里雲鏡像、網易蜂巢。

本節將介紹圍繞鏡像這一核心的具體操作:

【1】如何使用pull命令從Docker公有倉庫中下載鏡像到本地

【2】如何查看本地已有的鏡像信息

【3】如何在遠端倉庫使用serach命令進行搜索和過濾

【4】如何刪除鏡像標籤和鏡像文件

【5】如何創建用戶定製的鏡像並且保存爲外部文件

【6】如何向Docker Hub倉庫推送自己的鏡像

...... .......


1、搜索鏡像

使用docker search命令搜索鏡像,命令格式如下:

docker search <images>

例如:搜索一個CentOS系統的鏡像

docker search centos

搜索結果如下:

字段信息說明:

NAME:鏡像的倉庫名字
DESCRIPTION:倉庫的描述信息
STARS:評價,受歡迎的程度
OFFICIAL:是否是官方鏡像
AUTOMATED:是否是自動構建的

查看幫助:man docker-search


2、獲取鏡像

鏡像是Docker容器運行的前提

下載鏡像命令:docker pull NAME[:TAG]

對於Docker鏡像來說,如果不顯式地指定TAG,則會默認選擇latest標籤,即下載倉庫中最新版本的鏡像。

如:下載centos鏡像,實際上就是下載centos:latest鏡像,即目前最新版本的鏡像。

[root@master03 /]# 
[root@master03 /]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete 
Digest: sha256:b40cee82d6f98a785b6ae35748c958804621dc0f2194759a2b8911744457337d
Status: Downloaded newer image for centos:latest
[root@master03 /]# docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        13 days ago         64.2MB
centos              latest              9f38484d220f        4 months ago        202MB
[root@master03 /]# 

下載過程,鏡像文件是由若干層組成的,行首類似於f476d66f5408這樣的數字表示各層的ID。下載過程中會獲取並輸出鏡像的各層信息。

層layer實際上是AUFS(Advanced Union File System,一種聯合文件系統)中的重要概念,是實際增量保存與更新的基礎。

當然,我們可以通過制定標籤來下載特定版本的某一鏡像:

$ docker pull centos:7.2

最後使用鏡像創建一個容器,並進入容器查看下版本

[root@master03 /]# 
[root@master03 /]# docker run -it centos /bin/bash 
[root@39327f2deca5 /]# cat /etc/re
redhat-release  resolv.conf     
[root@39327f2deca5 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@39327f2deca5 /]# exit
exit
[root@master03 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@master03 /]# 

3、查看鏡像

查看docker鏡像:

docker images

 字段信息說明:

REPOSITORY:倉庫,當前鏡像來自於哪個倉庫
TAG:鏡像標籤信息,版本
IMAGE ID:鏡像ID,具有唯一性
CREATED:鏡像創建的時間
SIZE:鏡像大小

4、刪除鏡像

當一個鏡像有多個標籤的時候,docker rmi 命令只是刪除該鏡像多個標籤中的指定標籤,不會影響鏡像文件。但當該鏡像只剩下一個標籤的時候,此時刪除該標籤的時候會徹底刪除該鏡像。使用docker rmi 鏡像ID號命令時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統會先刪除掉指向該鏡像的所有標籤,然後刪除鏡像本身。

注意:運行中的Docker容器是無法刪除的!這個時候鏡像創建的容器存在,而且鏡像文件是無法被刪除的,所以應該先刪除依賴該鏡像的所有容器,再刪除鏡像。

必須通過docker stop或者docker kill命令停止容器,才能將其刪除。否則將出現以下報錯:

[root@master03 /]# docker images    
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        13 days ago         64.2MB
centos              latest              9f38484d220f        4 months ago        202MB
[root@master03 /]# 
[root@master03 /]# docker rmi 355625
Error response from daemon: conflict: unable to delete 3556258649b2 (must be forced) - image is being used by stopped container 08ea8b861134

可以看到,我們直接去刪除一個docker鏡像是不行的,這個鏡像目前正在被某個容器使用。

刪除docker鏡像思路:

docker save保存容器
docker images
docker save REPOSITORY > XX.tar

【1】刪除鏡像容器:
docker ps -a:查看目前Docker鏡像的詳細信息,及容器ID
docker rm CONTAINER ID:刪除Docker容器

我們可以發現ID爲08ea8b861134的容器已經被刪除掉了。這時,我們就可以進行下一步刪除鏡像操作了。

【2】刪除鏡像:
docker images:查看Docker鏡像
docker rmi IMAGE ID:刪除Docker鏡像

可以看到,這一步操作後,我們已成功刪除Docker鏡像。

【3】多個鏡像ID相同時,刪除其中一個鏡像

當我們複製出來多個鏡像時,它們共用一個鏡像ID,這個時候我們停止容器後,直接按鏡像ID去刪除鏡像時,會把這個相同鏡像ID的所有鏡像刪除,這種操作實際上是很危險的。

爲了避免上邊的問題,我們可以按鏡像名稱和TAG標籤來刪除指定鏡像:

docker rmi [REPOSITORY:TAG]

 上述操作將刪除我們指定的鏡像文件,可以看到已經刪除成功。


5、創建鏡像

創建鏡像的方法有三種:【1】基於已有鏡像的容器創建;【2】基於本地模板導入;【3】基於DockerFile創建;

這裏我們重點介紹前兩種方法,最後一種將在後面單獨列一節內容詳解。

【1】基於已有鏡像的容器創建

主要使用docker commit命令,在提交一個容器的時候就指定鏡像的名稱和tag標籤。

格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

主要選項包括:

  • -a:--author=" "作者信息;
  • -m:--message=" "提交信息
  • -p:--pause=true提交時暫停容器運行

下面將使用該docker run命令。首先,啓動一個鏡像,並在其中進行修改操作:

[root@master03 /]# docker run -it ubuntu:14.04 /bin/bash
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
a7344f52cb74: Pull complete 
515c9bb51536: Pull complete 
e1eabe0537eb: Pull complete 
4701f1215c13: Pull complete 
Digest: sha256:2f7c79927b346e436cc14c92bd4e5bd778c3bd7037f35bc639ac1589a7acfa90
Status: Downloaded newer image for ubuntu:14.04
root@05ae2239bb06:/# touch test
root@05ae2239bb06:/# exit
exit

容器ID爲:05ae2239bb06

此時該容器跟源ubuntu:14.04鏡像相比,已發生變化,使用docker commit命令來提交爲一個新的鏡像。提交時可以使用ID或名稱來指定容器:

[root@master03 /]# docker commit -m "Added a new file" -a "Docker Newbee" 05ae2239bb06 test
sha256:d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3
[root@master03 /]# 

返回了新創建的鏡像的ID信息:

d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3

查看本地鏡像列表,即可看到新創建的鏡像信息:

【2】基於本地模板導入

可以直接從一個操作系統模板文件導入一個鏡像。這裏我們先使用docker export導出一個容器。

[root@master03 /]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS               NAMES
05ae2239bb06        ubuntu:14.04               "/bin/bash"              10 minutes ago      Up 2 seconds                                  zealous_elion
5517d6d70a09        microsoft/dotnet-samples   "dotnet dotnetapp.dl…"   45 hours ago        Exited (0) 45 hours ago                       romantic_goodall
39327f2deca5        centos                     "/bin/bash"              2 days ago          Exited (1) 44 hours ago                       gifted_elbakyan
[root@master03 /]# 
[root@master03 /]# docker export 05ae2239bb06 >test_export.tar
[root@master03 /]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test_export.tar  test_for_run.tar  test_for_stop.tar  tmp  usr  var
[root@master03 /]# 

 然後,執行導入容器模板操作:

[root@master03 /]# cat test_export.tar | docker import - test/ubuntu:v1.0
sha256:9e06207a54143ade6761d07c7394bbbdad1bd8d66dd6b15373531852407ac578
[root@master03 /]# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu                v1.0                9e06207a5414        4 seconds ago       64.2MB
centos                     latest              9f38484d220f        4 months ago        202MB
microsoft/dotnet-samples   latest              70e25069fca7        5 months ago        181MB
[root@master03 /]# 

可以看到,新導入的鏡像已經在本地存在了。 


6、導出/載入、上傳鏡像

導出鏡像也就是將鏡像保存到本地文件,可以使用docker save命令,會保存該鏡像的所有歷史記錄和元數據信息。

docker save [IMAGE ID] > [SAVE_FILE.tar]
或者
docker save [IMAGE ID] [SAVE_FILE.tar]

或者:
docker save -o 存儲文件名 存儲的鏡像

 


導入鏡像

#可以用docker load命令將導出的tar文件導入到鏡像庫中
docker load < NAME.tar
#導入後會發現,該鏡像的所有歷史記錄和元數據信息,全部都在。

例如,將ubuntu-latest.tart文件導入到本地鏡像倉庫中


 設置鏡像標籤

本地存儲的鏡像越來越多,我們就需要制定一個專門的倉庫來存放這些鏡像文件,也就是鏡像倉庫。

我們可以使用docker tag命令,爲鏡像打上一個新的標籤。

docker tag [IMAGE ID/NAME] [IMAGE ID/NAME:TAG]
docker tag 3556258649b2 ubuntu-targ-test:dev
docker tag 鏡像ID,這裏是 3556258649b2 ,用戶名稱、鏡像源名(repository name)和新的標籤名(tag)。

docker images命令可以看到,ID爲3556258649b2的鏡像多了一個標籤dev。

然後用docker push命令上傳鏡像。

docker push [IMAGE TAG]
如:docker push test/ubuntu:v1.0

基於DockerFile創建鏡像------【此處省略,後邊我們在Dockerfile文件方式創建鏡像時詳解】

當我們從docker鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改。

  • 1.從已經創建的容器中更新鏡像,並且提交這個鏡像
  • 2.使用 Dockerfile 指令來創建一個新的鏡像

構建鏡像,我們使用docker build,從零開始創建一個新的鏡像。爲此,我們需要創建一個Dockerfile文件,其中包含指令來告訴我們Docker如何構建我們的鏡像。


願你就像早晨八九點鐘的太陽,活力十足,永遠年輕。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章