Skip to main content

Command Palette

Search for a command to run...

如何高效迁移容器镜像

不借助公网镜像中心

Updated
1 min read

2024突然新增了几个PoC,需要在客户现场私有化部署(我的快速部署方案成了不二之选)。但是客户现场情况复杂:

  • 客户所提供部署用主机为内网机器,不允许访问公网;

  • 客户只提供一个跳板机可供我们远程连接;

  • 跳板机可访问公网;

历史做法

使用seafile

Seafile 是一款开源的企业云盘,注重可靠性和性能。支持 Windows, Mac, Linux, iOS, Android 平台。支持文件同步或者直接挂载到本地访问。

PoC所需要的容器镜像加起来有50G左右,这里以nginx镜像为例:

  1.  docker save nginx -o nginx.tar
    
  2. nginx.tar 上传到seafile上

  3. 远程连接到客户的跳板机,从seafile上下载nginx.tar包

  4. 解压并上传镜像到客户的镜像中心

     docker load -i nginx.tar
     docker tag nginx yourharbor.com/dev/nginx
     docker push theharbor.com/dev/nginx
    

问题

因为网速的原因,光是上传下载tar包,就相当费时间,整个过程相当地不友好,这种低效会让人非常难受,得想想办法了。

分析确定的现状:

  1. 不能用公网的镜像中心

  2. 只能用seafile

解决办法

压缩

在这种情况下只能想办法减少镜像包大小, 我最先想到是使用高压缩比,比如xz

xz使用LZMA算法进行压缩,压缩率可以达到gzip的2~3倍,是目前Linux系统中压缩率最高的压缩程序。但压缩速度非常慢。xz压缩文件的扩展名为.xz

nginx.tar: 271M

压缩后

tar -cJf nginx.tar.xz nginx.tar

nginx.tar.xz: 64M,压缩体积相当出色

tar -cJf nginx.tar.xz nginx.tar  118.46s user 1.92s system 95% cpu 2:06.01 total
tar -xf nginx.tar.xz  5.00s user 0.22s system 94% cpu 5.499 total

正如前面提到xz的缺点,压缩需2min左右,解压超过5s,但,高压缩比带来收益还是很可观的,从271M->64M,网速相对稳定的情况下,数据从seafile上传时间减少到原先的1/4,不能不说很优秀了。但是,xz对于大文件压缩时间感人,略加测试后,所以果断弃坑。那,还有没有其它的办法呢?

终极大招

前面提到nginx.tar文件大小为271M,但是使用docker images查看镜像大小为141M

nginx        latest    605c77e624dd   2 years ago   141MB

而在Harbor上看到的大小为仅为54.09M 而已,这个体积甚至低于nginx.tar.xz的64M,这已经不能用优秀来形容了,but why?

  • harbor上显示的是压缩后的镜像体积;

  • docker images看到的是镜像下载到本地后展开的体积(可以试着下载一个大一点的镜像,可以观察到DownloadingExtracting)过程,可以印证这一点。

  • docker save: 因为docker镜像采用的是分层存储方式,每一层只存储与上一层的差异内容。save命令将整个镜像一起保存,导致重复内容也会被重复保存,增加了文件的大小; save命令保存的是完整可运行的镜像,包含所有的所有历史版本、元数据、环境变量和配置

经过以上分析可知,docker镜像中心对镜像的存储优化已经做到极致了(仅限于笔者的认知),所以解决方案也就呼之欲出了: 使用镜像中心 harbor? 必须是registry

Distribution implementation for storing and distributing of container images and artifacts

当然不是,轻量级本地registry即可,将镜像数据挂载到本地的 image_data 目录

docker run -d -p 12345:5000 --restart=always --name registry \
  -v `pwd`/image_data:/var/lib/registry \
  registry:2

registry体积小,占用资源少,在这个场景下无疑是比harbor更好的选择

重新打tag

docker tag nginx localhost:12345/dev/nginx

推送

docker push localhost:12345/dev/nginx

看一下image_data目录大小

 55M    image_data

xz压缩后的体积

 53M    image_data.tar.xz

压缩后仅减少了2M,足以可见docker对容器镜像存储的压缩技术有多优秀了。所以,xz级别的压缩就显得没那么必要了,普通tar包即可

 54M    image_data.tar

将 image_data.tar 上传到seafile,客户现场启用本地registry,剩下就是一些体力活了,如果客户使用的是harbor,还可以直接使用harbor的复制管理功能,稍加配置即可完成镜像从本地registry到客户的harbor这一步,好了,打完收工。

