鏡像
鏡像是Docker的三大核心概念之一。
Docker運行容器前需要本地存在對應(yīng)的鏡像,如果鏡像不存在本地,Docker會嘗試先從默認鏡像
倉庫下載(默認使用Docker Hub公共注冊服務(wù)器中的倉庫),用戶也可以通過配置,使用自定義的鏡像倉庫。
本篇文章要講的是圍繞鏡像這一核心概念的具體操作,包含以下幾個方面:
- 如何使用pull命令從Docker Hub倉庫中下載鏡像文件到本地
- 如何查看本地已有的鏡像信息
- 如何在遠端倉庫使用search命令進行搜索和過濾
- 如何刪除鏡像標簽和鏡像文件
- 如何創(chuàng)建用戶定制的鏡像并且保存為外部文件,最后如何向Docker Hub倉庫推送自己的鏡像文件。
3.1 獲取鏡像
鏡像是Docker容器運行的前提。
我們可以使用docker pull命令從網(wǎng)絡(luò)上下載鏡像。該命令的格式為docker pull NAME[:TAG]。對于Docker鏡像來說,如果不顯式地指定TAG,則默認會選擇latest標簽,即下載倉庫中最新版本的鏡像。
[root@private_vpn docker_test]# pwd
/docker_test
[root@private_vpn docker_test]# ls -l
total 0
[root@private_vpn docker_test]# docker pull ubuntu
Using default tag: latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
660c48dd555d: Pull complete
4c7380416e78: Pull complete
421e436b5f80: Pull complete
e4ce6c3651b3: Pull complete
be588e74bd34: Pull complete
Digest: sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
[root@private_vpn docker_test]# ls -l
total 0
[root@private_vpn docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 20c44cd7596f 7 days ago 122.8 MB
docker.io/centos latest d123f4e55e12 3 weeks ago 196.6 MB
根據(jù)上面的顯示可以看出,pull完鏡像后并沒有在當前目前保存下一個文件,然后使用docker images
命令可以看出剛才pull下的鏡像。
參數(shù)釋義:
REPOSITORY: 來自哪個倉庫,比如ubuntu倉庫、centos倉庫
TAG: 鏡像的標簽信息,如 latest
IMAGE ID: 鏡像的ID號(唯一)
CREATE: 鏡像創(chuàng)建的時間
SIZE: 鏡像的大小
為了更方便的在后續(xù)工作種使用某個鏡像,還可以使用docker tag
命令位本地鏡像添加新的標簽。
docker tag IMAGEID(鏡像id) REPOSITORY:TAG(倉庫:標簽)
[root@private_vpn docker_test]# docker tag d123f4e55e12 docker.io/centos:CentOS7
[root@private_vpn docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 20c44cd7596f 7 days ago 122.8 MB
docker.io/centos CentOS7 d123f4e55e12 3 weeks ago 196.6 MB
docker.io/centos latest d123f4e55e12 3 weeks ago 196.6 MB
3.2 查看鏡像
查看鏡像本地已有的鏡像,比較簡單,一條命令:
docker images
3.3 使用search命令進行搜索遠端倉庫鏡像
使用docker search 命令可以搜索遠端倉庫中共享的鏡像,默認搜索官方倉庫中的鏡像。用法為docker search TERM,支持的參數(shù)主要包括:
--automated=true|false: 僅顯示自動創(chuàng)建的鏡像,默認為否
--no-trunc=true|false: 輸出信息不截斷顯示,默認為否
-s,--stars=X: 指定只顯示評價為指定星級以上的鏡像,默認為0,即輸出所有鏡像。
eg: 搜索所有自動創(chuàng)建的評價為3+的帶nginx關(guān)鍵字的鏡像,如下所示:
docker search --automated -s 3 nginx
3.4 刪除鏡像
使用鏡像ID刪除鏡像
當使用docker rmi 命令后面跟上鏡像ID(也可以是ID能進行區(qū)分的部分前綴串或鏡像的標簽)時,會嘗試刪除所有指向該鏡像的標簽,然后刪除該鏡像文件本身。
eg:
[root@private_vpn docker_test]# docker tag d123f4e55e12 docker.io/centos:CentOS7
[root@private_vpn docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 20c44cd7596f 7 days ago 122.8 MB
docker.io/centos CentOS7 d123f4e55e12 3 weeks ago 196.6 MB
docker.io/centos latest d123f4e55e12 3 weeks ago 196.6 MB
[root@private_vpn docker_test]# docker rmi d123f4e55e12
Error response from daemon: conflict: unable to delete d123f4e55e12 (must be forced) - image is referenced in one or more repositories
[root@private_vpn docker_test]#
[root@private_vpn docker_test]# docker rmi -f d123f4e55e12
Untagged: docker.io/centos:CentOS7
Untagged: docker.io/centos:latest
Untagged: docker.io/centos@sha256:4565fe2dd7f4770e825d4bd9c761a81b26e49cc9e3c9631c58cfc3188be9505a
Deleted: sha256:d123f4e55e1200156d9cbcf4421ff6d818576e4f1e29320a408c72f022cfd0b1
Deleted: sha256:cf516324493c00941ac20020801553e87ed24c564fb3f269409ad138945948d4
根據(jù)上面可以看出先刪除了我新創(chuàng)建的tag,然后刪除鏡像文件本身,值得注意的是另外添加了標簽的鏡像在常規(guī)刪除的時候會報錯,只有強制刪除才起作用。
注意:當有該鏡像創(chuàng)建的容器存在時,鏡像文件默認是無法被刪除的,例如:
現(xiàn)在我來刪除已經(jīng)存在的ubuntu鏡像:
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebc03d33db4e 20c44cd7596f "/bin/bash" 9 minutes ago Exited (1) 8 minutes ago loving_mahavira
[root@private_vpn docker_test]# docker rmi 20c44cd7596f
Error response from daemon: conflict: unable to delete 20c44cd7596f (must be forced) - image is being used by stopped container ebc03d33db4e
看得出無法刪除。那就試試強制刪除,對于正在被容器使用的鏡像慎用。
[root@private_vpn docker_test]# docker rmi -f 20c44cd7596f
Untagged: docker.io/ubuntu:latest
Untagged: docker.io/ubuntu@sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
Deleted: sha256:20c44cd7596ff4807aef84273c99588d22749e2a7e15a7545ac96347baa65eda
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebc03d33db4e 20c44cd7596f "/bin/bash" 11 minutes ago Exited (1) 10 minutes ago loving_mahavira
[root@private_vpn docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
看的出來鏡像已經(jīng)被刪除,容器還在運行。
進入容器:
[root@private_vpn docker_test]# docker attach ebc03d33db4e
You cannot attach to a stopped container, start it first
可以看出此時容器已經(jīng)進不去了,所以對于被容器使用的鏡像的刪除要慎重。
對于以上的實驗,很多命令暫時未涉及,后面會講到。此篇文章的例子主要是說明容器和鏡像的關(guān)系。
綜上,如果我們要刪除鏡像正確的操作步驟應(yīng)該是:
- 先確認機器上存在的容器。
docker ps -a
- 然后刪除依賴鏡像的容器
docker rm 容器ID
- 最后再刪除相關(guān)鏡像文件
docker rmi 鏡像ID
eg:
[root@private_vpn docker_test]# cat /tmp/docker.txt
www
[root@private_vpn docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest d123f4e55e12 3 weeks ago 196.6 MB
[root@private_vpn docker_test]# docker run -t -i d123f4e55e12 /bin/bash
[root@ef6e7768c6e2 /]# ls -l /tmp/
total 4
-rwx------ 1 root root 836 Sep 11 15:53 ks-script-q6TWGF
-rw------- 1 root root 0 Sep 11 15:51 yum.log
[root@ef6e7768c6e2 /]#
上面看出我已經(jīng)進入到新啟動的容器內(nèi)了。
exit退出容器
然后按照上面的步驟來正確的刪除容器。
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef6e7768c6e2 d123f4e55e12 "/bin/bash" 2 minutes ago Exited (127) About a minute ago infallible_boyd
[root@private_vpn docker_test]# docker rm ef6e7768c6e2
ef6e7768c6e2
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@private_vpn docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest d123f4e55e12 3 weeks ago 196.6 MB
[root@private_vpn docker_test]# docker rmi d123f4e55e12
Untagged: docker.io/centos:latest
Untagged: docker.io/centos@sha256:4565fe2dd7f4770e825d4bd9c761a81b26e49cc9e3c9631c58cfc3188be9505a
Deleted: sha256:d123f4e55e1200156d9cbcf4421ff6d818576e4f1e29320a408c72f022cfd0b1
Deleted: sha256:cf516324493c00941ac20020801553e87ed24c564fb3f269409ad138945948d4
[root@private_vpn docker_test]#
[root@private_vpn docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
測試成功。
3.5 創(chuàng)建鏡像
創(chuàng)建鏡像的方法主要有3種:基于已有鏡像的容器創(chuàng)建、基于本地模板導(dǎo)入、基于Dockerfile創(chuàng)建。
此處先熟悉下前兩種方式,而基于Dockerfile的創(chuàng)建方法會在后面詳細說明。
1.基于已有鏡像的容器創(chuàng)建
該方法主要是使用docker commit
命令。命令格式為:docker commit [options] container [repository[:tag]]
,主要選項包括:
- -a,--author="": 作者信息;
- -c,--change=[]: 提交的的時候執(zhí)行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
- -m,--message="": 提交信息;
- -p,--pause=ture: 提交時暫停容器運行。
下面將演示如何使用該命令創(chuàng)建一個新鏡像。首先,啟動一個鏡像,并在其中進行修改操作,可以創(chuàng)建一個test文件,之后退出:
基于centos鏡像創(chuàng)建一個容器,并直接(-d參數(shù))放入后臺運行
[root@private_vpn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 9e7424e5dbae 13 days ago 108.5 MB
docker.io/nuagebec/ubuntu latest 7c2ea61fd57e 2 weeks ago 329.4 MB
docker.io/ubuntu latest 20c44cd7596f 2 weeks ago 122.8 MB
docker.io/centos latest d123f4e55e12 4 weeks ago 196.6 MB
[root@private_vpn ~]# docker run -itd d123 /bin/bash #直接放入后臺運行
375fb5e3f2baa65c002754ab339ae8291d88233821b7db0dddf2f43fd195dd38
[root@private_vpn ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
375fb5e3f2ba d123 "/bin/bash" 5 seconds ago Up 4 seconds admiring_rosalind
be037923b36f 7c2ea61fd57e "/bin/bash" 5 days ago Up 5 days 22/tcp cocky_blackwell
d1311a650a77 nginx "nginx -g 'daemon off" 5 days ago Up 5 days 0.0.0.0:80->80/tcp webserver
6935f8fff19c d123f4e55e12 "/bin/bash" 10 days ago Up 6 days grave_pasteur
進入容器并在相關(guān)目錄下創(chuàng)建一個test文件且寫入一定的內(nèi)容:
[root@private_vpn ~]# docker exec -it 375 /bin/bash
[root@375fb5e3f2ba /]# ls -l /tmp/
total 4
-rwx------ 1 root root 836 Sep 11 15:53 ks-script-q6TWGF
-rw------- 1 root root 0 Sep 11 15:51 yum.log
[root@375fb5e3f2ba /]# echo "test123" >> /tmp/test
[root@375fb5e3f2ba /]# cat /tmp/test
test123
此時該容器跟原centos(鏡像ID: d123f4e55e12)鏡像相比,已經(jīng)發(fā)生了變化,可以使用docker commit
命令來提交為一個新的鏡像。提交時可以使用ID或名稱來指定容器。
[root@private_vpn ~]# docker commit -m "Added a new file" -a "daquan" 375 test:0.1
sha256:56cb38d68ab4e5518e5a09d58abc342020342ed0244dec53b5082f80b1221a9b
[root@private_vpn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 56cb38d68ab4 6 seconds ago 196.6 MB
docker.io/nginx latest 9e7424e5dbae 13 days ago 108.5 MB
docker.io/nuagebec/ubuntu latest 7c2ea61fd57e 2 weeks ago 329.4 MB
docker.io/ubuntu latest 20c44cd7596f 2 weeks ago 122.8 MB
docker.io/centos latest d123f4e55e12 4 weeks ago 196.6 MB
此時可以看到多了一個鏡像,ID為56cb38d68ab4。且生成了一個test倉庫,tag是0.1。符合上面的命令輸入。
2. 基于本地模板導(dǎo)入
用戶也可以直接從一個操作系統(tǒng)模板文件導(dǎo)入一個鏡像,主要使用docker import
命令。命令格式為docker import [options] file|URL|- [repository[:tag]]
要直接導(dǎo)入一個鏡像,可以使用OpenVZ提供的模板來創(chuàng)建,或者用其他已導(dǎo)出的鏡像模板來創(chuàng)建。OPENVZ模板的下載地址為https://openvz.org/Download/templates/precreated
eg: 下載了ubuntu-14.04-x86_64-minimal.tar.gz的模板壓縮包后,之后使用以下命令導(dǎo)入:
cat ubuntu-14.04-x86_64-minimal.tar.gz|docker import - ubuntu:14.04-x86_64
如下所示:
[root@private_vpn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 56cb38d68ab4 17 minutes ago 196.6 MB
docker.io/nginx latest 9e7424e5dbae 13 days ago 108.5 MB
docker.io/nuagebec/ubuntu latest 7c2ea61fd57e 2 weeks ago 329.4 MB
docker.io/ubuntu latest 20c44cd7596f 2 weeks ago 122.8 MB
docker.io/centos latest d123f4e55e12 4 weeks ago 196.6 MB
[root@private_vpn ~]#
[root@private_vpn ~]# cat ubuntu-14.04-x86_64-minimal.tar.gz|docker import - ubuntu:14.04-x86_64
sha256:f52ea2cf900c9adfeae7e33010de9dd2a89a5988a883fed3377e5f962e5b6279
[root@private_vpn ~]#
[root@private_vpn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-x86_64 f52ea2cf900c 9 seconds ago 214.8 MB
test 0.1 56cb38d68ab4 17 minutes ago 196.6 MB
docker.io/nginx latest 9e7424e5dbae 13 days ago 108.5 MB
docker.io/nuagebec/ubuntu latest 7c2ea61fd57e 2 weeks ago 329.4 MB
docker.io/ubuntu latest 20c44cd7596f 2 weeks ago 122.8 MB
docker.io/centos latest d123f4e55e12 4 weeks ago 196.6 MB
可以看到我們剛才創(chuàng)建的鏡像(f52ea2cf900c)已經(jīng)有了,可以再以此鏡像為基礎(chǔ)創(chuàng)建一個容器并進入容器看看:
[root@private_vpn ~]# docker run -tid f52 /bin/bash
44eca7876e7c6806655edf539f4e1c313d109db114d5974842345798d1587f63
[root@private_vpn ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44eca7876e7c f52 "/bin/bash" 5 seconds ago Up 4 seconds ecstatic_babbage
375fb5e3f2ba d123 "/bin/bash" 29 minutes ago Up 29 minutes admiring_rosalind
be037923b36f 7c2ea61fd57e "/bin/bash" 5 days ago Up 5 days 22/tcp cocky_blackwell
d1311a650a77 nginx "nginx -g 'daemon off" 5 days ago Up 5 days 0.0.0.0:80->80/tcp webserver
6935f8fff19c d123f4e55e12 "/bin/bash" 10 days ago Up 6 days grave_pasteur
[root@private_vpn ~]#
[root@private_vpn ~]# docker exec -ti 44e /bin/bash
root@44eca7876e7c:/# ls
bin boot dev etc fastboot home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
root@44eca7876e7c:/#
root@44eca7876e7c:/# uname -r
3.10.0-327.10.1.el7.x86_64
至此,基于本地模板導(dǎo)入創(chuàng)建鏡像的方式測試完了。
3.6 存出和載入鏡像
用戶可以使用docker save
和docker load
命令來存出和載入鏡像。
1.存出鏡像
如果要導(dǎo)出鏡像到本地文件,可以使用docker save命令。例如,導(dǎo)出本地的ubuntu:14.04-x86_64鏡像文件為Ubuntu_14.04.tar,如下所示:
[root@private_vpn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-x86_64 f52ea2cf900c About an hour ago 214.8 MB
test 0.1 56cb38d68ab4 About an hour ago 196.6 MB
docker.io/nginx latest 9e7424e5dbae 13 days ago 108.5 MB
docker.io/nuagebec/ubuntu latest 7c2ea61fd57e 2 weeks ago 329.4 MB
docker.io/ubuntu latest 20c44cd7596f 2 weeks ago 122.8 MB
docker.io/centos latest d123f4e55e12 4 weeks ago 196.6 MB
[root@private_vpn ~]#
[root@private_vpn ~]# docker save -o ubuntu_14.04.tar ubuntu:14.04-x86_64
[root@private_vpn ~]# ls -lh
total 291M
-rw-r--r-- 1 root root 36 Dec 2 19:08 1.txt
-rw-r--r-- 1 root root 14 Dec 6 00:48 test.txt
-rw------- 1 root root 216M Dec 6 16:11 ubuntu_14.04.tar
-rw-r--r-- 1 root root 75M Nov 27 2016 ubuntu-14.04-x86_64-minimal.tar.gz
之后,用戶就可以通過復(fù)制"ubuntu_14.04.tar"文件將該鏡像分享給其他人了。
那么,分享給別人后,別人又如何載入此鏡像到自己的本地呢?
2. 載入鏡像
可以使用docker load
將導(dǎo)出的tar文件再導(dǎo)入到本地鏡像庫,例如從文件"ubuntu_14.04.tar"導(dǎo)入鏡像到本地鏡像列表,如下所示:
[root@private_vpn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 56cb38d68ab4 About an hour ago 196.6 MB
docker.io/nginx latest 9e7424e5dbae 13 days ago 108.5 MB
docker.io/nuagebec/ubuntu latest 7c2ea61fd57e 2 weeks ago 329.4 MB
docker.io/ubuntu latest 20c44cd7596f 2 weeks ago 122.8 MB
docker.io/centos latest d123f4e55e12 4 weeks ago 196.6 MB
[root@private_vpn ~]#
[root@private_vpn ~]#
[root@private_vpn ~]# docker load --input ubuntu_14.04.tar
fd58c1324b91: Loading layer [==================================================>] 225.8 MB/225.8 MB
Loaded image: ubuntu:14.04-x86_64
[root@private_vpn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-x86_64 f52ea2cf900c About an hour ago 214.8 MB
test 0.1 56cb38d68ab4 About an hour ago 196.6 MB
docker.io/nginx latest 9e7424e5dbae 13 days ago 108.5 MB
docker.io/nuagebec/ubuntu latest 7c2ea61fd57e 2 weeks ago 329.4 MB
docker.io/ubuntu latest 20c44cd7596f 2 weeks ago 122.8 MB
docker.io/centos latest d123f4e55e12 4 weeks ago 196.6 MB
如上所示,鏡像已載入。因為我只有一臺機器做測試,所以我就先把之前的"ubuntu:14.04-x86_64"鏡像文件刪除了,然后再次導(dǎo)入"ubuntu_14.04.tar"鏡像文件,可以看到創(chuàng)建了鏡像。
這將導(dǎo)入鏡像及其相關(guān)的元數(shù)據(jù)信息(包括標簽等)。導(dǎo)入成功后,可以使用docker images命令進行查看。