Docker技术整理(二)使用镜像

Docker技术整理(二)使用镜像

镜像

镜像是Docker三大核心概念中最重要的.
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker会尝试从默认镜像仓库下载.

搜索镜像:
  • 命令格式:

docker search [OPTIONS] TERM
OPTIONS参数表:

--automated      true|false     只列出自动构建的镜像(已废弃),默认为false
--filter,-f                     根据指定条件过滤结果
--limit          20             搜索结果的最大条数(默认20条)
--no-trunc       =true|false    不截断输出,显示完整的输出
--stars,-s       100            只展示stars不低于该数值的结果(已废弃)
  • 普通搜索:

包含java关键字的镜像

zack@ubuntu:~$ docker search java
NAME                                     DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED\nnode                                     Node.js is a JavaScript-based platform for s…   8155                [OK]                
tomcat                                   Apache Tomcat is an open source implementati…   2574                [OK]                
openjdk                                  OpenJDK is an open-source implementation of …   2012                [OK]                
java                                     Java is a concurrent, class-based, and objec…   1976                [OK]                
ghost                                    Ghost is a free and open source blogging pla…   1067                [OK]                
jetty                                    Jetty provides a Web server and javax.servle…   319                 [OK]                
groovy                                   Apache Groovy is a multi-faceted language fo…   81                  [OK]                
lwieske/java-8                           Oracle Java 8 Container - Full + Slim - Base…   45                                      [OK]
nimmis/java-centos                       This is docker images of CentOS 7 with diffe…   42                                      [OK]
  • 条件检索:

包含java关键字的镜像,只展示stars不少于1000的前三条结果

zack@ubuntu:~$ docker search -s 1000 --limit 3 java
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
node                Node.js is a JavaScript-based platform for s…   8155                [OK]                
tomcat              Apache Tomcat is an open source implementati…   2574                [OK]                
java                Java is a concurrent, class-based, and objec…   1976                [OK]                
下载镜像
  • 命令格式:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS参数表:

--all-tags,-a            true|false    下载所有标签的镜像,默认为false
--disable-content-trust  true|false    忽略镜像的校验,默认为true
  • 从官方仓库下载镜像
zack@ubuntu:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7ddbc47eeb70: Pull complete 
c1bbdc448b72: Pull complete 
8c3b70e39044: Pull complete 
45d437916d57: Pull complete 
Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

由于未指定tag,执行该命令后,docker会从docker hub中的ubuntu仓库下载最新版的ubuntu镜像
此命令实际上下载的就是ubuntu:latest 镜像

  • 下载指定版本的镜像

镜像名:标签的格式下载18.04版本的ubuntu镜像

zack@ubuntu:~$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

从下载过程中可以看出,镜像文件一般由若干层组成,使用docker pull命令下载中会获取并输出镜像的各层信息.
当不同的镜像包括相同的层时,本地仅存储了层的一份内容,减小存储空间.

  • 从非官方仓库下载镜像

docker pull ubuntu:18.04这条命令实际上省去了默认的注册服务器docker hub的地址,实际上完整的命令是docker pull registry.hub.docker.com/ubuntu:18.04
如果要非默认注册服务器拉取镜像,需要在仓库名称前指定完整的仓库地址,例如:
docker pull hub.c.163.com/public/ubuntu:18.04

查看镜像信息
  • 列出镜像

使用docker images或者docker image ls命令可以列出本地主机上已有镜像的基础信息

zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               775349758637        5 weeks ago         64.2MB
ubuntu              latest              775349758637        5 weeks ago         64.2MB
hello-world         latest              fce289e99eb9        11 months ago       1.84kB

其中:
repository表示此镜像来自于哪个仓库
tag为镜像的标签信息, 比如latest,18.04表示不同的版本信息,用来标记来自同一个仓库的不同镜像
image id 唯一标识镜像,如果两个镜像的id相同,说明它们实际上执行了同一个镜像,只是标签名不同
created创建时间,镜像的最后更新时间
size镜像的大小
docker images的子命令:

--all,-a    true|false        列出所有镜像(包括临时文件),默认为false
-f,--filter=[]                过滤列出的镜像
--no-trunc  true|false        对输出结果中太长的部分进行截断,默认为true
  • 使用tag命令添加镜像标签

docker tag命令可以用来为本地镜像任意添加新标签.
为ubuntu18.04镜像添加一个新的标签:

zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myubuntu            18.04               775349758637        5 weeks ago         64.2MB
ubuntu              18.04               775349758637        5 weeks ago         64.2MB
ubuntu              latest              775349758637        5 weeks ago         64.2MB
hello-world         latest              fce289e99eb9        11 months ago       1.84kB

再次列出本地镜像信息可以看到多了一个myubuntu:18.04标签的镜像, 之后用户就可以直接使用myubuntu:18.04来表示这个镜像了.
这个镜像与ubuntu:18.04镜像的id完全一致,它们实际上指向了同一个镜像文件,只是别名不同, docker tag命令添加的标签实际上起到了类似链接的作用.

  • 使用inspect命令查看详细信息

