文章目录
一、环境信息
-
本文的测试
Docker版本信息如下[root@apps data]# docker info | grep 'Server Version' Server Version: 19.03.12 -
采用本文实验版本一定可以通过以下测试功能的复现
二、Docker Save & Docker Load
· docker save
-
语法定义
[root@apps /]# docker save --help Usage: docker save [OPTIONS] IMAGE [IMAGE...] Save one or more images to a tar archive (streamed to STDOUT by default) Options: -o, --output string Write to a file, instead of STDOUT -
命令解释
docker save是用来将一个或者多个image导出为tar文件的保存命令 -
实验演示
# 将本地镜像库中的 redis 和 mongo 打包成一个 tar 文件 docker save -o redis-mongo-save.tar redis:6.0.9 mongo:4.0.21 # 打包以后的 redis-mongo-save.tar 包含了 redis:6.0.9 和 mongo:4.0.21 两个镜像文件 [root@apps data]# docker save -o redis-mongo-save.tar redis:6.0.9 mongo:4.0.21 [root@apps data]# ll 总用量 526044 -rw-------. 1 root root 538665984 11月 13 17:41 redis-mongo-save.tar -
虽然官网的命令行帮助说明要求指定
image进行导出,但是实际上也可以对container进行打包导出# 将镜像运行成为容器,并将容器命名为 redis [root@apps data]# docker run -d --name redis redis:6.0.9 b7842daf10c8baa007c1893617cfef23a7f8ce58d9c867fb22b476b4c30f0d5c # 查看容器运行状态 [root@apps data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7842daf10c8 redis:6.0.9 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 6379/tcp redis # 将 redis 镜像导出为 tar 文件 [root@apps data]# docker save -o redis-image-save.tar redis:6.0.9 # 将 redis 容器导出为 tar 文件 [root@apps data]# docker save -o redis-container-save.tar redis # 查看导出结果可以看出,导出目标为镜像的和导出目标为容器的大小都是一样大的 [root@apps data]# ll 总用量 736316 -rw-------. 1 root root 107658752 11月 13 17:48 redis-container-save.tar -rw-------. 1 root root 107658752 11月 13 17:48 redis-image-save.tar -rw-------. 1 root root 538665984 11月 13 17:41 redis-mongo-save.tar [root@apps data]#P.S
通过上一步的操作可以说明,
docker save如果指定container来导出文件,最后导出的也是该容器背后的镜像文件。
· docker load
-
语法定义
[root@apps data]# docker load --help Usage: docker load [OPTIONS] Load an image from a tar archive or STDIN Options: -i, --input string Read from tar archive file, instead of STDIN -q, --quiet Suppress the load output [root@apps data]# -
命令解释
docker load是用来将指定镜像的tar文件导入到本地镜像库的导入命令 -
实验演示
# 通过将上述 redis-mongo-save.tar 文件导入到本地镜像库 [root@apps data]# docker load -i redis-mongo-save.tar Loaded image: redis:6.0.9 Loaded image: mongo:4.0.21 # 如果本地镜像库中已经存在这两个镜像,则已存在的将会被覆盖
P.S
采用 docker save & docker load 的使用场景,如果你的应用程序是通过 docker-compose.yml 编排的多个镜像组合,但是你要部署的客户服务器并不能连接外网。这时,我们就可以使用 docker save 将用到的镜像打个整体的包,然后拷贝到客户服务器上使用 docker load 来将镜像载入到客户服务器的本地镜像库。
三、Docker Export & Docker Import
· docker export
-
语法定义
[root@apps data]# docker export --help Usage: docker export [OPTIONS] CONTAINER Export a container's filesystem as a tar archive Options: -o, --output string Write to a file, instead of STDOUT -
命令解释
docker export命令是用来将指定container导出为tar文件的保存命令 -
实验演示
[root@apps data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7842daf10c8 redis:6.0.9 "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 6379/tcp redis [root@apps data]# docker export -o redis-container-export.tar redis [root@apps data]# ll 总用量 838036 -rw-------. 1 root root 104160768 11月 13 18:14 redis-container-export.tar -rw-------. 1 root root 107658752 11月 13 18:12 redis-container-save.tar -rw-------. 1 root root 107658752 11月 13 18:11 redis-image-save.tar -rw-------. 1 root root 538665984 11月 13 18:11 redis-mongo-save.tar -
docker export需要指定的是container,不能像docker save那样既可以指定image又可以指定container
· docker import
-
语法定义
[root@apps data]# docker import --help Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] Import the contents from a tarball to create a filesystem image Options: -c, --change list Apply Dockerfile instruction to the created image -m, --message string Set commit message for imported image --platform string Set platform if server is multi-platform capable -
命令解释
docker import命令是用来将指定container导入为image文件,并将image保存到本地镜像仓库 -
实验演示
# 找到通过 docker export 导出的容器 tar 文件 [root@apps data]# ll 总用量 838036 -rw-------. 1 root root 104160768 11月 13 18:14 redis-container-export.tar -rw-------. 1 root root 107658752 11月 13 18:12 redis-container-save.tar -rw-------. 1 root root 107658752 11月 13 18:11 redis-image-save.tar -rw-------. 1 root root 538665984 11月 13 18:11 redis-mongo-save.tar # 将通过 docker export 导出的容器 tar 文件导入为该容器的镜像并保存到本地镜像仓库 [root@apps data]# docker import redis-container-export.tar redis:V1.0.0.0 sha256:b4113a3c8317b7627e7b193cbef4f555b679d71739c56fa40026281e666b689d # 可以看到上一步导入的自定义版本的镜像仓库 [root@apps data]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis V1.0.0.0 b4113a3c8317 8 seconds ago 101MB mongo 4.0.21 e46cbb62419f 15 hours ago 425MB redis 6.0.9 62f1d3402b78 2 weeks ago 104MB -
docker import将container导入后成为一个image,而不是恢复为一个container。docker import在将容器导入为镜像时,可以指定镜像的版本号。docker import的应用场景,主要是用来制作自定义基础镜像。比如:你从CentOS 7镜像启动成为了一个容器,并进入容器安装了很多软件(java、yum、redis),使用docker export将容器导出为tar文件,然后将该tar文件通过docker import导入为一个镜像文件,并分发给其他人使用。
P.S
docker save保存的目标对象是镜像也可以是容器docker load载入的目标对象是镜像tar,并将镜像tar载入到本地镜像仓库(将镜像恢复为镜像)docker export保存的目标对象是容器docker import载入的目标对象是容器tar,并将容器tar导入到本地镜像仓库(将容器恢复为镜像)docker load不能对载入的镜像重命名,docker import可以为镜像指定新名称和版本号
四、步骤二和步骤三混打
-
能否将
docker export导出的tar文件,再使用docekr load导入到镜像仓库???[root@apps data]# docker load -i redis-container-export.tar open /opt/lib/docker/tmp/docker-import-544933863/bin/json: no such file or directoryP.S
采用
docker export命令导出为tar文件的不能采用docker load来导出为镜像文件 -
能否将
docker save导出的tar文件,再使用docker import导入到镜像仓库???# 通过 docker import 命令将通过 docker save 导出的镜像再导入到镜像仓库可以成功 [root@apps data]# docker import c save-redis:V1.0.0.1 sha256:06426c8ee4a0f2caf259fde5033fdba663308ce892a017077e156256bf73fed2 [root@apps data]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE save-redis V1.0.0.1 06426c8ee4a0 7 seconds ago 108MB redis V1.0.0.0 b4113a3c8317 2 days ago 101MB mongo 4.0.21 e46cbb62419f 3 days ago 425MB redis 6.0.9 62f1d3402b78 2 weeks ago 104MB # 尝试启动,则启动失败 [root@apps data]# docker run save-redis:V1.0.0.1 docker: Error response from daemon: No command specified. See 'docker run --help'.
五、分析和总结
分析
-
查看通过
docker save和docker export导出的tar文件的内容区别
-
从上面的对比可以看出
docker save导出的tar文件其实是一个docker分层文件系统,docker export导出的tar文件内容是一个Linux系统的文件目录 -
Docker镜像实际上就是由一层一层文件进行叠加起来的,上层的文件会覆盖下层的同名文件,如果将redis-container-save.tar中的各层文件合并到一起,基本上就是redis-container-export.tar的全部内容,由于redis-container-save.tar里面的各层文件会存在很多重复的文件,这也解释了为什么通过docker save命令导出的tar会比docker export命令导出的tar要大很多的原因
总结
-
docker load必须要载入的是一个分层系统,而redis-container-export.tar并不具备这样的结构,因此无法载入 -
docker import仅仅是将tar包里面的文件复制进来,所以不管tar包里面的文件结构是怎样的都可以载入进来,所以能够载入redis-container-save.tar -
但是
redis-container-save.tar并不是一个有效的操作系统镜像,因此当我们试图以docker import命令导入的该镜像启动为容器时,容器并不能启动。
本文详细介绍了Docker的镜像和容器导出导入操作,包括docker save与docker load用于镜像的保存和加载,docker export与docker import用于容器的导出和导入。通过实例展示了不同命令的使用方法和区别,如docker save导出的tar文件包含完整分层文件系统,大小较大,而docker export导出的仅包含容器的文件系统,大小较小。此外,docker load只能导入由docker save导出的镜像,而docker import能导入由docker export导出的容器,但无法启动。

1620

被折叠的 条评论
为什么被折叠?



