Docker 实践经验(二)镜像的构建、镜像仓库、压缩、导入
@[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 带上了。那么多的镜像,真要一个一个去翻的话,估计要累瞎我的钛合金狗眼了,这招也是我导师教我的。
- 12 年后,树模型 ABC-Boost 终于开源,精度超过 XGBoost、LightGBM
- STM32 ESP8266 MQTT 协议连接 OneNet 物联网平台
- 一晚上累计 292 万人紧盯 Flightradar24 网站,航班跟踪的技术原理是什么?
- Spotify 如何可视化系统架构图
- 【CSS】基础选择器,包括标签选择器、类选择器、id 选择器和通配符选择器...
- 竞赛:糖尿病遗传风险检测挑战赛(科大讯飞)
- 分享一款实用的太阳能充电电路(室内光照可用)
- 一篇搞定 Redis 中的 BigKey 问题
- 微软推出 Azure Developer CLI 公开预览版,帮助开发者加速云应用开发
- 小心你的字典和样板代码
- 【高并发项目实战】千万级并发的购物车系统设计与代码详解
- 只有 Chromium 的 Web 会是什么样子?
- 手写分布式配置中心(1)
- 顺丰科技 Service Mesh 落地半年:最初目标已经实现,将在更多场景进行大规模探索
- 从程序员到架构师,如何才能快速成长?
- 拿过不合格绩效,但也创造出世界顶级开源项目:梦想用“机器编程”改变工程世界 | 专访 OpenResty 章...
- 初识机密计算(Confidential Computing)
- SRv6 网络的安全解决方案
- 分布式数据库在金融核心场景的落地实践
- 开发者独立搭建一个跨模态搜索应用有多难?