使用docker image inspect命令可以获取该镜像的详细信息,包括制作者,适应架构,各层的数字摘要等:

zack@ubuntu:~$ docker image inspect ubuntu:18.04
[
    {
        "Id": "sha256:775349758637aff77bf85e2ff0597e86e3e859183ef0baba8b3e8fc8d3cba51c",
        "RepoTags": [
            "myubuntu:18.04",
            "ubuntu:18.04",
            "ubuntu:latest"
        ],
        "RepoDigests": [
            "ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2019-10-31T22:20:37.714423666Z",
        "Container": "4df7a03525342ee760076ade1c80bbdd041f236654f624ca581ada54310a1574",
        ......

此命令返回的是一个json格式的消息,如果只需要其中一项内容时,可以使用-f来指定
例如,获取镜像的architecture:

zack@ubuntu:~$ docker image inspect -f{{".Architecture"}} ubuntu:18.04
amd64
  • 使用history命令查看镜像历史

镜像文件由多层构成,通过history命令可以列出各层的创建信息.
查看ubuntu:18.04镜像的创建过程:

zack@ubuntu:~$ docker history ubuntu:18.04
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
775349758637        5 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           5 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B                  
<missing>           5 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B                
<missing>           5 weeks ago         /bin/sh -c [ -z "$(apt-get indextargets)" ]     987kB               
<missing>           5 weeks ago         /bin/sh -c #(nop) ADD file:a48a5dc1b9dbfc632…   63.2MB       

其中部分信息太长被截断了,可以使用docker history --no-trunc ubuntu:18.04命令获取详细信息

删除和清理镜像
  • 使用标签删除镜像

使用docker rmi IMAGE:TAG命令或者docker image rm IMAGE:TAG命令可以删除镜像
支持选项包括:

-f,-force        强制删除镜像,即使有容器依赖它
-no-prune        不清理未带标签的父镜像

删除hello-world镜像

zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              775349758637        5 weeks ago         64.2MB
hello-world         latest              fce289e99eb9        11 months ago       1.84kB
zack@ubuntu:~$ docker rmi hello-world:latest 
Untagged: hello-world:latest
Untagged: hello-world@sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              775349758637        5 weeks ago         64.2MB
zack@ubuntu:~$ 
  • 使用镜像id删除镜像

使用docker rmi IMAGEID命令可以删除指定image id的镜像(可以指定完整id,也可以指定能区分出镜像的id前几位)

zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              231d40e811cd        2 weeks ago         126MB
ubuntu              latest              775349758637        5 weeks ago         64.2MB
hello-world         latest              fce289e99eb9        11 months ago       1.84kB
zack@ubuntu:~$ docker rmi fce289
Untagged: hello-world:latest
Untagged: hello-world@sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              231d40e811cd        2 weeks ago         126MB
ubuntu              latest              775349758637        5 weeks ago         64.2MB
zack@ubuntu:~$ 
  • 清理镜像

使用docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像.
可以通过docker image prune命令进行清理
支持的选项包括:

-a,--all          删除所有无用镜像,不光是临时镜像
-filter filter    只清理符合给定过滤器的镜像
-f,-force         强制删除镜像,而不进行提示确认

清理临时的遗留镜像文件层,清理完成会提示释放的空间:

zack@ubuntu:~$ docker image prune -f
Total reclaimed space: 0B
zack@ubuntu:~$ 
导入导出镜像
  • 导出镜像到本地文件

使用docker save -o fileName IMAGE:TAG命令可以将镜像导出到本地文件
将ubuntu:latest 镜像导出为本地文件ubuntu_latest.tar

zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              231d40e811cd        2 weeks ago         126MB
ubuntu              latest              775349758637        5 weeks ago         64.2MB
zack@ubuntu:~$ docker save -o ubuntu_latest.tar ubuntu:latest 
zack@ubuntu:~$ ls
core  Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates  ubuntu_latest.tar  Videos
zack@ubuntu:~$ 
  • 从本地文件载入镜像到本地镜像库

使用docker load -i fileName命令可以将tar文件再导入到本地镜像库

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              231d40e811cd        2 weeks ago         126MB
zack@ubuntu:~$ ls
core  Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates  ubuntu_latest.tar  Videos
zack@ubuntu:~$ docker load -i ubuntu_latest.tar 
cc967c529ced: Loading layer [==================================================>]  65.57MB/65.57MB
2c6ac8e5063e: Loading layer [==================================================>]  991.2kB/991.2kB
6c01b5a53aac: Loading layer [==================================================>]  15.87kB/15.87kB
e0b3afb09dc3: Loading layer [==================================================>]  3.072kB/3.072kB
Loaded image: ubuntu:latest
zack@ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              231d40e811cd        2 weeks ago         126MB
ubuntu              latest              775349758637        5 weeks ago         64.2MB
zack@ubuntu:~$