Docker系列(三):Docker鏡像管理

在之前的文章中,其實已經對鏡像做出了說明,鏡像其實就是容器中的文件系統,也可以說是一個極度精簡的Linux程序運行環境。而在上一篇文章的末尾,運行第一個docker(hello-world)的輸出也給出了容器運行的相關步驟說明,其中就包含鏡像的獲取,Docker守護進程從Docker Hub上拉取一個名爲hello-world的鏡像到本地,然後Docker守護進程創建一個新的容器,從而輸出信息到終端。


Docker鏡像倉庫:

鏡像存儲中的核心概念倉庫(Repository)是鏡像存儲的位置。Docker註冊服務器(Registry)是倉庫存儲的位置。每個倉庫包含不同的鏡像。

比如一個鏡像名稱 ubuntu:14.04,冒號前面的ubuntu是倉庫名,後面的14.04是TAG,不同的TAG可以對應相同的鏡像,TAG通常設置爲鏡像的版本號。

Docker Hub 是Docker官方提供公共倉庫,提供大量的常用鏡像,由於國內網絡原因經常連接Docker Hub會比較慢,所以我們也可以選擇一些國內提供類似Docker Hub鏡像服務站點。比如網易雲、阿里雲以及DaoCloud等,我們可以使用它們所提供的加速服務來更加快捷的從Docker Hub上拉取鏡像。這裏爲了後面介紹鏡像的管理更加方便,我們先進行Docker鏡像站點的配置。


修改Docker鏡像站點:

[root@centos7 docker]# cat /etc/docker/daemon.json 
{}
[root@centos7 docker]# echo > /etc/docker/daemon.json 
[root@centos7 docker]# cat >> /etc/docker/daemon.json << EOF
> {
>     "registry-mirrors": ["https://registry.docker-cn.com"]
> }
> EOF
[root@centos7 docker]# cat /etc/docker/daemon.json 
{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@centos7 docker]# systemctl restart docker


查找鏡像:

docker search [image_name][:tag]

002.png

上面的實例是在Docker Hub上查找所有名稱帶有busybox的鏡像,命令執行後的輸出包含如下幾列:

       索引(INDEX)

       倉庫名:鏡像所在的倉庫名稱

       鏡像描述:對鏡像的描述

       星級(STARS):用戶評價,反映出一個鏡像的受歡迎程度

       是否官方(OFFICIAL):是否是官方推出並維護的鏡像(比如Ubuntu,CentOS等在Docker Hub上都有官方團隊管理維護的鏡像)

       自動構建(AUTOMATED):標識這個鏡像是由Docker Hub的自動構建(Automated Build)流程創建的

該命令一共包含如下參數:

       -f, --filter filter :根據提供的條件檢索輸出結果

       --limit int :限定輸出結果的最大值

       --no-index :不截斷輸出結果

       --no-trunc :不截斷輸出結果

[root@centos7 ~]# docker search --filter=is-official=true busybox
INDEX       NAME                DESCRIPTION           STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/busybox   Busybox base image.   1503      [OK]       
[root@centos7 ~]# docker search -f "is-official=true" busybox
INDEX       NAME                DESCRIPTION           STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/busybox   Busybox base image.   1503      [OK]       
[root@centos7 ~]# docker search -f "stars=10" busybox
INDEX       NAME                                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/busybox                     Busybox base image.                             1503      [OK]       
docker.io   docker.io/progrium/busybox                                                            68                   [OK]
docker.io   docker.io/hypriot/rpi-busybox-httpd   Raspberry Pi compatible Docker Image with ...   45                   
docker.io   docker.io/radial/busyboxplus          Full-chain, Internet enabled, busybox made...   21                   [OK]
# 注意:這裏的stars=10檢索的結果並沒有星級等於10的,因爲stars=10是filter的參數格式要求,這裏的檢索條件等同於檢索星級最低爲10且名稱包含busybox的鏡像。
[root@centos7 ~]# docker search --no-trunc -f "is-official=true" -f "stars=10" busybox
INDEX       NAME                DESCRIPTION           STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/busybox   Busybox base image.   1503      [OK]       
[root@centos7 ~]# docker search --no-trunc --limit 25 -f "is-automated=true" -f "stars=2"  busybox
INDEX       NAME                           DESCRIPTION                                                                               STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/progrium/busybox                                                                                               68                   [OK]
docker.io   docker.io/radial/busyboxplus   Full-chain, Internet enabled, busybox made from scratch. Comes in git and cURL flavors.   21                   [OK]
docker.io   docker.io/odise/busybox-curl                                                                                             2                    [OK]
docker.io   docker.io/prom/busybox         Prometheus Busybox Docker base images                                                     2                    [OK]
# 可以同時指定多個參數


