在上文中,已经安装好docker-ce-18.06.3.ce-3.el7,接来下介绍镜像基本操作和示范

1. 镜像存储路径

    看到这里的朋友,应该有尝试过从互联网上拉取镜像;拉取完后的镜像到底存储在本地哪里呢?如何去查看镜像的属性呢?

    以上文中拉取的tomcat镜像为例,之前介绍过优化Docker数据存储目录;这个目录存储了镜像信息、容器信息、网络信息、swarm、构建镜像历史日志、镜像元数据等信息,下面为Docker数据存储父目录结构。

[root@doc03 app]# pwd
/opt/app
[root@doc03 app]# tree -L 1 Docker/
	Docker/
	├── builder
	├── buildkit
	├── containerd
	├── containers
	├── image
	├── network
	├── overlay2
	├── plugins
	├── runtimes
	├── swarm
	├── tmp
	├── trust
	└── volumes

    其中image目录下存储的是镜像数据,里面有3个特殊文件需要做说明

    1.1 IMAGE ID

            IMAGE ID是以这个文件名前12位字符命名。

[root@doc03 sha256]# pwd
/opt/app/Docker/image/overlay2/imagedb/content/sha256
[root@doc03 sha256]# ll
total 16
-rw------- 1 root root 14458 Apr  5 14:23 040bdb29ab375db2a8de090070dcbee19d43f609385a934c3f2b423e515f57bb
[root@doc03 sha256]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              040bdb29ab37        2 months ago        649MB

    1.2 依赖镜像的信息

        之前说道过,镜像是由一层或多层组成,distribution目录下存储的就是依赖镜像的信息。细心的小伙伴会发现,依赖镜像文件对应拉取tomcat的"b9a857cbf04d: Pull complete"等镜像,也是由前12字符字符命名

[root@doc03 sha256]# pwd
/opt/app/Docker/image/overlay2/distribution/diffid-by-digest/sha256
[root@doc03 sha256]# ll
total 40
-rw-r--r-- 1 root root 71 Apr  5 14:23 00612a99c7dc3f9e7f9b8d951893bd5db3c0021f8452d165ea698f41701fae06
-rw-r--r-- 1 root root 71 Apr  5 14:23 326f9601c512f9d28e46996c1af4500ddf8fcbb0f172a57c9010146ed64232af
-rw-r--r-- 1 root root 71 Apr  5 14:22 3b9ca4f00c2e4896c65625d678544b764d7483dca9dcab92b62093db72f21d3e
-rw-r--r-- 1 root root 71 Apr  5 14:22 511ef4338a0b97df212cc0048cfc64b1956d438a987351ea24acf4841801d5cc
-rw-r--r-- 1 root root 71 Apr  5 14:22 661d3b55f65797df3cf7dc0ce8338bdc5d6ae69eeeac2a3228f2baa9fa518047
-rw-r--r-- 1 root root 71 Apr  5 14:22 667fd949ed9338da3c1e09f9b75408c214368c637c448e0fd839467f6f7717b5
-rw-r--r-- 1 root root 71 Apr  5 14:23 a56db448fefe2f4c9fe6121623d431bd522b7c6637058504e3e18a90bc159740
-rw-r--r-- 1 root root 71 Apr  5 14:22 b9a857cbf04d2c0d2f0f6b73e894b20a977a6d3b6edd9e27d080e03142954950
-rw-r--r-- 1 root root 71 Apr  5 14:23 c547db74f1e190988555d3a44be527af3a33ce62899fa5d18dfa48a12d9ba860
-rw-r--r-- 1 root root 71 Apr  5 14:22 d557ee20540b597f518df05bc6888778cfc92bf46040c701d4a622389feb6807

    1.3 镜像摘要信息

        存储每个镜像的摘要,所有镜像的摘要都存储在这一个文件中;若镜像删除,则此文件里对应的摘要信息也会删除

[root@doc03 overlay2]# pwd
/opt/app/Docker/image/overlay2
[root@doc03 overlay2]# cat repositories.json 
{"Repositories":{"nginx":{"nginx:1-alpine":"sha256:629df02b47c8733258baf6663e308a86cd23f80247d35407022c35fd91a50ea3","nginx:1-alpine-perl":"sha256:331c9790e872ca93a29241137d175078874bc7cdba42744ccf60f7cd95d06f4c","nginx@sha256:3bf1ec64ddaf78e5307ea10075fccc402fa9ddbf10945dd41f39930592c8f19c":"sha256:331c9790e872ca93a29241137d175078874bc7cdba42744ccf60f7cd95d06f4c","nginx@sha256:c2ce58e024275728b00a554ac25628af25c54782865b3487b11c21cafb7fabda":"sha256:629df02b47c8733258baf6663e308a86cd23f80247d35407022c35fd91a50ea3"},"tomcat":{"tomcat:latest":"sha256:040bdb29ab375db2a8de090070dcbee19d43f609385a934c3f2b423e515f57bb","tomcat@sha256:94cc18203335e400dbafcd0633f33c53663b1c1012a13bcad58cced9cd9d1305":"sha256:040bdb29ab375db2a8de090070dcbee19d43f609385a934c3f2b423e515f57bb"}}}

