从上图可以看出docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器
docker采用分层构建机制,最底层为bootfs,其次为rootfs
bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
rootfs:位于bootfs之上,表现为docker容器的根文件系统:
~传统模式中,系统启动之时,内核挂载rootfs会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式。
~docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层
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 commit
docker commit的时候直接指明基于哪个容器做镜像,做完以后属于哪个仓库并且有哪个标签,如果省略就代表它不属于任何仓库,它就是本地的裸镜像。
如果我们在commit的时候这个镜像正在运行,就有可能出现数据丢失,所以我们在commit的时候最好使用-p将镜像暂停掉。
我们可以看到那个仓库为空,标签为空的镜像就是我们刚刚基于容器制作的镜像。
为了引用方便,我们也可以打上标签,可以使用docker tag命令
我们可以从提示看到这个命令的作用是给哪个镜像打上哪个标签。
这时我们可以看到我们已经为刚才制作的镜像打好标签了
刚才我们打标签的时候是根据镜像的id打的,我们也可以根据镜像的标签打
这个时候其实就相当于创建了一个软连接,当我们把这个新生成的镜像删除的时候我们可以发现它并没有删除镜像本身
它仅仅是删除了这个软连接
因为如果是删除镜像本身的话会有如下效果
接下来我们就来看看我们刚才基于容器制作的镜像的改变有没有保留下来
从上图我们可以看出改变被保留了,
这就是我们基于容器建立的镜像,但是我们所建的新镜像还没有改变它默认运行的命令,我们现在启动这个镜像它默认是启动shell的,要是我们不想默认启动shell而是想让他启动httpd该怎么做呢?
我们可以在commit的时候在参数里设置,我们首先来看看httpd的提示:
接下来我们看看docker commit的提示:
指定作者的时候一般都是名字+邮箱
然后就是中括号括起来的命令列表,我们可以使用which命令来查看命令的全路径
所以我们这次做镜像的命令就应该是下面这样子的
现在我们就来看看启动v0.2版本的效果
我们可以看到它不再是交互式的接口了,因为它现在默认是httpd
当然我们也可以将我们制作的镜像推送到docker hub上,
我们在推送之前可能需要先使用docker login进行登录
现在我们就已经将我们制作的镜像推送到docker hub上了
从上图我们可以看到阿里云的镜像加速方法,和我们之前配置的docker.cn 的方法是一样的,我们需要将加速地址配置到仓库镜像列表中。
接下来我们就可以在阿里云中创建镜像仓库。
现在我们就已经创建好了阿里云的镜像仓库
我们点击管理就可以查看这个镜像仓库的操作指南
从上图我们可以看到如果我们想将镜像push到阿里云的镜像仓库中,我们就需要将镜像按照所提示的格式重新打标签。
这样做的原因是,如果不是上传到docker hub上都需要按照这个格式:
服务器地址/用户名/仓库名
我们现在要push的话还需要先登出docker hub上的账号,然后重新登录阿里云的账号
从上图中我们可以看到我们已经成功把镜像上传到阿里云的镜像仓库中了。
假如我们有两台主机marshal1和marshal2,这两台机器都装了docker了,我在marshal1上做了一个镜像,但是marshal2想用这个镜像该怎么做?
我们可以做两件事:1.我们将这个镜像推到公共的位置。2.我们在另一台机器上pull下来就好了。
但是这种方式好像还是有点麻烦。如果只是测试用的话没必要这么做。
我们可以将已有的镜像打包,然后放到marshal2上再导出
接下来我们在另一台机器上也装docker
这里可以看到我们之前配置的加速镜像。
接着我们将之前在marshal上打包的镜像分发到marshal01上
然后我们将打包好的导入
现在我们就可以看到已经成功导入了。