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 import
从 one 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 import
与 docker 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
这样所有的层都被导入。
我了解 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 import
从 one 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 import
与 docker 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
这样所有的层都被导入。