拉取鏡像:

docker pull [image_name][:tag]

[root@centos7 ~]# docker pull busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ... 
latest: Pulling from docker.io/library/busybox
57c14dd66db0: Pull complete 
Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0
Status: Downloaded newer image for docker.io/busybox:latest
[root@centos7 ~]# docker pull busybox:1.30
Trying to pull repository docker.io/library/busybox ... 
1.30: Pulling from docker.io/library/busybox
Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0
Status: Downloaded newer image for docker.io/busybox:1.30

該命令還有一個-a選項,用來從倉庫中下載所有的標記的鏡像,一般不常用,不過多介紹。


列出鏡像:

docker images [OPTIONS] [REPOSITORY]

     -a, --all=false :顯示所有鏡像,默認不顯示中間層鏡像

     -f, --filter=[]:根據過濾條件顯示鏡像

     --no-trunc=false:指定不使用截斷的形式顯示信息

     -q, --quiet=false:只顯示鏡像的IMAGE ID

結果信息:

     REPOSITORY: 鏡像的倉庫名

     TAG: 鏡像的標籤名

     IMAGE ID: 鏡像的唯一ID

     CREATED: 鏡像建立的時間

     VIRTUAL SIZE: 鏡像的大小

示例:

1)列出所有鏡像,-a參數是默認值,加不加結果都一樣

[root@centos7 ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              fce289e99eb9        5 weeks ago         1.84 kB
docker.io/busybox       1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox       latest              3a093384ac30        5 weeks ago         1.2 MB
[root@centos7 ~]# docker images -a
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              fce289e99eb9        5 weeks ago         1.84 kB
docker.io/busybox       1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox       latest              3a093384ac30        5 weeks ago         1.2 MB

2)列出包含指定名稱的鏡像

[root@centos7 ~]# docker images busybox
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox   latest              3a093384ac30        5 weeks ago         1.2 MB

3)列出包含指定名稱和對應標籤的鏡像

[root@centos7 ~]# docker images busybox:1.30
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   1.30                3a093384ac30        5 weeks ago         1.2 MB

4)列出沒有打標籤的鏡像(因爲本地沒有未打標籤的鏡像,輸出爲空)

[root@centos7 ~]# docker images -f 'dangling=true'
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

5)列出所有打標籤的鏡像,且不截斷輸出結果

[root@centos7 ~]# docker images -f 'dangling=false' --no-trunc
REPOSITORY              TAG                 IMAGE ID                                                                  CREATED             SIZE
docker.io/hello-world   latest              sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e   5 weeks ago         1.84 kB
docker.io/busybox       1.30                sha256:3a093384ac306cbac30b67f1585e12b30ab1a899374dabc3170b9bca246f1444   5 weeks ago         1.2 MB
docker.io/busybox       latest              sha256:3a093384ac306cbac30b67f1585e12b30ab1a899374dabc3170b9bca246f1444   5 weeks ago         1.2 MB

6)列出創建時間比hello-world鏡像早的鏡像

[root@centos7 ~]# docker images -f 'before=hello-world'
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox   latest              3a093384ac30        5 weeks ago         1.2 MB

7)列出創建時間比busybox:1.30鏡像晚的鏡像

[root@centos7 ~]# docker images -f 'since=busybox:1.30'
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              fce289e99eb9        5 weeks ago         1.84 kB

8)列出關聯匹配指定模式的鏡像

