Docker學(xué)習(xí)筆記(1)-Docker鏡像

獲取鏡像

$docker pull NAME[:TAG]
如果不加TAG則表示下載最新的鏡像,一個(gè)鏡像由“名稱”+“標(biāo)簽決定”
使用不同鏡像倉(cāng)庫(kù)服務(wù)器情況下,可能會(huì)出現(xiàn)鏡像重名:
嚴(yán)格的將,鏡像的倉(cāng)庫(kù)名稱中還應(yīng)該添加倉(cāng)庫(kù)地址(即registry,注冊(cè)服務(wù)器)作為前綴,如果使用Docker Hub服務(wù),該前綴可以忽略。
即:$docker pull ubuntu:14.04相當(dāng)于$docker pull registry.hub.docker.com/ubuntu:14.04

image

pull子命令:

  • -a, --all-tags=true|false:是否獲取倉(cāng)庫(kù)中的所有鏡像,默認(rèn)為否。
    使用鏡像:例如利用該鏡像創(chuàng)建一個(gè)容器,在其中運(yùn)行bash應(yīng)用,執(zhí)行ping localhost:
    $docker run -it unbuntu[:TAG] bash
    root@f46310567509:/# ping localhost

如果提示command not found,則
$apt-get update
$apt-get install iputils-ping
詳細(xì)見:http://blog.csdn.net/silentwolfyh/article/details/52336007

image

image

image


查看鏡像信息

docker images [OPTIONS][REPOSITORY[:TAG]]
OPTIONS說明:

  • -a :列出本地所有的鏡像(含中間映像層,默認(rèn)情況下,過濾掉中間映像層);
  • —digests :顯示鏡像的摘要信息;
  • -f :顯示滿足條件的鏡像;
  • —format :指定返回值的模板文件;
  • --no-trunc :顯示完整的鏡像信息;
  • -q :只顯示鏡像ID。
    使用docker images命令列出鏡像
    image
  • 鏡像的倉(cāng)庫(kù):ubuntu的系列鏡像由ubuntu倉(cāng)庫(kù)保存
  • 標(biāo)簽
  • 鏡像ID,鏡像的唯一標(biāo)識(shí)
  • 創(chuàng)建的時(shí)間,說明鏡像最后跟新時(shí)間
  • 鏡像大小

鏡像標(biāo)簽

使用tag命令添加鏡像標(biāo)簽,可以發(fā)現(xiàn)多了一個(gè)myubuntu:latest標(biāo)簽,其id和ubuntu:latest是一樣的,其實(shí)他們都指向同一個(gè)鏡像,只是別名不同,標(biāo)簽相當(dāng)于起到了鏈接的作用。


image

查看鏡像詳細(xì)信息

使用docker inspect命令查看詳細(xì)信息,包括制作者、適應(yīng)架構(gòu)、各層的數(shù)字摘要等:

image

輸出一個(gè)json文件

[
  {
    "Id":"sha256:8b72bba4485f1004e8378bc6bc42775f8d4fb851c750c6c0329d3770b3a09086",
    "RepoTags":[
      "myubuntu:latest",
      "ubuntu:latest"
    ],
    "RepoDigests":[
      "ubuntu@sha256:2b9285d3e340ae9d4297f83fed6a9563493945935fc787e98cc32a69f5687641"
    ],
    "Parent":"",
    "Comment":"",
    "Created":"2017-09-13T03:58:50.383839319Z",
    "Container":"ee87d884293ece0d9fa040a43ffb75097264185f94437a0d1fc2ddfd3c82ca4b",
    "ContainerConfig":{
      "Hostname":"ee87d884293e",
      "Domainname":"",
      "User":"",
      "AttachStdin":false,
      "AttachStdout":false,
      "AttachStderr":false,
      "Tty":false,
      "OpenStdin":false,
      "StdinOnce":false,
      "Env":[
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      ],
      "Cmd":[
        "/bin/sh",
        "-c",
        "#(nop) ",
        "CMD ["/bin/bash"]"
      ],
      "ArgsEscaped":true,
      "Image":"sha256:5bf9c8f025cb9bdfec431fbf2a39e1d25117a94ce2b10db01db9630addfc5e37",
      "Volumes":null,
      "WorkingDir":"",
      "Entrypoint":null,
      "OnBuild":null,
      "Labels":{
?
      }
    },
    "DockerVersion":"17.06.2-ce",
    "Author":"",
    "Config":{
      "Hostname":"",
      "Domainname":"",
      "User":"",
      "AttachStdin":false,
      "AttachStdout":false,
      "AttachStderr":false,
      "Tty":false,
      "OpenStdin":false,
      "StdinOnce":false,
      "Env":[
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      ],
      "Cmd":[
        "/bin/bash"
      ],
      "ArgsEscaped":true,
      "Image":"sha256:5bf9c8f025cb9bdfec431fbf2a39e1d25117a94ce2b10db01db9630addfc5e37",
      "Volumes":null,
      "WorkingDir":"",
      "Entrypoint":null,
      "OnBuild":null,
      "Labels":null
    },
    "Architecture":"amd64",
    "Os":"linux",
    "Size":120102168,
    "VirtualSize":120102168,
    "GraphDriver":{
      "Data":{
        "LowerDir":"/var/lib/docker/overlay2/579119ec0ba94ba9c2b510b75228f366c14fc1a29302f29a7c915946f9038c54/diff:/var/lib/docker/overlay2/2286560d99b26f3e25b0cb65f100915b2bf3848ff483b2b46f036a782fe92e87/diff:/var/lib/docker/overlay2/90c4f96886f317dfc958dededefa77f9a648011b7002e42c458b61022e950ab9/diff:/var/lib/docker/overlay2/fba0d170b11c979215b1fe227f86b3499427f1908f3f70dbddde2f94d433ee77/diff",
        "MergedDir":"/var/lib/docker/overlay2/95395204f6fdd03d04da60ee7d1c1e7ff4bf7e96eb789eca0cdeedf58125aecb/merged",
        "UpperDir":"/var/lib/docker/overlay2/95395204f6fdd03d04da60ee7d1c1e7ff4bf7e96eb789eca0cdeedf58125aecb/diff",
        "WorkDir":"/var/lib/docker/overlay2/95395204f6fdd03d04da60ee7d1c1e7ff4bf7e96eb789eca0cdeedf58125aecb/work"
      },
      "Name":"overlay2"
    },
    "RootFS":{
      "Type":"layers",
      "Layers":[
        "sha256:8aa4fcad5eeb286fe9696898d988dc85503c6392d1a2bd9023911fb0d6d27081",
        "sha256:ebf3d6975c708f538b14a5267afd2c4c64e8243d195aa11d878e566a7e64c727",
        "sha256:a76db6d8fac422acd5fb6c28166c906c202639e4e833cf88c7d4965b806c5437",
        "sha256:cd1d6655b4e44bb95df75bd2ecde4ad6799dd23337a9dedadf6e0b7f0efdc27e",
        "sha256:3996d0debc49f9a96c25d4ab7a5c9e824229c09976551b80ab0da70fa993a10d"
      ]
    }
  }
]