2. 镜像命名和标签

    正常来说,只需要给出镜像的名字和标签,就可以在官方中定位一个镜像,采用":"分割

    拉取镜像指令

# 拉取某个仓库的某个镜像
docker pull <repository>:<tag>
# 拉取某个仓库下所有版本的镜像
docker pull -a <repository>:<tag>

    当不指名<tag>时,默认拉取最新版本镜像,示例如下(仓库、版本笔者随意)

# 从官方拉取redis最新版本镜像
docker pull redis <==> docker pull redis:latest
# 从官方拉取redis 3.2.8版本镜像
docker pull redis:3.2.8
# 从个人仓库tianciwang下拉取nginx V20.1.1版本镜像
docker pull harbor/tianciwang/nginx:V20.1.1

3. 为镜像打多个标签

    一个镜像可以根据需求设定多个不同标签,每个镜像也可以对应自己独有的标签

    查看已经拉取到本地的镜像

docker images

    这里以nginx镜像为例(笔者下载2个镜像后强行停止了

root@doc03 ~]# docker pull -a nginx
1-alpine-perl: Pulling from library/nginx
801bfaa63ef2: Pull complete 
14fa53e0f410: Pull complete 
5b2b4d560b6b: Pull complete 
788e9d3ddd79: Pull complete 
e6c5b8607d37: Pull complete 
Digest: sha256:3bf1ec64ddaf78e5307ea10075fccc402fa9ddbf10945dd41f39930592c8f19c
1-alpine: Pulling from library/nginx
801bfaa63ef2: Already exists 
b1242e25d284: Pull complete 
7453d3e6b909: Pull complete 
07ce7418c4f8: Pull complete 
e295e0624aa3: Pull complete 
Digest: sha256:c2ce58e024275728b00a554ac25628af25c54782865b3487b11c21cafb7fabda

[root@doc03 ~]# docker images
REPOSITORY          TAG            IMAGE ID           CREATED            SIZE
tomcat            latest          040bdb29ab37         2 months ago        649MB
nginx             1-alpine-perl       331c9790e872         3 months ago        56.6MB
nginx             1-alpine         629df02b47c8         3 months ago        22.3MB

    上述步骤中发生了几件事情

        ● 首先从nginx仓库总中拉取了2个镜像,版本为"1-alpine-perl"、"1-alpine"。

        ● 其次,"801bfaa63ef2"这个依赖镜像都会去拉取,当"1-alpine-perl"拉取完毕后,"1-alpine"再次拉取时提示"Already exists";也就是说当拉取多个镜像时,如果有相同依赖镜像,则依赖只会拉取一次。

        ● 在上述示范中,nginx镜像对应的版本分别是"1-alpine-perl"、"1-alpine",而非最新的"latest",也就是说最新版本"latest"并非一个强制标签,不保证是仓库中最新的镜像。

4. 如何拉取镜像

    4.1 基于仓库、标签拉取

docker pull <repository>:<tag>

    4.2 基于摘要去拉取

[root@doc03 ~]# docker images --digests
REPOSITORY          TAG            DIGEST                                    IMAGE ID          CREATED            SIZE
tomcat            latest           sha256:94cc18203335e400dbafcd0633f33c53663b1c1012a13bcad58cced9cd9d1305   040bdb29ab37        2 months ago        649MB
nginx             1-alpine-perl       sha256:3bf1ec64ddaf78e5307ea10075fccc402fa9ddbf10945dd41f39930592c8f19c   331c9790e872        3 months ago        56.6MB
nginx             1-alpine          sha256:c2ce58e024275728b00a554ac25628af25c54782865b3487b11c21cafb7fabda   629df02b47c8        3 months ago        22.3MB

[root@doc03 ~]# docker pull sha256:94cc1....9d1305

