超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找

一、镜像介绍

  • docker镜像是由文件系统叠加而成,最底端是一个引导文件系统,即bootfs,这很像典型的linux的引导文件系统。docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它会被移到内存中,而引导文件系统则会被卸载,以留出更多的内存共initrd磁盘镜像使用
  • 到目前为止,docker看起来还很像一个典型的linux虚拟化栈。实际上,docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上
  • 在传统的linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,它才会被切换为读写模式,但是在docker里,root文件系统永远只能是只读状态,而且docker利用联合加载(union mount,http://cn.wikipedia.org/wiki/Union_mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统,联合加载会将各文件系统叠加在一起,这样最终的文件系统会包含所有底层的文件和目录
  • docker将这样的文件系统成为镜像,一个镜像可以放在另一个镜像的顶部。位于下面的镜像成为父镜像。最底层的镜像称为基础镜像。最后,当从一个镜像启动容器时,docker会在该镜像的最顶层加载一个读写文件系统。我们想在docker中运行的程序就是在这个读写层中执行的

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 当docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上。比如,如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏
  • 通常这种机制被称为写时复制。每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,docker会构建一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。容器是可以修改的,并且是可以启动和停止的。容器的这种特点加上镜像分层框架,使我们可以快速构建镜像并运行包含我们自己的应用程序和服务的容器

二、镜像仓库(Docker Hub)

  • 镜像保存在Registry的仓库中,默认的Registry是由Docker公司运营的公共Registry服务,即Docker Hub,网址为:https://hub.docker.com/。可以把Docker Hub看成类似于Github一样的网址

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 例如,如果想要搜索ubuntu的镜像,可以在左上角的搜索栏处进行搜索

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

仓库类型

  • 开源免费版:就是Docker Hub提供的仓库与镜像,本文和下一篇文章(https://blog.csdn.net/qq_41453285/article/details/107389320)都会介绍如何在Docker Hub中进行镜像的拉取与推送等知识
  • 私有Registry:私人的仓库与镜像,可以参阅:https://blog.csdn.net/qq_41453285/article/details/107393908
  • 商业版的Docker Hub:同时,Docker公司也提供了一个商业版的Docker Hub,即Docker Trusted Registry,这是一个可以运行在公司防火墙内部的产品,之前被称为Docker Enterprise Hub
  • 其他可选的Registry:也有很多其他公司和服务提供定制的Docker Registry服务。例如:Quay(http://quay.io/)服务提供了私有的Registry托管服务,允许用户上传公共的或者私有的容器。目前它提供了免费的无限制的公共仓库托管服务,如果想要托管私有仓库,它还提供了一系列的可伸缩计划。Quay最近被CoreOS(http://coreos.com/)收购了,并会被整合到他们的产品中去

三、镜像的查看(images)

  • 可以使用images命令查看当前系统中已存在/下载的镜像列表
  • 例如,在前一篇文章中我们从Docker Hub上拉取了一个ubuntu的镜像,如下所示:
    • REPOSITORY:该镜像所属的仓库名称
    • TAG:镜像的标签(见下面介绍)
    • IMAGE ID:镜像ID
    • CREATED:镜像创建的时间
    • SIZE:镜像的大小
sudo docker images

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 当然,可以在images后面指定镜像名来查看指定的镜像
sudo docker images ubuntu

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

附加:存储路径

  • /var/lib/docker:该目录存放着Docker镜像、容器以及容器的配置

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • /var/lib/docker/image:这个目录下存放着镜像

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • /var/lib/docker/containers:所有的容器都保存在该目录下

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

四、镜像的标签

  • 在上面我们查看本地镜像的时候,可以看到其有一个TAG标签选项

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

标签介绍

  • 作用:一个仓库中可以有多个镜像。为了区分一个仓库中不同的镜像,Docker提供了标签(tag)的功能
  • 每个镜像在列出来时都会带有一个标签,如16.04、18.04、quantal或者precise等。每个标签对组成特定镜像的一些镜像层进行标记(比如,标签16.04就是对所有ubuntu 16.04镜像的层的标记)
  • 同一个仓库中,可以同时存在多个相同的镜像(IMAGE ID相同),只要标签(TAG)不同就可以了

仓库名称介绍

  • 每个仓库都拥有一个名称,格式如下:
    • ID:Docker Hub中存在的账户ID
    • name:为自定义的名称
ID/name
  • 上面ID/name是一个仓库的名称,归属于ID用户所有
  • 例如,如下图所示:
    • 该用户ID为luksa
    • 其拥有若干仓库,每个仓库的名称就是以luksa/xxx命名

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

演示案例

  • 例如,进入Docker Hub网页来看看,搜索ubuntu仓库

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 进入之后,选择“Tags”选项,查看这个仓库中有哪些镜像,可以看到有很多的镜像,为了区分这些镜像,Docker Hub给这些进行镜像设置了标签,例如下图中有3种镜像,标签名分别为“latest”、“xenial-20200619”、“xenial”

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 往下面拉还可以找到其他镜像,例如有20.04的、18.04的等等

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

五、镜像的拉取(pull)

  • 在前面的文章中我们介绍了,在执行docker run命令运行容器时,如果运行的镜像没有,那么就会去Docker Hub中拉取镜像到本地中。命令如下:
# 如果本地没有ubuntu镜像,就会去Docker Hub中拉取镜像
sudo docker run -t -i ubuntu /bin/bash
  • docker pull:除了上面运行容器时去下载镜像,我们还可以主动去Docker Hub仓库中拉取镜像。命令如下:
# 去拉取镜像
sudo docker pull ubuntu

与标签的关系

  • 在默认的情况下,docker run和docker pull在下载镜像的时候,如果没有指定镜像的标签,那么默认下载的是标签为“latest”的镜像。就是下面这个镜像:

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

演示案例:运行指定标签的镜像

  • 例如,下面我们使用docker run运行一个指定标签的镜像
# 回去下载标签为16.04的镜像,而非默认的latest镜像
sudo docker run -t -i --name container_16.04 ubuntu:16.04 /bin/bash

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 上面下载的就是ubuntu仓库中的这个镜像

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 同理,下载ubuntu:16.04镜像的docker pull命令如下:
sudo docker pull ubuntu:16.04
  • 下载完成之后查看一下我们下载的镜像:
sudo docker images

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

演示案例:拉取指定镜像

  • 下面我们拉取一个fedora:rawhide镜像来玩玩
sudo docker pull fedora:rawhide

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 就是拉取的下面这个镜像

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 下载完成之后查看一下
sudo docker images

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

六、镜像的查找(search)

  • 我们可以通过docker search命令来查找所有Docker Hub上公共的可用镜像

演示案例

  • 例如下面查找有关于puppet镜像的仓库,命令如下:
sudo docker search puppet
  •  显示的内容如下:
    • NAME:仓库的名称
    • DESCIRPTION:镜像描述
    • STARS:用户评价。反映出这个镜像的受欢迎程序
    • OFFICIAL:是否官方。由上游开发者管理的镜像(如fedora镜像由Fedora团队管理)
    • AUTOMATED:自动构建。表示这个镜像是由Docker Hub的自动构建(Automated Build)流程创建的

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 我们到官网中去搜索,也可以搜索到

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 下面我们拉取搜索到的第一个镜像来玩玩,命令如下:
    • 由于这个仓库中只有一个镜像,所以就没有什么标签可指定了
sudo docker pull pupprt/puppetserver

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 下载完成之后可以试着来运行玩玩
sudo docker run -i -t pupprt/puppetserver
  • 搜索ubuntu的镜像如下:
sudo docker search ubuntu

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

  • 我是小董,V公众点击”笔记白嫖”解锁更多【Docker】资料内容。

《超详细,带你玩转Docker镜像、Docker Hub仓库、镜像的查看、标签、拉取、查找》

    原文作者:董哥的黑板报
    原文地址: https://blog.csdn.net/qq_41453285/article/details/107373140
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