结论:通过测试,存出镜像后再载入 和 导出容器后再导入 结果是一样的。
如果容器内项目有修改,并且不需要历史记录,选择
两个方法的区别:
- 镜像和容器 导出和导入的区别
1)容器(export 导出、import导入) 是将当前容器 变成一个新的镜像,导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag <LAYER ID> <IMAGE NAME>);
2)镜像(save保存、load加载) 是复制的过程,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree) - save 和 export区别
1)save 保存镜像所有的信息-包含历史
2)export 只导出当前的信息 - 镜像导出的 tar 文件比容器导出文件大。
使用场景的区别
- 容器内项目有修改
不需要历史记录的、想要体积小、又快速的,选择容器导出;反之选择镜像导出,镜像导出需先将容器commit成新的镜像,才能使用镜像导出。 - 容器内项目无修改
选择镜像导出。
- 若是只想备份images,使用save、load即可
- 若是在启动容器后,容器内容有变化,需要备份,则使用export、import。(或者将容器commit成新的镜像,在使用镜像导出)
一、存出和载入镜像
存出镜像
如果要导出镜像到本地文件,可以使用 docker save
命令。实际测试证明:镜像导出的名字不管是ubuntu_14.04.tar、还是ubuntu_14.04,即使文件后缀名不同或者没有,它们导出的体积大小也是固定的。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c4ff7513909d 5 weeks ago 225.4 MB
...
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
载入镜像
可以使用 docker load
从导出的本地文件中再导入到本地镜像库,例如
$ sudo docker load --input ubuntu_14.04.tar
或
$ sudo docker load < ubuntu_14.04.tar
这将导入镜像以及其相关的元数据信息(包括标签等)。
二、导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export
命令。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import
从容器快照文件中再导入为镜像,例如
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
此外,也可以通过指定 URL 或者某个目录来导入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
*注:用户既可以使用 docker load
来导入镜像存储文件到本地镜像库,也可以使用 docker import
来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
注意:
Docker执行错误报错--Error response from daemon: No command specified,意思是需要跟一条命令
docker run -p 80:80 -it test/ubuntu:v1.0 /bin/bash
参考:http://wiki.jikexueyuan.com/project/docker-technology-and-combat/image.html