可以使用-f參數(shù)來(lái)指定獲取某一項(xiàng)參數(shù):

image

參考http://www.cnblogs.com/boshen-hzb/p/6376674.html


鏡像歷史

使用history命令查看鏡像歷史。
鏡像文件由多個(gè)層組成,可以用history命令,顯示各層的創(chuàng)建信息。

image


搜尋鏡像

使用docker search命令可以搜索遠(yuǎn)端倉(cāng)庫(kù)中共享的鏡像,默認(rèn)搜索官方倉(cāng)庫(kù)總的鏡像。用法為docker search TERM,支持的主要參數(shù)包括:

  • --automated=true|false:僅顯示自動(dòng)創(chuàng)建的鏡像,默認(rèn)為否
  • --no-trunc=true|false:輸出信息不截?cái)囡@示,默認(rèn)為否
  • -s, --stars=X:指定僅顯示評(píng)價(jià)為指定星級(jí)以上的鏡像,默認(rèn)為0,即輸出所有鏡像。
    例如,搜索所有自動(dòng)創(chuàng)建的3星級(jí)以上的帶 nginx關(guān)鍵字的鏡像:
    image

刪除鏡像

使用docker rmi命令可以刪除鏡像,命令格式為docker rmi IMAGE [IMAGE],其中IMAGE可以為標(biāo)簽或ID。
例如,要?jiǎng)h除掉myubuntu:latest鏡像,可以使用如下命令

image

可以看出,如果一個(gè)鏡像有多個(gè)標(biāo)簽,只會(huì)刪除多個(gè)標(biāo)簽中指定的標(biāo)簽而已,鏡像不會(huì)受影響。
如果某個(gè)鏡像只有一個(gè)標(biāo)簽時(shí),則要注意,刪除標(biāo)簽就會(huì)刪除鏡像。
現(xiàn)在只有一個(gè)標(biāo)簽,然后嘗試刪除鏡像:
image

刪除失敗,因?yàn)橛腥萜鬟€在鏡像上面運(yùn)行
可以使用docker ps -a命令查看本機(jī)上的所有容器:
image

可以看出有容器在鏡像上運(yùn)行,所以不能直接刪除,當(dāng)然可以使用命令
$docker rmi -f ubuntu:latest來(lái)強(qiáng)制刪除,但是不建議這樣做,建議先刪除容器,然后刪除鏡像:
我們先使用-f參數(shù)來(lái)刪除httpd鏡像:
image

但是發(fā)現(xiàn)鏡像依然存在
image

再次使用$docker ps -a命令來(lái)查看容器,發(fā)現(xiàn)仍然有容器運(yùn)行
image

所以并不推薦使用-f參數(shù)來(lái)強(qiáng)制刪除,下面是正確的步驟,先刪除運(yùn)行在鏡像上面的容器,然后再刪除鏡像。
現(xiàn)在先使用$docker rm CONTAINER_ID刪除容器,有一個(gè)錯(cuò)誤,
image