[root@centos7 ~]# docker images -f 'reference=hello*'
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              fce289e99eb9        5 weeks ago         1.84 kB

9)列出本地所有鏡像的ID(批量刪除鏡像時會用到)

[root@centos7 ~]# docker images -a -q
fce289e99eb9
3a093384ac30
3a093384ac30


查看鏡像的詳細信息:

docker inspect [OPTION] CONTAINER|IMAGE [CONTAINER|IMAGE...]

    -f, --format="": 以指定格式顯示鏡像的詳細信息

    -s, --size:如果使用該鏡像創建了容器則顯示總的文件大小

    --type: 對於特定屬性使用JSON格式返回結果

003.png

1)查看busybox:1.30鏡像的容器配置中的Hostname

[root@centos7 ~]# docker inspect --format='{{.ContainerConfig.Hostname}}' $(docker images -q busybox:1.30)
72124b9bac2f

2)查看busybox:1.30鏡像的架構

[root@centos7 ~]# docker inspect --format='{{.Architecture}}' $(docker images -q busybox:1.30)
amd64

3)查看busybox:1.30鏡像的系統類型

[root@centos7 ~]# docker inspect --format='{{.Os}}' $(docker images -q busybox:1.30)
linux

4)查看busybox:1.30鏡像的系統環境變量

[root@centos7 ~]# docker inspect --format='{{.Config.Env}}' $(docker images -q busybox:1.30)
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

5)查看busybox:1.30鏡像的Config字段配置,並以JSON格式返回輸出結果

[root@centos7 ~]# docker inspect --format='{{json .Config}}' $(docker images -q busybox:1.30)
{"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":["sh"],"ArgsEscaped":true,"Image":"sha256:a6633a61b3209de4088bd822bc5b3fa470f57c7f3df4fa0544cb20907915a65a","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null}

6)使用busybox鏡像啓動一個容器,並使用--size參數獲取其大小

[root@centos7 ~]# docker run -itd --name busybox01 busybox
[root@centos7 ~]# docker inspect --size busybox01   # 這裏要使用容器的名稱或ID
......
        "SizeRw": 3,
        "SizeRootFs": 1199420,
......
# 輸出過多,已省略


構建鏡像:

構建鏡像常用的方法:

     1)docker commit  基於容器構建鏡像

     2)docker build   使用dockerfile構建鏡像

     3)其他方法,包含docker import, docker load等

1、基於容器創建鏡像

步驟1:登錄Docker Hub (這裏暫時沒有私有倉庫,以Docker Hub爲例)

04.png

步驟2:拉取一個鏡像

[root@centos7 ~]# docker pull centos:6
Trying to pull repository docker.io/library/centos ... 
6: Pulling from docker.io/library/centos
9bfcefca2b8d: Pull complete 
Digest: sha256:935c45b2e2c4f01aa5a6ff8625632390c7685835a8dfcfdd50790aabc9c24d11
Status: Downloaded newer image for docker.io/centos:6

步驟3:使用拉取的鏡像創建容器

[root@centos7 ~]# docker run -itd --name mycentos01 centos:6 
8c671b1133638f18e996a02bcbac7d24ed014b9cacd9a827106ef7abb8fb7221

步驟4:對容器做出修改

[root@centos7 ~]# docker exec -it mycentos01 /bin/bash
[root@8c671b113363 /]# yum -y install nginx

步驟5:提交修改

[root@centos7 ~]# docker commit mycentos01 jerry12356/testcentos6
sha256:0aada46be3cfed2d55c84f86a6c73b570d8ae31d495e8e84526b95cfccfad691

步驟6:驗證

[root@centos7 ~]# docker images jerry12356/testcentos6
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
jerry12356/testcentos6   latest              0aada46be3cf        31 seconds ago      253 MB

2、使用Dockerfile進行構建

步驟1:創建Dockerfile

[root@centos7 ~]# mkdir testimage
[root@centos7 ~]# vi testimage/Dockerfile
[root@centos7 ~]# cat testimage/Dockerfile 
from centos:6
ENV HOSTNAME=mycentos02

