鏡像
它是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:鏡像的倉庫名字 查看幫助: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如何構建我們的鏡像。