5. 如何筛选出自己想要的镜像

    Docker提供了 "--filter"参数来过滤"docker ls"命令返回的镜像列表内容。

    Docker支持的过滤方法有以下几种

         dangling: 布尔型值 true or false,仅返回悬挂镜像(true),或者非悬挂镜像(false)

            补充: 那些 没有标签的镜像被称为悬挂镜像,在列表中展示为<none>:<none>

        ● before: 需要镜像名称或IMAGE ID作为参数,返回在之前被创建的全部镜像

        ● since: 与before类似,不过返回的是指定镜像之后创建的全部镜像

        ● lable: 根据标注的名称或者值,对镜像进行过滤

        ● 其他的过滤方式可以使用 reference,方法类似"Linux"通配符,示范如下

[root@doc03 ~]# docker images --filter=reference="*:latest"
REPOSITORY          TAG                IMAGE ID          CREATED            SIZE
tomcat            latest              040bdb29ab37        2 months ago        649MB
[root@doc03 ~]# docker images --filter=reference="*alpin*"
REPOSITORY          TAG            IMAGE ID          CREATED            SIZE
nginx             1-alpine-perl       331c9790e872        3 months ago        56.6MB
nginx             1-alpine          629df02b47c8        3 months ago        22.3MB

6. 如何优雅的输出Docker镜像展示信息

    运维人员第一时间想到的是通过"awk"、"grep"来实现格式化输出,但是Docker自身提供了"--format"参数来对输出内容进行格式化。   

[root@doc03 ~]# docker images  --format "{{.Repository}} {{.Tag}}: {{.Size}}"
tomcat latest: 649MB
nginx 1-alpine-perl: 56.6MB
nginx 1-alpine: 22.3MB

    笔者有个问题,如何对"IMAGE ID"这种有特殊字符" "的字段进行格式化输出。

7. 如何查看镜像所在仓库和版本

    Docker提供了"search"方式搜索,可以通过"NAME"字段进行匹配过滤,并且基于返回内容中任意列的值进行过滤。

    7.1 查看所有"NAME"中带有"nginx"的仓库   

[root@doc03 ~]# docker search nginx
NAME                          DESCRIPTION                       STARS          AUTOMATED
nginx                         Official build of Nginx.                14678          [OK]                
jwilder/nginx-proxy                          Automated Nginx reverse proxy for docker con…   2005              [OK]
richarvey/nginx-php-fpm                         Container running Nginx + PHP-FPM capable of…   813            [OK]
jc21/nginx-proxy-manager                         Docker container for managing Nginx proxy ho…   171         
mailu/nginx                         Mailu nginx frontend                  8              [OK]

    需要注意,上面返回的镜像中既有官方的也有非官方的,可以使用"--filter" "is-official=true"进行过滤   

[root@doc03 ~]# docker search nginx --filter "is-official=true"
NAME                DESCRIPTION                STARS               OFFICIAL            AUTOMATED
nginx               Official build of Nginx.   14678               [OK]

    7.2 显示自动创建的仓库

[root@doc03 ~]# docker search nginx --filter "is-automated=true"
NAME                    DESCRIPTION                        STARS         AUTOMATED
jwilder/nginx-proxy            Automated Nginx reverse proxy for docker con…   2005         [OK]
richarvey/nginx-php-fpm          Container running Nginx + PHP-FPM capable of…   813       [OK]
tiangolo/nginx-rtmp            Docker image with Nginx using the nginx-rtmp…   121       [OK]
jlesage/nginx-proxy-manager        Docker container for Nginx Proxy Manager       100           [OK]

    默认情况下,镜像查询只返回前25行结果,可以通过"--limit"参数来限制展示的行数,最多为100行。

8. 如何删除镜像

    当不在需要有个镜像时,可以通过"docker rmi"命令删除。

    删除操作会在当前主机删除该镜像已经依赖的镜像。这意味着当全部依赖改镜像的镜像都被删除后,该镜像才会被删除。

    当被删除的镜像上存在运行状态的容器,那么删除操作不被允许,在执行删除镜像操作之前,需要停止并删除该镜像相关的所有容器。

    可以根据"IMAGE ID"进行单个镜像删除或多个镜像删除(笔者在删除前已经关停、删除相关容器)

    8.1 删除单个镜像

