Docker 中的 import 和 load 有什么区别?

What is the difference between import and load in Docker?

我了解 export(容器)和 save(图像)之间的区别。但归根结底,保存或导出生成的 tarball 应该用作 图像

那么为什么有 2 个命令可以从 tarball 制作图像?

docker save 确实会生成一个 tarball, 但是 包含所有父层和所有标签 + 版本。

docker export 也会生成压缩包,但没有任何 layer/history.

经常使用"flatten" an image, as illustrated in "Flatten a Docker container or image" from Thomas Uhrig:

docker export <CONTAINER ID> | docker import - some-image-name:latest

但是,一旦生成这些压缩包,load/import 就可以:

  • docker importone tarball 创建 one 图像,甚至一个图像(只是一个你想作为图像导入的文件系统)

Create an empty filesystem image and import the contents of the tarball

  • docker load 从 tarred 存储库中创建潜在的 多个 个图像(因为 docker save 可以将 多个 个图像保存在压缩包)。

Loads a tarred repository from a file or the standard input stream

docker import 主要用于从 运行 容器创建的 tar 球。对于例如。 docker export containerID > /home/cntr.tar 然后将这个 tarball 导入图像 例如。 docker 导入 /home/cntr.tar mynewimage:tag

docker load 用于从另一个图像创建的 tar 球加载图像。对于例如。 docker 保存 > /home/fromimg.tar 然后用 docker 载入 < /home/fromimg .tar

虽然 docker save/load 与图像的主要区别确实保留了图像历史记录。而 docker export/import with container 通过删除容器的所有历史记录使图像变平。

作为 Docker-newbie,我通过 艰难的方式 了解了这种差异。

  • 在一个系统上:

    docker run -it myImage /bin/bash
    

    --> 工作正常

  • 在同一系统上(使用 保存):

    docker save myImage -o myImage.tar
    
  • 在第二个系统上(使用 import):

    docker import myImage.tar
    

    --> 运行良好,没有问题,只需要标记:

    docker tag _the_assigned_tag myImage
    
  • 在第二个系统上:

    docker run -it myImage /bin/bash
    

    docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown.

寻找那个错误让我想到了各种原因,例如 MountFlags="slave",但真正的原因竟然是这个 post 中描述的原因:我应该使用加载而不是进口。不知道发生了什么,Docker 的错误消息并没有让我在任何意义上朝着 "import" 的方向前进,直到我偶然发现了这个 post.

我想分享与使用 docker save 和在生产服务器上使用 docker importdocker load.

的另一个区别

在可以访问互联网的服务器上 docker import 的工作方式与 docker load 相同。容器已启动,运行 没有错误,并且已通过互联网下载缺失的图层。

在没有互联网的服务器上 - on-prem 设置 docker import 导致容器启动时出现上述错误,例如

docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: "/bin/bash": stat /bin/bash: no such file or directory": unknown.

为了获得保存的容器,运行 没有它我们需要使用 docker load < saved-container.tgz 这样所有的层都被导入。