docker保存和加载镜像

前言

最近我需要将一台电脑的docker镜像直接搬到另一台上,因为另一台服务器没有接入互联网,所以无法直接下载,经过查看,docker有两种导出镜像的方式,分别说一下

export和import

首先查看所有的容器

1
docker ps -a

导出镜像,使用如下命令

1
2
3
docker export ds2abda > a.tar

# 注意 ds2abda 是上面命令列出来的容器ID,不是镜像ID,不要搞错

命名执行完成后,会在宿主机当前目录下看到有一个a.tar的文件

然后我们把tar拷贝到另一台机器上,使用如下命名执行导入

1
2
3
docker import - new_a_server < a.tar

# 注意-后面的是要生成的镜像名称,再一个需要注意的是 < 箭头的方向,上面和这个是不一样的

导入后,使用如下命令查看是否导入成功

1
2
docker images
# 查看所有镜像
save和load

首先使用以下命令查看本机的镜像,和export不通过,export是查看容器

1
docker images

保存镜像

1
2
docker save abcde > a.tar
# 注意,这里的 abcde 是上面命令列出来的镜像ID,然后保存为a.tar文件

导入镜像

1
docker load < a.tar
两种方式对比

特别注意:两种方法不可混用
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似”docker: Error response from daemon: Container command not found or does not exist“的错误。

1,文件大小不同

export 导出的镜像文件体积小于 save 保存的镜像

2,是否可以对镜像重命名
  • docker import 可以为镜像指定新名称
  • docker load 不能对载入的镜像重命名
3,是否可以同时将多个镜像打包到一个文件中
  • docker export 不支持
  • docker save 支持
4,是否包含镜像历史
  • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。

  • save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

5,应用场景不同
  • docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
  • docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。
重名名镜像
1
2
3
4
docker tag [镜像id] [新镜像名称]:[新镜像标签] 

#例如
docker tag 93109ce1d590 test-py:3.7.13