docker save 输出的 tar 文件包含了镜像的所有层、配置和元数据,保留了镜像的所有构建信息和版本历史。 docker export 输出的是一个扁平化的文件系统,仅包含容器的当前状态,而不包含任何构建或层信息。
一般export的结果大小更小,适合拿来发布应用。如果有对容器内容有持续修改和开发的需求,最好还是用docker commit + docker save,这样可以像git一样回滚。
实际测试
先在某个容器里做一些修改,在根目录写入一个文本文件:
1
2
3
4
5
6
root@minedl:~# docker run -it ubuntu:latest
root@ba2179ff43aa:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@ba2179ff43aa:/# echo1111 >> 1.txt
root@ba2179ff43aa:/# cat 1.txt
1111
使用docker export导出容器的镜像:
1
2
3
root@minedl:~# docker export ba2179ff43aa > me.tar
root@minedl:~# ls
me.tar snap
使用docker import导入镜像,可以看到导入了名称为me的镜像:
1
2
3
4
5
6
root@minedl:~# docker import - me < me.tar
sha256:8f5e159f2e21451ff2341526572bc3c67e9240454df0341a2ce447586b9e29a1
root@minedl:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
me latest 8f5e159f2e21 4 seconds ago 77.8MB
mydoc latest 40dd787fd6e9 9 minutes ago 77.8MB
使用导入的me镜像创建容器,查看之前在另一个容器做的修改是否保留:
1
2
3
4
5
root@minedl:~# docker run -it me /bin/bash
root@3f21d7037f50:/# ls
1.txt bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@3f21d7037f50:/# cat 1.txt
1111