Docker导出与迁移

本文主要介绍docker迁移与备份的操作方式,以及docker save和docker export的区别。

docker save

docker save 将docker image 将docker container的所有层保存到一个tar文件中,命令如下:

1
2
docker save IMAGE -o 114.tar
docker save IMAGE > 114.tar # 采用重定向的方式也能保存

docker save 对应的读取命令为docker load

docker export

docker export将docker container的当前状态(无论容器是在运行或是停止)保存到一个tar文件中,且保存的是一个扁平的层,命令如下:

1
2
docker export CONTAINER -o 114.tar
docker export CONTAINER > 114.tar # 采用重定向的方式也能保存
`docker export` 对应的命令就是docker imort`。

docker save和docker export的不同

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:/# echo 1111 >> 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

看到这已经不是之前那个容器,但是修改是保留了的。

针对单个容器可以使用这种方式快速导入导出,但如果是docker compose创建的容器群,就需要使用load和save了,load和import这两组命令除了使用场景不同,最关键的是export没有保存容器历史版本,可以看作一个时间点的快照。更详细的内容可以参考这篇文章

除了使用文件转移容器,还可以使用docker hub与docker file等方式。

Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%