
Docker運行容器錢需要本地存在對應(yīng)的鏡像,如果鏡像不存在本地,Docker會嘗試先從默認的鏡像倉庫下載。
獲取鏡像
鏡像是Docker運行容器的前提。
可以通過使用docker pull命令從網(wǎng)絡(luò)上下載鏡像。該命令的格式為docker pull NAME[:TAG].
對于Docker鏡像來說,如果沒有顯式指定TAG,則會默認選擇latest標簽,也就是下載倉庫中最新版本的鏡像。例如,我們想從Docker hub的ubuntu倉庫中下載一個新的Ubuntu操作系統(tǒng)的鏡像。
$ sudo docker pull ubuntu
ubuntu:latest: The image you are pulling has been verified
d504ab3987c2: Downloading [========> ] 25.41 MB/201.6 MB 51m14s
ccb62158e970: Download complete
34a7qade2bec: Download complete
...
下載過程中可以看出,鏡像文件一般由若干層組成,行首的d504ab3987c2或者ccb62158e970字符串代表了各層的ID,下載過程中會獲取并輸出鏡像的各層信息。層(Layer)其實是AUFS(聯(lián)合文件系統(tǒng))中的重要概念,是實現(xiàn)增量保存和更新的基礎(chǔ)。
此外用戶也可以選擇通過指定標簽下載,
$ sudo docker pull ubuntu:14.04
或者特定的倉庫下載,不過需要在倉庫名稱之前指定完整的倉庫注冊服務(wù)器地址。
$ sudo docker pull dl.dockerpool.com:5000/ubuntu
查看鏡像信息
使用docker images 命令可以列出本地主機上已有的鏡像。
例如,下面的命令列出了本地剛從官方下載的 ubuntu:14.04 鏡像,以及DockerPool鏡像源下載的ubuntu:latest 鏡像。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.0 5506de2b643b 1 weeks ago 197.8 MB
dl.dockerpool.com: 5000/ubuntu latest 5506de2b643b 1 weeks ago 197.8 MB
如上所示,可以看到幾個字段信息:
- 來自于哪個倉庫,比如ubuntu倉庫
- 鏡像的TAG,即標簽信息, 比如14.04
- 鏡像 ID
- 創(chuàng)建時間
- 鏡像大小
其中ID信息十分重要,它唯一地標識了鏡像。
TAG信息是為了標記來自同一個倉庫的不同鏡像。例如ubuntu倉庫中有多個鏡像,通過TAG來區(qū)分發(fā)行版本,例如10.04、12.04、12.10、13.04、14.04等標簽。
為了方便在后續(xù)工作中使用這個鏡像,還可以使用 docker tag 命令為本地鏡像添加新的標簽。例如添加一個新的 ubuntu:latest鏡像標簽如下:
$ sudo docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
再次使用docker images
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.0 5506de2b643b 1 weeks ago 197.8 MB
dl.dockerpool.com: 5000/ubuntu latest 5506de2b643b 1 weeks ago 197.8 MB
ubuntu latest 5506de2b643b 1 weeks ago 192.8 MB
我們會發(fā)現(xiàn),不同標簽的鏡像ID 是一致的,這說明他們實際上指向了同一個鏡像文件,只不過別名不同而已。
使用docker inspect命令可以獲取該鏡像的詳細信息。
$ sudo docker inspect 5506de2b643b
[{
"Architecture": "amd64",
"Author": "",
"Comment": "",
"Config": {
...
}
...
}]
執(zhí)行docker inspect命令返回的是一個json的字符串,如果只是需要其中一項內(nèi)容,可以使用 -f 參數(shù)來指定,例如,獲取鏡像的Architecture信息.
$ sudo docker inspect -f {{".Architecture"}} 550
注:550是該鏡像ID的前3個字符,通??梢允褂迷揑D的前若干字符組成的可區(qū)分子串來替代完整的ID.
搜索鏡像
使用docker search命令可以搜索遠程倉庫中共享的鏡像,例如,搜索帶mysql關(guān)鍵字的鏡像如下所示:
dp_user@rqalnxgrid4:~> sudo docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 8178 [OK]
mariadb MariaDB is a community-developed fork of MyS… 2785 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 610 [OK]
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 192 [OK]
...
刪除鏡像
使用docker rmi命令可以刪除鏡像,命令格式為docker rmi IMAGE,IMAGE可以使標簽或者ID。
例如,要刪除 dl.dockerpool.com:5000/ubuntu:latest鏡像,可以使用如下命令:
$ sudo rmi dl.dockerpool.com:5000/ubuntu
Untagged: dl.dockerpool.com:5000/ubuntu:latest
有的人可能會擔心,本地的ubuntu:latest鏡像是否會受影響,關(guān)于這個問題,無需擔心,因為當一個鏡像擁有多個標簽的時候,docker rmi命令指示刪除了該鏡像多個標簽中的指定標簽,并不影響鏡像文件。但如果當鏡像只剩下一個標簽就需要小心了,這時候如果再使用docker rmi有可能就會徹底刪除該鏡像。
不過需要注意的是,有的時候,在刪除鏡像之后,假如利用該鏡像已經(jīng)創(chuàng)建了一個容器,那么直接刪除鏡像,Docker就會提示有容器正在運行,無法刪除。
$ sudo docker rmi ubuntu
Error response from daemon: Conflict, cannot delete 5506de2b643b because the container e812617b41f6 is using it, use -f to force
因此正確的做法是,先刪除依賴該鏡像的所有容器,然后再刪除鏡像。首先刪除容器 e812617b41f6.
創(chuàng)建鏡像
創(chuàng)建鏡像的方法有三種:
- 基于已有鏡像的容器創(chuàng)建
- 基于本地模板導入
- 基于Dockerfile創(chuàng)建
基于已有鏡像的容器創(chuàng)建
該方法主要是使用docker commit命令,其命令格式是docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要選項是
-a, --author="" 作者信息
-m, --message="" 提交消息
-p, --pause=true 提交時暫時容器運行
下面做一個演示,演示過程是,首先啟動一個鏡像,并在其中進行修改,創(chuàng)建一個test文件,然后退出。
$ sudo docker run -it ubuntu:14.04 /bin/bash
root@a925cbb40b3f0: /# touch test
root@a925cbb40b3f0: /# exit
此時,容器的ID是a925cbb40b3f0, 這與原來的ubuntu:14.04鏡像相比,已經(jīng)發(fā)生了改變,可使用docker commit命令提交一個新的鏡像。提交時可以使用id或者名稱指定容器。
$ sudo docker commit -m "Add a new file" -a "Docker Newbee" a925cbb40b3f0 test
************adbewedf9834**************
然后就能夠看到鏡像的ID 信息了,************adbewedf9834**************
基于本地模板導入
也可以直接從一個操作系統(tǒng)模板文件導入一個鏡像。OPENVZ模板的下載地址為http://openvz.org/Download/templates/precreated.
比如,我下載了一個ubuntu14.04的模板壓縮包以后,使用以下命令導入:
$ sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
存出和載入鏡像
存出鏡像
如果要存出鏡像到本地文件,可以使docker save命令,例如,存出本地ubuntu:14.04鏡像為文件ubuntu_14.04.tar:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c4ff7513909d 5 weeks ago 225.4MB
載入鏡像
可以使用docker load從存出的本地文件中再導入到本地鏡像庫,例如從文件ubuntu_14.04.tar 導入鏡像到本地鏡像列表,如下所示:
$ sudo docker load --input ubuntu_14.04.tar
或者是
$ sudo docker load < ubuntu_14.04.tar
這將導入鏡像以及其相關(guān)的元數(shù)據(jù)信息,可以使用docker images命令進行查看。
上傳鏡像
可以使用docker push命令上傳鏡像到倉庫,命令格式為docker push NAME[:TAG].用戶在DockerHub網(wǎng)站注冊以后,即可上傳自制的鏡像,例如用戶user上傳本地的 test:latest 鏡像,可以先添加新的標簽 user/ test:latest,然后用docker push命令上傳鏡像。
$sudo docker tag test: latest user/test:latest
$sudo docker push user/test: latest
The push refers to a repository [base/163] (len:1)
Sending image list
Please login prior to push:
Username:
Password:
Email: xxx@xxx.com
本人編撰,嚴禁抄襲