总结

念念不忘,必有回响。对于低效的不满是因,想到registry是灵光一现,也是果。高压缩比方式是最容易想到的,但是细细整理下来,才发现docker生态对于镜像存储优化下了很大功夫,实在是让人佩服。这让我想起2020年还在网银时,当时老大亮哥给我分一任务,好像是梳理镜像下载的瓶颈,现在我只记得当时使用了sisdig各种工具测试,最后得出的结论是网络是瓶颈,但是后来又发现本地解压也很费时间,CPU为陡然变高,很可惜当时没有将过程记录下来,还是要多写哇。然后本篇我也是先做完再梳理的,也会有新的收获,最重要的是将数据对比记录并展现出来了。感叹当年Solomon Hykes做docker的魄力,也对“docker”背后公司现在的处境不胜唏嘘,最后祝愿Solomon Hykes 的新项目Dagger越来越好。

参考:

96 views

More from this blog

2025: 祛魅 灰度 念头通达

今天是2025年的最后一天,当大家都在准备下班的时候,好巧不巧的,我刚好发现了一个不大不小的问题,大胆猜想,小心求证,向上反馈,暴露风险,作为2025年工作注解,实在是再有趣不过了。 今年的工作,从结果上看,还算平稳,至于过程,有太多不可言说的部分。厂里打镙丝的牛马,有工资可拿,理应知足了,至于其它的,与己无关,也没那么重要了。 祛魅 近距离观察大厂,才发现一些违背常识/直觉的事实:路人以为的高大

Feb 28, 20261 min read21

大厂祛魅:破碎的专注力

毁掉一个人最直接的方法,就是毁掉ta的专注力。 这句话的出处已然模糊,但放在大厂环境中,却显得格外深刻。 围城 大厂宛如一座围城。城外的人满怀憧憬,目之所及皆是光鲜;城内的人却如困笼之鸟,翅膀日渐退化,每日挣扎求生。 高大上 不可否认,大厂的硬件设施确实令人艳羡:宽敞的独立园区内,来往穿梭的人群中,几乎人人手握智能设备。这看似现代化的景象背后,却藏着一个无奈的事实:在工作时段,每台电脑都被严密监控,连听音乐都成奢望。于是,工作之余玩手机,成了许多人难得的解压方式。 大厂的品牌效应确实强大。外界对...

Jul 29, 20251 min read138

Black Swan

黑天鹅理论 是指极不可能发生,实际上却又发生的事件 来到大厂打工已经满一个月了,从一开始的手足无措,到逐渐度过不适期,也算是适应了吧。 不适应 刚入职时,不适应的地方还是挺多的。 第一次只使用台式机工作,这就限制了我一天中的绝大部分时间,都必须呆在自己的工位上,好在工位足够大。只是人与人的沟通少了很多,有问题只能在工位上通过 IM 呼对方,有种魔幻又现实的感觉 第一次只能用 Windows,也不能 WSL,这给我的工作效率带来了很大影响,不能用熟悉的软件,就连写代码用的 VSCode 的...

Jan 24, 20251 min read74

2024年: 逐渐平静

这个世界是一面镜子,会把你的感受反射给你 2024 开端: 相由心生 那时,还带着一着愤懑,因为拿到了低绩效,虽然内心知道这是公司经营困难,想让我离开的一种策略,但仍然感受到自己那可笑的自尊受到了践踏。自那之后,非必要不加班,只做份内事,尽可能地不去涉及份外之事。 2024 年中: 与人为善 组里的项目眼见不行了,我被迫去支援 AI 项目,久违地写起了 python,项目接近完成时,意外收到通知:我拿到大礼包了。在这之前,架构师因故裸辞。在我离开之后不到两周,我的 TL 也裸辞了,直到同事告诉...

Jan 9, 20251 min read92

企业软件之殇

殇 动词 未成年而死。 名词 战死者。 笔者经历了两家打着云原生旗号的企业软件/解决方案公司,都是中途加入,项目都以解(失)散(败)告终。 云原生解决方案 NB 公司:一个传统的 IDC 小厂,想着借云原生的热度,进军企业软件市场。 在加入这个项目之前,笔者考取了 CKAD 认证,彼时对 K8s 相当着迷。先简要介绍一下这个项目背景: 基于 Rancher (换皮肤)的二次开发项目,名字叫:HCaaS ,在笔者加入这个团队之前,项目已经开发近两年了,除了 TL 之外,其它人之前都...

Jul 1, 20241 min read103

just for fun

57 posts

I'm a Software Engineer