Docker 學習 - 2. docker的鏡像


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

本人編撰,嚴禁抄襲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容