docker - 我们如何才能仅导出/导入(或保存/加载)新更改?

问题描述 投票:0回答:4

我是 docker 新手,任何人都可以帮助解决以下问题吗

  1. 服务器有一个 docker 镜像,如 1GB Image:ver1 [此镜像存储在服务器中有 .tar 文件]
  2. 在 ubuntu PC 中从服务器下载 tar 镜像并使用 Docker 加载/导入镜像[Image:ver1]
  3. Server 上提供了新的 Image:ver2,大小仍然是 1GB,但与 ver1 的差异只有 10MB。

Q1:如果可以从服务器“导入/加载”新图像[Image:ver2],我们如何仅导出/导入(或保存/加载)新更改[即10MB]?

Q2:如果我们能够在现有图像[即图像:Ver1]之上应用上述更改,需要执行哪些步骤?

docker docker-compose dockerfile virtualization
4个回答
2
投票

如果您想保存/加载 docker 镜像的 tar 文件,则无法导出部分镜像。您可以发送完整映像,将数据移动到不以这种方式传输的外部卷,或者您可以使用 Docker 注册表。

后者相对容易实现,docker 包含一个镜像,您可以在其中运行自己的私有注册表。推送和拉取到 Docker 注册表只会发送更改的层,因此您可以利用层缓存并构建 Dockerfile 来最大程度地减少更改的层数。


1
投票

Docker 是一个基于文件的系统,对于每个 Pull 请求,它只提取发生更改的文件。例如,假设 docker 镜像的文件中有 1 GB 数据。现在,您向其中添加了 500MB 的数据。然后,在 docker pull 的情况下,它只会拉取更改,即两个文件之间的 Delta 部分。所以,你是安全的,它不会单独拉所有的东西。

尽管在制作 DockerFile 或 docker conf 文件时,您应该非常小心,因为 Docker 文件中的所有行都作为系统中的一层存储。如果假设你的 Docker 文件中有 10 层,并且你正在更改第 5 层,那么第 5 层之后的所有层将再次被拉取。这是使用 Docker 的唯一问题。 休息一下,它总是会拉取每个拉取请求的更改增量。


1
投票

好的,我已经构建了 tool 来创建 docker 镜像版本(逐层)的差异(在顶层)作为 tarball,并稍后膨胀原始镜像。

注意。仅适用于顶层中的更改。

4步过程:

  1. docker检查->使用旧层的哈希值将json制作为json文件
  2. 根据新图像和旧(现有)层的哈希值准备差异
  3. 将差异传输到目标机器
  4. 根据 diff 和旧图像膨胀目标图像的 tar

0
投票

此问题的最佳解决方案是使用本地“Docker 注册表”作为中介。在您的系统上运行“registry:latest”。请参阅官方指南

然后将基础镜像和派生镜像推送到同一个注册表。您将看到派生图像只会将新图层导出到注册表。 在目标机器上拉取派生镜像,同时拥有基础镜像,只会拉入缺失的层。

© www.soinside.com 2019 - 2024. All rights reserved.