步驟2:使用Dockerfile構建鏡像

[root@centos7 ~]# cd testimage/
[root@centos7 testimage]# docker build -t testimage .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM centos:6
 ---> 0cbf37812bff
Step 2/2 : ENV HOSTNAME mycentos02
 ---> Running in 9bc163c742e6
 ---> cebe8edc579a
Removing intermediate container 9bc163c742e6
Successfully built cebe8edc579a

步驟3:驗證

[root@centos7 testimage]# docker images testimage
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
testimage           latest              cebe8edc579a        10 seconds ago      194 MB

3、其他方法構建鏡像(因不作爲常用的構建方式,故不在此舉例,後面會有對應的介紹)


提交鏡像:

docker commit [OPTION] CONTAINER [REPOSITORY[:TAG]]

     -a, --author="": 指定作者

     -m, --message="": 指定鏡像構建的信息

     -p, --pause=true: 可以在不暫停容器的情況下構建鏡像

注:上面構建鏡像中已有示例,故不多做贅述


推送鏡像:

docker push IMAGE[:TAG]

注:上面構建鏡像中已有示例,需先登錄Docker Hub或私有倉庫


刪除鏡像:

docker rmi [OPTIONS] IMAGE [IMAGES...]

    -f, --force=false: 強制刪除鏡像

    --no-prune=false:刪除鏡像的同時保留該鏡像的父鏡像

示例:

1)刪除指定鏡像

[root@centos7 testimage]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
testimage                latest              cebe8edc579a        10 minutes ago      194 MB
jerry12356/testcentos6   latest              0aada46be3cf        22 minutes ago      253 MB
docker.io/hello-world    latest              fce289e99eb9        5 weeks ago         1.84 kB
docker.io/busybox        1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox        latest              3a093384ac30        5 weeks ago         1.2 MB
docker.io/centos         6                   0cbf37812bff        4 months ago        194 MB
[root@centos7 testimage]# docker rmi jerry12356/testcentos6
Untagged: jerry12356/testcentos6:latest
Deleted: sha256:0aada46be3cfed2d55c84f86a6c73b570d8ae31d495e8e84526b95cfccfad691
Deleted: sha256:2d3e8446066084493a55b97a2e8256553373eca56af7926eff05003e0d4bf14f
[root@centos7 testimage]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
testimage               latest              cebe8edc579a        10 minutes ago      194 MB
docker.io/hello-world   latest              fce289e99eb9        5 weeks ago         1.84 kB
docker.io/busybox       1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox       latest              3a093384ac30        5 weeks ago         1.2 MB
docker.io/centos        6                   0cbf37812bff        4 months ago        194 MB

2)強制刪除指定鏡像

[root@centos7 testimage]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8c671b113363        centos:6            "/bin/bash"         26 minutes ago      Up 26 minutes                           mycentos01
[root@centos7 testimage]# docker rmi centos:6
Error response from daemon: conflict: unable to remove repository reference "centos:6" (must force) - container 8c671b113363 is using its referenced image 0cbf37812bff
[root@centos7 testimage]# docker rmi -f centos:6
Untagged: centos:6
Untagged: docker.io/centos@sha256:935c45b2e2c4f01aa5a6ff8625632390c7685835a8dfcfdd50790aabc9c24d11
[root@centos7 testimage]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
testimage               latest              cebe8edc579a        13 minutes ago      194 MB
docker.io/hello-world   latest              fce289e99eb9        5 weeks ago         1.84 kB
docker.io/busybox       1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox       latest              3a093384ac30        5 weeks ago         1.2 MB

3)刪除所有鏡像

[root@centos7 testimage]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
testimage               latest              cebe8edc579a        13 minutes ago      194 MB
docker.io/hello-world   latest              fce289e99eb9        5 weeks ago         1.84 kB
docker.io/busybox       1.30                3a093384ac30        5 weeks ago         1.2 MB
docker.io/busybox       latest              3a093384ac30        5 weeks ago         1.2 MB
[root@centos7 testimage]# docker rmi $(docker images -q)
[root@centos7 testimage]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章