docker镜像管理基础

docker镜像管理基础_第1张图片

从上图可以看出docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器

docker采用分层构建机制,最底层为bootfs,其次为rootfs

bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源

rootfs:位于bootfs之上,表现为docker容器的根文件系统:

         ~传统模式中,系统启动之时,内核挂载rootfs会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式。

        ~docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层

docker镜像管理基础_第2张图片

docker镜像管理基础_第3张图片

docker镜像管理基础_第4张图片

docker镜像管理基础_第5张图片

docker registry分类:

registry用于保存docker镜像,包括镜像的层次结构和元数据

用户可以自建registry,也可以使用官方的docker hub

分类:

        Sponsor(赞助) Registry:第三方的registry,供客户和docker社区使用

        Mirror Registry:第三方的registry,只让客户使用

        Vendor(供应商) Registry:由发布docker镜像的供应商提供的registry

        private registry:通过设有防火墙和额外的安全层的私有实体提供的registry

无论是哪种registry它都由两个部分组成:

       1.repository

            由某特定的docker镜像的所有迭代版本组成的镜像仓库

            一个registry中可以存在多个repository

                  repository可分为顶层仓库和用户仓库

                  用户仓库名称格式为“用户名/仓库名”

          每个仓库可以包含多个Tag(标签),每个标签对应一个镜像

       2.Index

           维护用户账号,镜像的校验以及公共命名空间的信息

           相当于为registry提供了一个完成用户认证等功能的检索接口

 docker registry中的镜像通常由开发人员制作,而后推送“公共”或“私有”registry上保存,供其他人员使用,例如部署到生产环境

镜像的制作方式有以下几种:

      1.Dockerfile

      2.基于容器制作

      3.docker hub automated builds

接下来我们就看看如何基于容器来制作镜像。

我们首先对镜像做出改变做出的改变如下

docker镜像管理基础_第6张图片

如果我们希望对于镜像所做的改变能够保存下来我们可以使用docker commit

docker镜像管理基础_第7张图片

docker commit的时候直接指明基于哪个容器做镜像,做完以后属于哪个仓库并且有哪个标签,如果省略就代表它不属于任何仓库,它就是本地的裸镜像。

如果我们在commit的时候这个镜像正在运行,就有可能出现数据丢失,所以我们在commit的时候最好使用-p将镜像暂停掉。

docker镜像管理基础_第8张图片

我们可以看到那个仓库为空,标签为空的镜像就是我们刚刚基于容器制作的镜像。

为了引用方便,我们也可以打上标签,可以使用docker tag命令

docker镜像管理基础_第9张图片

我们可以从提示看到这个命令的作用是给哪个镜像打上哪个标签。

docker镜像管理基础_第10张图片

这时我们可以看到我们已经为刚才制作的镜像打好标签了

刚才我们打标签的时候是根据镜像的id打的,我们也可以根据镜像的标签打

docker镜像管理基础_第11张图片

这个时候其实就相当于创建了一个软连接,当我们把这个新生成的镜像删除的时候我们可以发现它并没有删除镜像本身

它仅仅是删除了这个软连接

docker镜像管理基础_第12张图片

因为如果是删除镜像本身的话会有如下效果

docker镜像管理基础_第13张图片

接下来我们就来看看我们刚才基于容器制作的镜像的改变有没有保留下来

docker镜像管理基础_第14张图片

从上图我们可以看出改变被保留了,

这就是我们基于容器建立的镜像,但是我们所建的新镜像还没有改变它默认运行的命令,我们现在启动这个镜像它默认是启动shell的,要是我们不想默认启动shell而是想让他启动httpd该怎么做呢?

我们可以在commit的时候在参数里设置,我们首先来看看httpd的提示:

docker镜像管理基础_第15张图片

接下来我们看看docker commit的提示:

docker镜像管理基础_第16张图片

指定作者的时候一般都是名字+邮箱

指定默认命令的时候我们可以使用CMD,注意这里的CMD一定都是大写

然后就是中括号括起来的命令列表,我们可以使用which命令来查看命令的全路径

docker镜像管理基础_第17张图片

所以我们这次做镜像的命令就应该是下面这样子的

docker镜像管理基础_第18张图片

现在我们就来看看启动v0.2版本的效果

docker镜像管理基础_第19张图片

我们可以看到它不再是交互式的接口了,因为它现在默认是httpd

当然我们也可以将我们制作的镜像推送到docker hub上,

我们在推送之前可能需要先使用docker login进行登录

docker镜像管理基础_第20张图片

docker镜像管理基础_第21张图片

docker镜像管理基础_第22张图片

docker镜像管理基础_第23张图片

现在我们就已经将我们制作的镜像推送到docker hub上了

如何使用阿里云的镜像仓库执行push操作

docker镜像管理基础_第24张图片

从上图我们可以看到阿里云的镜像加速方法,和我们之前配置的docker.cn 的方法是一样的,我们需要将加速地址配置到仓库镜像列表中。

docker镜像管理基础_第25张图片

接下来我们就可以在阿里云中创建镜像仓库。

docker镜像管理基础_第26张图片

docker镜像管理基础_第27张图片

docker镜像管理基础_第28张图片

现在我们就已经创建好了阿里云的镜像仓库

我们点击管理就可以查看这个镜像仓库的操作指南

docker镜像管理基础_第29张图片

docker镜像管理基础_第30张图片

从上图我们可以看到如果我们想将镜像push到阿里云的镜像仓库中,我们就需要将镜像按照所提示的格式重新打标签。

docker镜像管理基础_第31张图片

这样做的原因是,如果不是上传到docker hub上都需要按照这个格式:

服务器地址/用户名/仓库名

我们现在要push的话还需要先登出docker hub上的账号,然后重新登录阿里云的账号

docker镜像管理基础_第32张图片

docker镜像管理基础_第33张图片

docker镜像管理基础_第34张图片

从上图中我们可以看到我们已经成功把镜像上传到阿里云的镜像仓库中了。

镜像的导入和导出

假如我们有两台主机marshal1和marshal2,这两台机器都装了docker了,我在marshal1上做了一个镜像,但是marshal2想用这个镜像该怎么做?

我们可以做两件事:1.我们将这个镜像推到公共的位置。2.我们在另一台机器上pull下来就好了。

但是这种方式好像还是有点麻烦。如果只是测试用的话没必要这么做。

我们可以将已有的镜像打包,然后放到marshal2上再导出

docker镜像管理基础_第35张图片

接下来我们在另一台机器上也装docker

docker镜像管理基础_第36张图片

docker镜像管理基础_第37张图片

docker镜像管理基础_第38张图片

docker镜像管理基础_第39张图片

这里可以看到我们之前配置的加速镜像。

接着我们将之前在marshal上打包的镜像分发到marshal01上

然后我们将打包好的导入

docker镜像管理基础_第40张图片

docker镜像管理基础_第41张图片

现在我们就可以看到已经成功导入了。

 

你可能感兴趣的:(docker)