[root@doc03 overlay2]# docker images
REPOSITORY          TAG            IMAGE ID          CREATED             SIZE
tomcat            latest           040bdb29ab37        2 months ago        649MB
nginx             1-alpine-perl       331c9790e872        3 months ago        56.6MB
nginx             1-alpine          629df02b47c8        3 months ago        22.3MB
[root@doc03 overlay2]# docker rmi 040bdb29ab37
Untagged: tomcat:latest
Untagged: tomcat@sha256:94cc18203335e400dbafcd0633f33c53663b1c1012a13bcad58cced9cd9d1305
Deleted: sha256:040bdb29ab375db2a8de090070dcbee19d43f609385a934c3f2b423e515f57bb
Deleted: sha256:03ac467e286d36301dba7daaec530f481074197d22d41bd48a32e5a2e3069573
Deleted: sha256:c56c3d4e36aac2060fdb29c95baf4b4d6916fe9a454751b77b8d89f27dd8dda4
Deleted: sha256:0f3911a87064866cd2aa7fd863afc1e02bdfa4856afa351e871f0e6a48cfd52b
Deleted: sha256:7891c5716382337382836e0af1ea998bf77c1eed9c8e806c7aac5f489952f4ba
Deleted: sha256:56dee2fc4110951264d4b134b303920c633aabbbb0264dc218518b3547320de2
Deleted: sha256:cd253bbc5a1ce457359958f4905b53a3f6f0ac167ba5065f68385600fdbae99e
Deleted: sha256:03b0292dbc6978fe1077f948ac07472a8cac23fb4c3cf92c76f5eb62891e3d5a
Deleted: sha256:19f2a825ed46bbf16a06d9d5185a0ac68196217f302e760abb4cbc3178b14cc1
Deleted: sha256:b4f0436e967b6b9b021d3ed900a5422da6d8fe8c17c51c7d7e4f9c105812f868
Deleted: sha256:4762552ad7d851a9901571428078281985074e5ddb806979dd7ad24748db4ca0

    8.2 删除全部镜像

[root@doc03 overlay2]# docker images
REPOSITORY          TAG            IMAGE ID          CREATED             SIZE
nginx              1-alpine-perl       331c9790e872        3 months ago        56.6MB
nginx             1-alpine          629df02b47c8        3 months ago        22.3MB
[root@doc03 overlay2]# docker rmi $(docker images -q)
Untagged: nginx:1-alpine-perl
Untagged: nginx@sha256:3bf1ec64ddaf78e5307ea10075fccc402fa9ddbf10945dd41f39930592c8f19c
Deleted: sha256:331c9790e872ca93a29241137d175078874bc7cdba42744ccf60f7cd95d06f4c
Deleted: sha256:f8bb5252256d3e1f73a9add79f3808e7c82e2e656263c5e5167f18ce451c3ed9
Deleted: sha256:48fb228af85715312488a1aaad44a2fbbb4ba12b2ebf304e332fc351995099fa
Deleted: sha256:66c4f586c95355b80665d617931a6b350f21e313db4fb3769d6cbc5e4785fa40
Deleted: sha256:4e46e0339c100da8d1b7041db8c7978f7271c9db5f646b8f1461de4c89099e8f
Untagged: nginx:1-alpine
Untagged: nginx@sha256:c2ce58e024275728b00a554ac25628af25c54782865b3487b11c21cafb7fabda
Deleted: sha256:629df02b47c8733258baf6663e308a86cd23f80247d35407022c35fd91a50ea3
Deleted: sha256:41d2e92ec9d933298115cd01bae2d829a74fdab4817485c525825a1006a115bb
Deleted: sha256:8c8641668583c076b6b0ab21acb272b9e693df25789c45efdd74e4f66c3249b3
Deleted: sha256:ba6fbd74fed2b1637de4430d2030389a419c0243a9f0b64443f2df032e46fa20
Deleted: sha256:9eb5ffb63a02018a7a90c5e26345e773faefe07eec78b155e6c994c2a35f97b9
Deleted: sha256:777b2c648970480f50f5b4d0af8f9a8ea798eea43dbcf40ce4a8c7118736bdcf

[root@doc03 overlay2]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

    "docker images -q"展示所有镜像的"IMAGE ID",可以结合"--filter"过滤自己想要的"IMAGE ID"

9. 常用命令汇总

    ● docker pull image

        下载镜像的命令。镜像从远程镜像服务的仓库中下载。默认情况下回城Docker Hub的仓库中拉取。 docker pull image:latest命令会拉取image最新版本,"-a"参数或拉取所有仓库某个标签的镜像

    ● docker image

        列出本地Docker主机上存储的镜像。可以通过"--digests"参数来查看镜像摘要

    ● docker inspect image

        展示镜像的细节,包括镜像层数据和元数据

    ● docker rmi image

        用于删除镜像。当镜像存在关联的容器,并且容器处于运行或停止状态时,不允许删除改镜像