可以看出id為a420...的容器還在運(yùn)行,所以不能刪除,使用$docker ps -a查看刪除情況,
狀態(tài)為未運(yùn)行的容器已經(jīng)刪除,然而運(yùn)行狀態(tài)的并沒有刪除
所以現(xiàn)在需要先使用$docker stop CONTAINER_ID停止運(yùn)行的容器
image

可以看出id為a420...的容器狀態(tài)已經(jīng)改變,現(xiàn)在可以刪除了
image

可以看出,容器已經(jīng)被刪除了,現(xiàn)在就可以去刪除httpd鏡像了:
image

使用$docker rmi IMAGE_ID刪除鏡像,然后使用$docker images查看刪除情況,可以看出httpd鏡像已經(jīng)全部刪除完了。
一次性刪除所有容器
image


創(chuàng)建鏡像

創(chuàng)建鏡像的方法主要有三種:

  1. 基于已有鏡像的容器創(chuàng)建
  2. 基于本地模板導(dǎo)入
  3. 基于Dockerfile創(chuàng)建
    這里主要介紹前兩種方法,第三種方法后續(xù)學(xué)習(xí)筆記介紹。

基于已有鏡像的容器創(chuàng)建

主要使用docker commit命令。命令格式為
docker commit [OPTIONS] CONTAINER [REPOSITORY [:TAG]]
? 所基于的容器 創(chuàng)建的鏡像的標(biāo)簽
主要的選項(xiàng)包括:

  • -a, author="":作者信息
  • -c, --change=[]:提交的時(shí)候執(zhí)行Dockerfile命令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|USER|VOLUME|WORKDIR
  • -m, --message="":提交消息
  • -p, --pause=true:提交時(shí)暫停容器運(yùn)行
    下面演示怎么根據(jù)已有鏡像的容器創(chuàng)建一個(gè)新的鏡像。
    首先啟動(dòng)一個(gè)鏡像,然后進(jìn)行進(jìn)行一些操作,例如創(chuàng)建一個(gè)test文件,然后退出:
    $docker run -it ubuntu:latest /bin/bash
    root@3548583db1bb:/# touch test
    root@3548583db1bb:/# exit
    記住容器的ID為3548583db1bb。
    image

    然后使用docker images命令查看剛才創(chuàng)建的鏡像,也可以使用docker ps -a來(lái)查看容器。
    接下來(lái)使用·docker commit·命令根據(jù)容器3548583db1bb來(lái)創(chuàng)建一個(gè)新的鏡像。
  • 提交信為:Added a new file
  • 作者信息為:Docker Newbee
  • 源容器:3548583db1bb
  • 被創(chuàng)建的容器的標(biāo)簽:test:0.1


    image

    使用docker image命令查看剛才創(chuàng)建的test:0.1鏡像

基于本地模板導(dǎo)入

用戶可以直接從一個(gè)操作系統(tǒng)模板文件導(dǎo)入一個(gè)鏡像文件,主要使用docker import命令。命令格式為
docker import [OPTIONS] file |URL| -[REPOSITORY[:TAG]]
OPTIONS說明:

  • -c:應(yīng)用docker指令創(chuàng)建鏡像文件
  • -m:提交信息
    要直接導(dǎo)入一個(gè)鏡像,可以使用OpenVZ提供的模板來(lái)創(chuàng)建,或者用其他已導(dǎo)出的鏡像模板來(lái)創(chuàng)建。OPENVZ模板的下載地址為http://openvz.org/Dowload/templates/precreated
    image

存出和載入鏡像

用戶可以使用docker save和docker load命令來(lái)存出和載入鏡像。

存出鏡像

docker save:將指定鏡像保存成tar歸檔文件。
語(yǔ)法:docker save [OPTIONS] IMAGE [IMAGE…]
OPTIONS說明:

  • -o:輸出到文件
    image

    得到了my_ubuntu.tar歸檔

載入鏡像

可以使用docker load將導(dǎo)出的tar文件再導(dǎo)入到本地文件鏡像庫(kù),例如從文件my_ubuntu.tar
docker load:從一個(gè)在stdin上的tar歸檔文件中裝載鏡像
OPTIONS說明:

  • -i, --input="" 從一個(gè)tar歸檔文件中讀入,而不是從stdin中
    $docker load --input my_ubuntu.tar

    $docker load < my_ubuntu.tar

上傳鏡像

可以使用docker push命令上傳鏡像到倉(cāng)庫(kù),默認(rèn)上傳到Docker Hub官方倉(cāng)庫(kù)(需要登錄)。
命令格式為:
docker push NAME[:TAG] | REGISTRY_HOST[:REGISTRY_PORT] /]NAME [:TAG]
先給需要push的鏡像打上標(biāo)簽,因?yàn)榈奈矣脩裘衚ylinxiang,所以改為kylinxiang/push_test:1.0
默認(rèn)是Push到Docker Hub,所以可以看到最后push到的倉(cāng)庫(kù)為docker.io/kylinxiang

image

之后就可以在Docker Hub上面就可以查看Push的鏡像

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

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

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