Skip to content
KARINKARIN
博客主页
项目总览
知识要点
捣鼓折腾
Git笔记
Excel修炼秘籍
github icon
  • 博客主页
    • 项目总览
        • 虚拟化的发展
          • 初识 Docker 与容器
            • 核心概念与安装配置
              • 使用 Docker 镜像
                • 获取镜像
                  • 查看镜像信息
                    • 1、使用 images 命令列出镜像
                      • 2、使用 tag 命令添加镜像标签
                        • 3、使用 inspect 命令查看详细信息
                          • 4、使用 history 命令查看镜像历史
                          • 搜寻镜像
                            • 删除和清理镜像
                              • 1、使用标签删除镜像
                                • 2、使用镜像 ID 来删除镜像
                                  • 3、清理镜像
                                  • 创建镜像
                                    • 1、基于已有容器创建
                                      • 2、基于本地模板导入
                                        • 3、基于 Dockefile 创建
                                        • 存出和载人镜像
                                          • 1、存出镜像
                                            • 2、载入镜像
                                            • 上传镜像
                                              • 小结
                                              • 操作 Docker 容器
                                                • 访问 Docker 仓库
                                                  • Docker 数据管理
                                                    • 端口映射与容器互联
                                                      • 使用 Dockerfile 创建镜像

                                                      使用 Docker 镜像

                                                      author iconkarincalendar icon2021年8月23日category icon
                                                      • 笔记
                                                      tag icon
                                                      • docker
                                                      timer icon大约 19 分钟

                                                      此页内容
                                                      • 获取镜像
                                                      • 查看镜像信息
                                                        • 1、使用 images 命令列出镜像
                                                        • 2、使用 tag 命令添加镜像标签
                                                        • 3、使用 inspect 命令查看详细信息
                                                        • 4、使用 history 命令查看镜像历史
                                                      • 搜寻镜像
                                                      • 删除和清理镜像
                                                        • 1、使用标签删除镜像
                                                        • 2、使用镜像 ID 来删除镜像
                                                        • 3、清理镜像
                                                      • 创建镜像
                                                        • 1、基于已有容器创建
                                                        • 2、基于本地模板导入
                                                        • 3、基于 Dockefile 创建
                                                      • 存出和载人镜像
                                                        • 1、存出镜像
                                                        • 2、载入镜像
                                                      • 上传镜像
                                                      • 小结

                                                      镜像是 Docker 三大核心概念中最重要的,自 Docker 诞生之日起镜像就是相关社区最为热门的关键词。

                                                      Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker 会尝试先从默认镜像仓库下载(默认使用 Docker Hub 公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

                                                      本章将围绕镜像这一核心概念介绍具体操作,包括如何使用 pull 命令从 Docker Hub 仓库中下载镜像到本地;如何查看本地已有的镜像信息和管理镜像标签;如何在远端仓库使用 search 命令进行搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像并且保存为外部文件。最后,还将介绍如何往 Docker Hub 仓库中推送自己的镜像。

                                                      # 获取镜像

                                                      镜像是运行容器的前提,官方的 Docker Hub 网站已经提供了数十万个镜像供大家开放下载。但是,根据 Docker 公司政策,2020 年 11 月 01 日起将逐步向 Docker Hub 匿名和免费用户实施速率和拉取请求次数限制。因此,如果您在个人版中构建服务拉取 Docker Hub 镜像,将可能受此影响导致构建失败。

                                                      关于 Docker Hub 拉取请求次数限制的详细介绍,请参见 Download rate limitopen in new window。

                                                      解决方法

                                                      要解决此问题,需要配置国内仓库源。

                                                      $ sudo vim /etc/docker/daemon.json
                                                      #新建daemon.json文件,并配置以下内容
                                                      {
                                                        "registry-mirrors": ["<国内加速镜像源地址>"]
                                                      }
                                                      #保存推出
                                                      
                                                      #国内加速镜像源地址
                                                      https://registry.docker-cn.com
                                                      http://hub-mirror.c.163.com
                                                      https://3laho3y3.mirror.aliyuncs.com
                                                      http://f1361db2.m.daocloud.io
                                                      https://mirror.ccs.tencentyun.com
                                                      
                                                      #然后重新加载配置,重启服务
                                                      $ sudo systemctl daemon-reload
                                                      $ sudo systemctl restart docker
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9
                                                      10
                                                      11
                                                      12
                                                      13
                                                      14
                                                      15
                                                      16
                                                      17

                                                      之后就可以正常 pull 镜像了。

                                                      我们可以使用 docker [image] pull 命令直接从 Docker Hub 镜像源来下载镜像。该命令的格式为 docker [image] pull NAME[:TAG]。

                                                      其中,NAME 是镜像仓库名称(用来区分镜像),TAG 是镜像的标签(往往用来表示版本 信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息。

                                                      例如,获取一个 Ubuntu 18.04 系统的基础镜像可以使用如下的命令:

                                                      $ docker pull ubuntu:18.04
                                                      18.04: Pulling from library/ubuntu
                                                      e4ca327ec0e7: Pull complete 
                                                      Digest: sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79
                                                      Status: Downloaded newer image for ubuntu:18.04
                                                      docker.io/library/ubuntu:18.04
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6

                                                      对于 Docker 镜像来说,如果不显式指定 TAG,则默认会选择 latest 标签,这会下载仓库中最新版本的镜像。

                                                      下面的例子将从 centos 仓库下载一个最新版本的 centos 操作系统的镜像:

                                                      $ docker pull centos
                                                      Using default tag: latest
                                                      latest: Pulling from library/centos
                                                      7a0437f04f83: Pull complete 
                                                      Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
                                                      Status: Downloaded newer image for centos:latest
                                                      docker.io/library/centos:latest
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7

                                                      该命令实际上下载的就是 centos:latest 镜像。

                                                      注意

                                                      一般来说,镜像的 latest 标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的 latest 标记的镜像。

                                                      下载过程中可以看出,镜像文件一般由若干层(layer)组成,e4ca327ec0e7 这样的串是层的唯一 id(实际上完整的 id 包括 256 比特,64 个十六进制字符组成)。使用 docker pull 命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储了层的一份内容,减小了存储空间。

                                                      你可能会想到,在不同的镜像仓库服务器的情况下,可能会出现镜像重名的情况。

                                                      严格地讲,镜像的仓库名称中还应该添加仓库地址(即 registry,注册服务器)作为前缀,只是默认使用的是官方 Docker Hub 服务,该前缀可以忽略。

                                                      例如,docker pull ubuntu:18.04 命令相当于 docker pull registry.hub.docker.com/ubuntu:18.04 命令,即从默认的注册服务器 Docekr Hub Registry 中的 ubuntu 仓库来下载标记为 18.04 的镜像。

                                                      如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢命令,此时下载的镜像名称为 hub.c.163.com/public/ubuntu:18.04:

                                                      $ docker pull hub.c.163.com/public/ubuntu:18.04
                                                      
                                                      1

                                                      pull 子命令支持的选项主要包括:

                                                      • -a,--all-tags=true|false:是否获取仓库中的所有镜像,默认为否;

                                                      • --disable-content-trust:取消镜像的内容校验,默认为真。

                                                      另外,有时需要使用镜像代理服务来加速 Docke 镜像获取过程,可以在 Docker 服务 启动配置中增加 --registry-mirror=proxy_URL 来指定镜像代理服务地址(如 https:// registry.docker-en.com)

                                                      下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运 行 bash 应用,执行打印"HelloWorld"命令:

                                                      $ docker run -it ubuntu:18.04 bash
                                                      root@65663247040f:/# echo "Hello World"
                                                      Hello World
                                                      root@65663247040f:/# exit
                                                      exit
                                                      $  
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6

                                                      # 查看镜像信息

                                                      主要介绍 Docker 镜像的 ls、tag 和 inspect 子命令。

                                                      # 1、使用 images 命令列出镜像

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

                                                      例如,下面的命令列出了之前下载的镜像信息:

                                                      $ docker images
                                                      REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
                                                      ubuntu        18.04     54919e10a95d   2 days ago     63.1MB
                                                      hello-world   latest    d1165f221234   6 months ago   13.3kB
                                                      centos        latest    300e315adb2f   8 months ago   209MB
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5

                                                      在列出信息中,可以看到几个字段信息:

                                                      • 来自于哪个仓库,比如 ubuntu 表示 ubuntu 系列的基础镜像;

                                                      • 镜像的标答信息,比如 18.04、latest 表示不同的版本信息。标签只是标记,并不能标 识镜像内容;

                                                      • 镜像的 ID(唯一标识镜像),如果两个镜像的 ID 相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已;

                                                      • 创建时间,说明镜像最后的更新时间;

                                                      • 镜像大小,优秀的镜像往往体积都较小。

                                                      其中镜像的 ID 信息十分重要,它唯一标识了镜像。在使用镜像 ID 的时候,一般可以使用该 ID 的前若干个字符组成的可区分串来替代完整的 ID。

                                                      TAG 信息用于标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,如 18.04、18.10 等。

                                                      镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。

                                                      images 子命令主要支持如下选项,用户可以自行进行尝试:

                                                      • -a,--all=true|false:列出所有(包括临时文件)镜像文件,默认为否;

                                                      • --digests=true|false:列出镜像的数字摘要值,默认为否;

                                                      • -f,--filter=[]:过滤列出的镜像,如 dangling=true 只显示没有被使用的镜像;也可指定带有特定标注的镜像等;

                                                      • --format="TEMPLATE":控制输出格式,如 .ID 代表 ID 信息,.Repository 代表仓库信息等;

                                                      • --no-trunc=true|false:对输出结果中太长的部分是否进行截断,如镜像的 ID 信息,默认为是;

                                                      • -q,--quiet=true|false:仅输出 ID 信息,默认为否。

                                                      其中,还支持对输出结果进行控制的选项,如 -f. --filter=[]、--no-trunc=true|false、-q、--quiet=true|false 等。

                                                      更多子命令选项还可以通过 man docker-images 来查看。

                                                      # 2、使用 tag 命令添加镜像标签

                                                      为了方便在后续工作中使用特定镜像,还可以使用 docker tag 命令来为本地镜像任意添加新的标签。 例如,添加 一 个新的 centos:latest 镜像标签:

                                                      $ docker tag centos:latest mycentos
                                                      
                                                      1

                                                      再次使用 docker images 列出本地主机上镜像信息, 可以看到多了一 个 mycentos:latest 标签的镜像:

                                                      $ docker images
                                                      REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
                                                      ubuntu        18.04     54919e10a95d   2 days ago     63.1MB
                                                      hello-world   latest    d1165f221234   6 months ago   13.3kB
                                                      centos        latest    300e315adb2f   8 months ago   209MB
                                                      mycentos      latest    300e315adb2f   8 months ago   209MB
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6

                                                      之后, 用户就可以直接使用 mycentos:latest 来表示这个镜像了。 细心的你可能注意到, 这些 mycentos:latest 镜像的 ID 跟 centos:latest 是完全一致的,它们实际上指向了同一个镜像文件,只是别名不同而巳。docker tag 命令添加的标签实际上起到了类似链接的作用。

                                                      # 3、使用 inspect 命令查看详细信息

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

                                                      $ docker inspect ubuntu:18.04
                                                      [
                                                          {
                                                              "Id": "sha256:54919e10a95d6f756f7286dc0fa6b3e25b637a7f90e361504b0b14ab6762a547",
                                                              "RepoTags": [
                                                                  "ubuntu:18.04"
                                                              ],
                                                              "RepoDigests": [
                                                                  "ubuntu@sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79"
                                                              ],
                                                              "Parent": "",
                                                              "Comment": "",
                                                              "Created": "2021-08-31T01:20:48.414661265Z",
                                                      ...
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9
                                                      10
                                                      11
                                                      12
                                                      13
                                                      14

                                                      上面代码返回的是一个 JSON 格式的消息,如果我们只要其中一项内容时,可以使用 -f 来指定,例如,获取镜像的 Architecture:

                                                      $ docker inspect -f {{".Architecture"}} ubuntu:18.04
                                                      amd64
                                                      
                                                      1
                                                      2

                                                      # 4、使用 history 命令查看镜像历史

                                                      既然镜像文件由多个层组成, 那么怎么知道各个层的内容具体是什么呢?这时候可以使用 history 子命令,该命令将列出各层的创建信息。

                                                      例如,查看 ubuntu:18.04 镜像的创建过程,可以使用如下命令:

                                                      $ docker history ubuntu:18.04
                                                      IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
                                                      54919e10a95d   2 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B        
                                                      <missing>      2 days ago   /bin/sh -c #(nop) ADD file:425a053fd043786e9…  63.1MB    
                                                      
                                                      1
                                                      2
                                                      3
                                                      4

                                                      注意

                                                      过长的命令被自动截断了,可以使用前面提到的 --no-trunc 选项来输出完整命令。

                                                      # 搜寻镜像

                                                      本节主要介绍 Docker 镜像的 search 子命令。使用 docker search 命令可以搜索 Docker Hub 官方仓库中的镜像。 语法为 docker search [option] keyword。支持的命令选项主要包括:

                                                      • -f,--filter filter:过滤输出内容;

                                                      • --format string:格式化输出内容;

                                                      • --limit int:限制输出结果个数,默认为 25 个;

                                                      • --no-trunc:不截断输出结果。

                                                      例如,搜索官方提供的带 nginx 关键字的镜像,如下所示:

                                                      $ docker search --filter=is-official=true nginx
                                                      NAME      DESCRIPTION                STARS     OFFICIAL   AUTOMATED
                                                      nginx     Official build of Nginx.   15394     [OK]       
                                                      
                                                      1
                                                      2
                                                      3

                                                      再比如,搜索所有收藏数超过 4 的关键词包括 tensorflow 的镜像:

                                                      $ docker search --filter=stars=4 tensorflow
                                                      NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
                                                      tensorflow/tensorflow                      Official Docker images for the machine learn…   1944                 
                                                      jupyter/tensorflow-notebook                Jupyter Notebook Scientific Python Stack w/ …   280                  
                                                      tensorflow/serving                         Official images for TensorFlow Serving (http…   117                  
                                                      rocm/tensorflow                            Tensorflow with ROCm backend support            	62                   
                                                      xblaster/tensorflow-jupyter                Dockerized Jupyter with tensorflow              	56                   [OK]
                                                      floydhub/tensorflow                        tensorflow                                      	29                   [OK]
                                                      opensciencegrid/tensorflow-gpu             TensorFlow GPU set up for OSG                   	12                   
                                                      emacski/tensorflow-serving                 Project images from https://github.com/emacs…   10                   
                                                      tokunagaken/tensorflow-keras-jupyter-py3   TensorFlow-gpu 1.13.1 Keras 2.2.4 python 3.5…   5                    
                                                      tensorflow/tf_grpc_test_server             Testing server for GRPC-based distributed ru…   4               
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9
                                                      10
                                                      11
                                                      12

                                                      可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。默认的输出结果将按照星级评价进行排序。

                                                      # 删除和清理镜像

                                                      主要介绍 Docker 镜像的 rm 和 prune 子命令。

                                                      # 1、使用标签删除镜像

                                                      使用 docker rmi 或 docker image rm 命令可以删除镜像,命令格式为 docker rmi IMAGE [IMAGE...],其中 IMAGE 可以为标签或 ID。

                                                      支持选项包括:

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

                                                      例如,要删除掉 mycentos:latest 镜像,可以使用如下命令:

                                                      $ docker rmi mycentos:latest 
                                                      Untagged: mycentos:latest
                                                      
                                                      1
                                                      2

                                                      你可能会想到,本地的 centos:latest 镜像是否会受到此命令的影响。无须担心,当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除了该镜像多个标签中的指定标签而巳,并不影响镜像文件。因此上述操作相当于只是删除了镜像 300e315adb2f 的一个标签副本而已。

                                                      保险起见,再次查看本地的镜像,发现 centos:latest 镜像(准确地说,300e315adb2f 镜像)仍然存在:

                                                      $ docker images
                                                      REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
                                                      ubuntu        18.04     54919e10a95d   2 days ago     63.1MB
                                                      hello-world   latest    d1165f221234   6 months ago   13.3kB
                                                      centos        latest    300e315adb2f   8 months ago   209MB
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5

                                                      但当镜像只剩下一个标签的时候就要小心了,此时再使用 docker rmi 命令会彻底删除镜像。

                                                      例如通过执行 docker rmi 命令来删除只有一个标签的镜像,可以看出会删除这个镜像文件的所有文件层:

                                                      $ docker rmi hello-world:latest 
                                                      Untagged: hello-world:latest
                                                      Untagged: hello-world@sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
                                                      Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
                                                      Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5

                                                      说明

                                                      如果在删除镜像,遇到下面的 Erroe 时,需要先删除容器,再删除镜像。

                                                      # 1、删除镜像时出现 Error
                                                      $ docker rmi hello-world:latest 
                                                      Error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container 882249d25e88 is using its referenced image d1165f221234
                                                      
                                                      # 2、先删除容器(可以查到镜像所在容器的CONTAINER ID)
                                                      $ docker ps -a
                                                      CONTAINER ID   IMAGE          COMMAND    CREATED       STATUS                   PORTS     NAMES
                                                      882249d25e88   hello-world    "/hello"   4 hours ago   Exited (0) 4 hours ago             priceless_neumann
                                                      dba94731dbca   centos         "bash"     4 hours ago   Exited (0) 4 hours ago             romantic_benz
                                                      810d3dbcd35b   ubuntu:18.04   "bash"     4 hours ago   Exited (0) 4 hours ago             naughty_hoover
                                                      #删除容器(对应的CONTAINER ID)
                                                      $ docker rm 882249d25e88
                                                      882249d25e88
                                                      
                                                      # 3、最后删除镜像
                                                      $ docker rmi hello-world:latest 
                                                      Untagged: hello-world:latest
                                                      Untagged: hello-world@sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
                                                      Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
                                                      Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9
                                                      10
                                                      11
                                                      12
                                                      13
                                                      14
                                                      15
                                                      16
                                                      17
                                                      18
                                                      19
                                                      20

                                                      # 2、使用镜像 ID 来删除镜像

                                                      当使用 docker rmi 命令,并且后面跟上镜像的 ID (也可以是能进行区分的部分 ID 前缀)时, 会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

                                                      注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:先利用 ubuntu:18.04 镜像创建一个简单的容器来输出 一 段话:

                                                      $ docker run ubuntu:18.04 echo 'hello! I am here!'
                                                      hello! i am here!
                                                      
                                                      1
                                                      2

                                                      使用 docker ps -a 命令可以看到本机上存在的所有容器:

                                                      $ docker ps -a
                                                      CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
                                                      586d17fcdf93   ubuntu:18.04   "echo 'hello! i am h…"  25 seconds ago   Exited (0) 23 seconds ago             vigilant_wu
                                                      dba94731dbca   centos         "bash"                   4 hours ago      Exited (0) 4 hours ago                romantic_benz
                                                      810d3dbcd35b   ubuntu:18.04   "bash"                   4 hours ago      Exited (0) 4 hours ago                naughty_hoover
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5

                                                      可以看到,后台存在一个退出状态的容器,是刚基于 ubuntu:18.04 镜像创建的。试图删除该镜像,Docker 会提示有容器正在运行,无法删除:

                                                      $ docker rmi ubuntu:18.04 
                                                      Error response from daemon: conflict: unable to remove repository reference "ubuntu:18.04" (must force) - container 810d3dbcd35b is using its referenced image 54919e10a95d
                                                      
                                                      1
                                                      2

                                                      如果要想强行删除镜像, 可以使用 -f 参数:

                                                      $ docker rmi -f ubuntu:18.04 
                                                      Untagged: ubuntu:18.04
                                                      Untagged: ubuntu@sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79
                                                      Deleted: sha256:54919e10a95d6f756f7286dc0fa6b3e25b637a7f90e361504b0b14ab6762a547
                                                      
                                                      1
                                                      2
                                                      3
                                                      4

                                                      注意,通常并不推荐使用 -f 参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

                                                      首先删除容器 586d17fcdf93:

                                                      $ docker rm 586d17fcdf93
                                                      
                                                      1

                                                      然后使用 ID 来删除镜像,此时会正常打印出删除的各层信息:

                                                      $ docker rmi 54919e10a95d
                                                      Untagged: ubuntu:18.04
                                                      Untagged: ubuntu@sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79
                                                      Deleted: sha256:54919e10a95d6f756f7286dc0fa6b3e25b637a7f90e361504b0b14ab6762a547
                                                      Deleted: sha256:6babb56be2593d69d561cae7ad16b670a1ee7c0a32b4fa715007fba7febd5ddb
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5

                                                      # 3、清理镜像

                                                      使用 Docker 一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过 docker image prune 命令来进行清理。

                                                      支待选项包括:

                                                      • -a,-all:删除所有无用镜像,不光是临时镜像;

                                                      • -filter filter:只清理符合给定过滤器的镜像;

                                                      • -f,-force:强制删除镜像,而不进行提示确认。

                                                      例如,如下命令会自动清理临时的遗留镜像文件层,最后会提示释放的存储空间:

                                                       $ docker image prune -f
                                                       . . .
                                                       Total reclaimed space: 1.4 GB
                                                      
                                                      1
                                                      2
                                                      3

                                                      # 创建镜像

                                                      创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于 Dockerfile 创建。

                                                      这里主要介绍 Docker 的 commit、import 和 build 子命令。

                                                      # 1、基于已有容器创建

                                                      该方法主要是使用 docker [container] commit 命令。

                                                      命令格式为 docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要选项包括:

                                                      • -a,--author="":作者信息;

                                                      • -c,--change=[]:提交的时候执行 Dockerfile 指令,

                                                        包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR 等;

                                                      • -m,--message= “”:提交消息;

                                                      • -p,--pause=true:提交时暂停容器运行。

                                                      下面将演示如何使用该命令创建一个新镜像。

                                                      首先,启动一个镜像,并在其中进行修改操作。例如,创建一个 test 文件,之后退出,代码如下:

                                                      $ docker run -it ubuntu:18.04 /bin/bash
                                                      root@38e4a9445436:/# touch test
                                                      root@38e4a9445436:/# exit
                                                      exit
                                                      
                                                      1
                                                      2
                                                      3
                                                      4

                                                      记住容器的 ID 为 38e4a9445436。此时该容器与原 ubuntu:18.04 镜像相比,已经发生了改变,可以使用 docker [container] commit 命令来提交为一个新的镜像。提交时可以使用 ID 或名称来指定容器:

                                                      $ docker commit -m "ADDed a new file" -a "Docker Newbee" 38e4a9445436 test:0.1
                                                      sha256:fdebc600d6f4ff0296917924668be67608af1af4ae10e4a9583478d9815a7969
                                                      
                                                      1
                                                      2

                                                      顺利的话,会返回新创建镜像的 ID 信息,例如:

                                                      fdebc600d6f4ff0296917924668be67608af1af4ae10e4a9583478d9815a7969。

                                                      此时查看本地镜像列表,会发现新创建的镜像已经存在了:

                                                      $ docker images
                                                      REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
                                                      test         0.1       fdebc600d6f4   28 seconds ago   63.1MB
                                                      ubuntu       18.04     54919e10a95d   2 days ago       63.1MB
                                                      centos       latest    300e315adb2f   8 months ago     209MB
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5

                                                      # 2、基于本地模板导入

                                                      用户也可以直接从一个操作系统模板文件导人一个镜像,主要使用 docker [container] import 命令。命令格式为 docker [image] import [OPTIONS] file|URL| - [REPOSITORY [:TAG]]

                                                      要直接导人一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ 模板的下载地址为 https://download.openvz.org/template/precreated/open in new window。

                                                      例如,下载了 ubuntu-18.04 的模板压缩包,之后使用以下命令导人即可:

                                                      $ wget https://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
                                                      --2021-09-02 16:25:09--  https://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
                                                      正在解析主机 download.openvz.org (download.openvz.org)... 185.231.241.69
                                                      正在连接 download.openvz.org (download.openvz.org)|185.231.241.69|:443... 已连接。
                                                      已发出 HTTP 请求,正在等待回应... 200 OK
                                                      长度: 145639219 (139M) [application/x-gzip]
                                                      正在保存至: “centos-7-x86_64-minimal.tar.gz”
                                                      
                                                      centos-7-x86_64-minimal.tar.gz        100%[======================================================================>] 138.89M  2.15MB/s    用时 4m 48ss
                                                      
                                                      2021-09-02 16:29:59 (494 KB/s) - 已保存 “centos-7-x86_64-minimal.tar.gz” [145639219/145639219])
                                                      
                                                      $ cat centos-7-x86_64-minimal.tar.gz | docker import - centos:7
                                                      sha256:f1dbb0e36a07382f4f6b2001836374e51d297c841fb1fe4e85dfa92ba3f43139
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9
                                                      10
                                                      11
                                                      12
                                                      13
                                                      14

                                                      然后查看新导人的镜像,已经在本地存在了 :

                                                      $ docker images
                                                      REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
                                                      centos       7         f1dbb0e36a07   8 seconds ago   435MB
                                                      test         0.1       fdebc600d6f4   2 hours ago     63.1MB
                                                      ubuntu       18.04     54919e10a95d   2 days ago      63.1MB
                                                      centos       latest    300e315adb2f   8 months ago    209MB
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6

                                                      # 3、基于 Dockefile 创建

                                                      基于 Dockerfile 创建是最常见的方式。Dockerfile 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。

                                                      下面给出 Dockerfile 的一个简单示例,基于 debian:stretch-slim 镜像安装 Python 3 环境,构成一个新的 python:3 镜像:

                                                      FROM debian:stretch-slim
                                                      
                                                      LABEL version="1.0" maintainer="docker user <docker_user@githubs>"
                                                      
                                                      RUN apt-get update && \
                                                      	apt-get instal l-y python3 && \
                                                      	apt-get clean && \
                                                      	rm -rf /var/lib/apt/lists/*
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8

                                                      创建镜像的过程可以使用 docker [image] build 命令,编译成功后本地将多出一个 python:3 镜像:

                                                      $ docker build -t python:3 .
                                                      Sending build context to Docker daemon  2.048kB
                                                      Step 1/3 : FROM debian:stretch-slim
                                                       ---> 750df3e387d7
                                                      Step 2/3 : LABEL version="1.0" maintainer="docker user <docker_user@githubs>"
                                                       ---> Using cache
                                                       ---> 89c03eb7f46d
                                                      Step 3/3 : RUN apt-get update && apt-get install -y python3 && apt-get clean && rm -rf /var/lib/apt/lists/*
                                                       ---> Running in 81e5fe4c9c9a
                                                      Get:1 http://security.debian.org/debian-security stretch/updates InRelease [53.0 kB]
                                                      Ign:2 http://deb.debian.org/debian stretch InRelease
                                                      Get:3 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [710 kB]
                                                      ......
                                                      Setting up python3 (3.5.3-1) ...
                                                      running python rtupdate hooks for python3.5...
                                                      running python post-rtupdate hooks for python3.5...
                                                      Processing triggers for libc-bin (2.24-11+deb9u4) ...
                                                      Removing intermediate container 81e5fe4c9c9a
                                                       ---> cb3faf5fd7e5
                                                      Successfully built cb3faf5fd7e5
                                                      Successfully tagged python:3
                                                      # 编译完成,再次查看下镜像,多出一个 python 的镜像
                                                      $ docker images
                                                      REPOSITORY   TAG            IMAGE ID       CREATED        SIZE
                                                      python       3              cb3faf5fd7e5   15 hours ago   95.2MB
                                                      centos       7              f1dbb0e36a07   16 hours ago   435MB
                                                      test         0.1            fdebc600d6f4   18 hours ago   63.1MB
                                                      ubuntu       18.04          54919e10a95d   2 days ago     63.1MB
                                                      debian       stretch-slim   750df3e387d7   2 weeks ago    55.3MB
                                                      centos       latest         300e315adb2f   8 months ago   209MB
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9
                                                      10
                                                      11
                                                      12
                                                      13
                                                      14
                                                      15
                                                      16
                                                      17
                                                      18
                                                      19
                                                      20
                                                      21
                                                      22
                                                      23
                                                      24
                                                      25
                                                      26
                                                      27
                                                      28
                                                      29
                                                      30

                                                      更多使用 Dockerfile 的技巧将将在后面进行介绍。

                                                      # 存出和载人镜像

                                                      主要介绍 Docker 镜像的 save 和 load 子命令。用户可以使用 docker save 和 docker[image] load 命令来存出和载人镜像 。

                                                      # 1、存出镜像

                                                      如果要导出镜像到本地文件,可以使用 docker [image] save 命令。该命令支持 -o、-output string 参数,导出镜像到指定的文件中。

                                                      例如,导出本地的 ubuntu:18.04 镜像为文件 ubuntu_18.04.tar,如下所示:

                                                      $ docker images
                                                      REPOSITORY   TAG            IMAGE ID       CREATED        SIZE
                                                      python       3              cb3faf5fd7e5   15 hours ago   95.2MB
                                                      centos       7              f1dbb0e36a07   16 hours ago   435MB
                                                      test         0.1            fdebc600d6f4   18 hours ago   63.1MB
                                                      ubuntu       18.04          54919e10a95d   2 days ago     63.1MB
                                                      debian       stretch-slim   750df3e387d7   2 weeks ago    55.3MB
                                                      centos       latest         300e315adb2f   8 months ago   209MB
                                                      $ docker save -o ubuntu_18.04.tar ubuntu:18.04 
                                                      $ ls -lh
                                                      总用量 63M
                                                      -rw-r--r-- 1 kei docker 197 9月   2 16:57 Dockerfile
                                                      -rw------- 1 kei docker 63M 9月   3 08:48 ubuntu_18.04.tar
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9
                                                      10
                                                      11
                                                      12
                                                      13

                                                      之后,用户就可以通过复制 ubuntu_18.04.tar 文件将该镜像分享给他人。

                                                      # 2、载入镜像

                                                      可以使用 docker [image] load 将导出的 tar 文件再导人到本地镜像库。支持 -i、-input string 选项,从指定文件中读人镜像内容。

                                                      例如,从文件 ubuntu_18.04.tar 导人镜像到本地镜像列表,如下所示:

                                                      $ docker load -i ubuntu_ 18 04.tar
                                                      Loaded image: ubuntu:18.04
                                                      或者 :
                                                      $ docker load < ubuntu_18 04.tar
                                                      Loaded image: ubuntu:18.04
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5

                                                      这将导人镜像及其相关的元数据信息(包括标签等)。导入成功后,可以使用 docker images 命令进行查看,与原镜像一致。

                                                      # 上传镜像

                                                      主要介绍 Docker 镜像的 push 子命令。可以使用 docker [image] push 命令上传镜像到仓库,默认上传到 Docker Hub 官方仓库(需要登录)。

                                                      命令格式为 docker push NAME [:TAG] | [image] [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]。

                                                      用户在 Docker Hub 网站注册后可以上传自制的镜像。

                                                      例如,用户 user 上传本地的 test:latest 镜像,可以先添加新的标签 user/test:latest,然后用 docker [image] push 命令上传镜像:

                                                      $ docker tag test:latest user/test:latest
                                                      $ docker push user/test:latest
                                                      The push refers to a repository [docker.io/user/test]
                                                      Sending image list
                                                      
                                                      Please login prior to push:
                                                      Username :
                                                      Password:
                                                      Email :
                                                      
                                                      1
                                                      2
                                                      3
                                                      4
                                                      5
                                                      6
                                                      7
                                                      8
                                                      9

                                                      第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地 ~/.docker 目录下。

                                                      # 小结

                                                      具体介绍了围绕 Docker 镜像的一系列重要命令操作,包括获取、查看、搜索、删除、创建、存出和载入、上传等。你可以使用 docker image help 命令查看 Docker 支持的镜像操作子命令。

                                                      镜像是使用 Docker 的前提,也是最基本的资源。所以,在平时的 Docker 使用中,要注意积累自己定制的镜像文件,并将自己创建的高质量镜像分享到社区中。

                                                      edit icon编辑此页open in new window
                                                      上一页
                                                      核心概念与安装配置
                                                      下一页
                                                      操作 Docker 容器
                                                      MIT Licensed
                                                      Copyright © 2022 karin