应用场景

本来我们在客户放内网,使用docker build 构建镜像,其中Dockerfile中有一些从external 网络拉取的资源,但是有一天。。。客户不给我们外网权限了。。直接导致我们没办法构建镜像了。。所以我们只能从本地构建好镜像,然后将镜像导出,再上传到客户公司内,再load到服务器中。。

涉及的命令

涉及的命令有export、import、save、load

第一种组合方式

save

命令

  1. docker save [options] images [images...]

image.png

示例

  1. docker save -o nginx.tar nginx:latest

  1. docker save > nginx.tar nginx:latest

其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)

load

命令

  1. docker load [options]

image.png

示例

  1. docker load -i nginx.tar

docker load < nginx.tar

其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息

第二种组合方式

export

命令

docker export [options] container

image.png

示例

docker export -o nginx-test.tar nginx-test

其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)

import

命令

docker import [options] file|URL|- [REPOSITORY[:TAG]]

image.png

示例

docker import nginx-test.tar nginx:imp

cat nginx-test.tar | docker import - nginx:imp

区别

特别注意:两种方法不可混用。
如果使用 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 载入。