Docker 实践经验(二)镜像的构建、镜像仓库、压缩、导入

语言: CN / TW / HK

@[toc]

一篇文章写三遍,去除杂质,提炼干货。这是一系列有温度的博客。

构建镜像:docker commit

运行的虚拟机一旦出了故障,则在其之上的很多操作便都作废,要重头来过。但是聪明的人总是有的,所以虚拟机可以打快照。那么在使用容器的时候,万一容器给出了故障,那不也意味着前功弃了一大半(留下多少,下一篇会讲解存储卷。)这就好比我基于 docker 构建了一个三主三从的 redis 集群,docker 一关机,我的集群就要重新搭建了。

构建镜像很简单,一行命令就搞定了,也不需要网络。

docker commit -m="镜像描述" -a="作者信息" 容器id 镜像名:版本号

复制代码

当然,还有其他的 options 可以选择,需要的话:docker commit -h。

小 tips

为什么说 docker 容器一定要勤于备份呢,因为 docker 容器被误删的风险是要比 VMware 要高的,这也是上一篇我为什么只说用 Ctrl+p+q 退出 docker 的原因,不当的退出是会直接把整个容器都给你关掉的。

想象一个画面:你正吭哧吭哧的在你的 “铁索连环” 的容器上开发,这时候一个不长眼的在退出的时候误操作了,整个容器给你关了。哦豁,刺激,你是选择扁他一顿呢,还是扁他一顿呢,还是扁他一顿呢?

如果没有备份,那你扁他几顿都没用了。

镜像分层 与 联合文件系统

远的不说,我们再看一下上一篇里面的一张图,当时 run redis 的:

看是有五个 Pull complete 的。这说明什么?说明是下载了五个东西,最后拼出一个 redis 来。

这样有什么好处?如果积木搭好了为什么不融成一块?稍微思考思考。

UnionFS(联合文件系统):Union 文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

Docker 镜像加载原理

一遍没看明白可以多看两遍、

bootfs(boot file system) 主要包含 bootloader 和 kernel, bootloader 主要是引导加载 kernel, Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是引导文件系统 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。

rootfs (root file system) ,在 bootfs 之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,Centos 等等。

对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的 linux 发行版, bootfs 基本是一致的, rootfs 会有差别, 因此不同的发行版可以公用 bootfs。

==Docker 镜像层都是只读的,容器层是可写的==。 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。

镜像仓库 && 推送镜像到仓库

等到了工作岗位,你的导师会教你怎么用你们公司的镜像仓库的。

推送镜像到仓库的命令为:docker push 镜像名:[tags]

不过这里的镜像名会带一些域名,这个跟镜像仓库有关,不同的仓库会有不同的域名。一般镜像仓库的说明书会介绍,没有介绍可以问导师或同事。

压缩镜像:docker save

要保存镜像除了推送到远端仓库之外,还有一个办法,就是将镜像打包成一个压缩包。这也是我为什么不讲镜像仓库的原因。

一般在网上你们看到的压缩镜像命令就是 docker save 镜像名:版本号 了,这样打包出来的文件还是会偏大。我实习的第一个任务就是打包 docker 镜像,最初我也是这样操作的,但是还没打包完全部,就发现空间就被占用的差不多了。于是我便求助于我的导师,他给了我一个命令:

docker save xxx:yyy | gzip -9 > zzzzz.tar.gz

复制代码

让我再去试试看大小。

要不说他是我导师呢,有经验!!!

实习也快结束了,我导师对我是真的好啊,这可羡煞我的两个小伙伴了哈哈。

导入镜像:docker load

前面压缩了镜像,是为了这里拿来导入,不然压缩它干嘛。

导入命令也很简单:

docker load < 镜像名.tar.gz

复制代码

导入完之后:

docker images | grep xxxxx

复制代码

上一篇忘了把 grep 带上了。那么多的镜像,真要一个一个去翻的话,估计要累瞎我的钛合金狗眼了,这招也是我导师教我的。