我维护着多台服务器,它们位于世界各地网络状况非常差的偏远地区。这些服务器运行多个 Docker 容器,其中一些基于相当大的镜像(我们正在单独努力减少这种情况,但这是长期的)。
这些服务器只能通过反向 ssh 隧道访问,网络连接经常中断。带宽通常也相当低(有时只有 ~50kbps 甚至更低)。
据我所知,我有两种传输图像的选项,每种选项都有一些问题。
使用docker存储库和docker pull:
- 不能很好地处理网络中断,整个下载从头开始重新开始。
- 不重新下载已经下载的层,从而减少了下载仅有上层变化的新版本所需的时间和带宽。
使用 docker save、rsync 和 docker load:
- Rsync 允许继续部分下载,我们可以开始下载并重试直至完成。
- 只能保存和传输整个图像,包括所有层。因此,即使与上一版本相比,最顶层只有几 KB 发生了变化,我们也必须下载整个图像。
所以,我的问题是,有没有其他方法可以传输这些图像,同时兼具这两种方法的优点?那么哪种方法可以恢复中断的下载,但不需要每次都下载完整的图像?
答案1
我想到了一些想法
如果您正在智能地构建图像,您可以结合这两种技术并使用 rsync 进行初始加载,使用 docker pull 进行后续更新(因为此时它只会提取更改的层)
您可以标记更多层,这样您就不必再拥有 1 个包含 10 个层的 Docker 映像,而是拥有 5 个包含 2 个层的 Docker 映像。您可以拆分为多个 Dockerfile,也可以事后标记层(有关详细信息,请参阅“docker tag layerHash tagName”https://gist.github.com/dasgoll/476ecc7a057ac885f0be)
对此不太确定,但您应该能够通过指定图层哈希来导出单个图层而不是整个图像。图层和“图像”之间的唯一区别是图像具有分配给图层的可读标签
解压导出的图像,仅传输新层,然后通过将新层与缓存层相结合来重新压缩(导出图像时,它只是一个 tar,其中每层有 1 个 tar)
不要使用 Docker 进行构建——只需组装和运行。使用这个,你只需传输一个 rootfs(可能是常规文件,让 rsync 处理压缩),然后将它们打包成 tar 并执行一个普通的 Dockerfile,它只执行
ADD rootfs.tar /
并包含你的运行命令。这将确保不会复制任何不必要的内容
您还可以将这些方法与 Bittorrent 之类的方法结合起来以分发文件