Docker 最全的镜像和容器的导入导出

本文详细介绍了Docker的镜像和容器导出导入操作,包括docker save与docker load用于镜像的保存和加载,docker export与docker import用于容器的导出和导入。通过实例展示了不同命令的使用方法和区别,如docker save导出的tar文件包含完整分层文件系统,大小较大,而docker export导出的仅包含容器的文件系统,大小较小。此外,docker load只能导入由docker save导出的镜像,而docker import能导入由docker export导出的容器,但无法启动。

一、环境信息
  1. 本文的测试 Docker 版本信息如下

    [root@apps data]# docker info | grep 'Server Version'
    Server Version: 19.03.12
    
  2. 采用本文实验版本一定可以通过以下测试功能的复现

二、Docker Save & Docker Load
· docker save
  1. 语法定义

    [root@apps /]# docker save --help
    
    Usage:	docker save [OPTIONS] IMAGE [IMAGE...]
    
    Save one or more images to a tar archive (streamed to STDOUT by default)
    
    Options:
      -o, --output string   Write to a file, instead of STDOUT
    
  2. 命令解释

    docker save 是用来将一个或者多个 image 导出为 tar 文件的保存命令

  3. 实验演示

    # 将本地镜像库中的 redis 和 mongo 打包成一个 tar 文件  
    docker save -o redis-mongo-save.tar redis:6.0.9 mongo:4.0.21
    
    # 打包以后的 redis-mongo-save.tar 包含了 redis:6.0.9 和 mongo:4.0.21 两个镜像文件
    [root@apps data]# docker save -o redis-mongo-save.tar redis:6.0.9 mongo:4.0.21
    [root@apps data]# ll
    总用量 526044
    -rw-------. 1 root root 538665984 11月 13 17:41 redis-mongo-save.tar
    
  4. 虽然官网的命令行帮助说明要求指定 image 进行导出,但是实际上也可以对 container 进行打包导出

    # 将镜像运行成为容器,并将容器命名为 redis
    [root@apps data]# docker run -d --name redis redis:6.0.9
    b7842daf10c8baa007c1893617cfef23a7f8ce58d9c867fb22b476b4c30f0d5c
    
    # 查看容器运行状态
    [root@apps data]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b7842daf10c8        redis:6.0.9         "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        6379/tcp            redis
    
    # 将 redis 镜像导出为 tar 文件
    [root@apps data]# docker save -o redis-image-save.tar redis:6.0.9
    
    # 将 redis 容器导出为 tar 文件
    [root@apps data]# docker save -o redis-container-save.tar redis
    
    # 查看导出结果可以看出,导出目标为镜像的和导出目标为容器的大小都是一样大的
    [root@apps data]# ll
    总用量 736316
    -rw-------. 1 root root 107658752 11月 13 17:48 redis-container-save.tar
    -rw-------. 1 root root 107658752 11月 13 17:48 redis-image-save.tar
    -rw-------. 1 root root 538665984 11月 13 17:41 redis-mongo-save.tar
    [root@apps data]# 
    

    P.S

    通过上一步的操作可以说明, docker save 如果指定 container 来导出文件,最后导出的也是该容器背后的镜像文件

· docker load
  1. 语法定义

    [root@apps data]# docker load --help
    
    Usage:	docker load [OPTIONS]
    
    Load an image from a tar archive or STDIN
    
    Options:
      -i, --input string   Read from tar archive file, instead of STDIN
      -q, --quiet          Suppress the load output
    [root@apps data]#
    
  2. 命令解释

    docker load 是用来将指定镜像的 tar 文件导入到本地镜像库的导入命令

  3. 实验演示

    # 通过将上述 redis-mongo-save.tar 文件导入到本地镜像库
    [root@apps data]# docker load -i redis-mongo-save.tar 
    Loaded image: redis:6.0.9
    Loaded image: mongo:4.0.21
    
    # 如果本地镜像库中已经存在这两个镜像,则已存在的将会被覆盖
    

P.S

采用 docker save & docker load 的使用场景,如果你的应用程序是通过 docker-compose.yml 编排的多个镜像组合,但是你要部署的客户服务器并不能连接外网。这时,我们就可以使用 docker save 将用到的镜像打个整体的包,然后拷贝到客户服务器上使用 docker load 来将镜像载入到客户服务器的本地镜像库。

三、Docker Export & Docker Import
· docker export
  1. 语法定义

    [root@apps data]# docker export --help
    
    Usage:	docker export [OPTIONS] CONTAINER
    
    Export a container's filesystem as a tar archive
    
    Options:
      -o, --output string   Write to a file, instead of STDOUT
    
  2. 命令解释

    docker export 命令是用来将指定 container 导出为 tar 文件的保存命令

  3. 实验演示

    [root@apps data]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b7842daf10c8        redis:6.0.9         "docker-entrypoint.s…"   26 minutes ago      Up 26 minutes       6379/tcp            redis
    [root@apps data]# docker export -o redis-container-export.tar redis
    [root@apps data]# ll
    总用量 838036
    -rw-------. 1 root root 104160768 11月 13 18:14 redis-container-export.tar
    -rw-------. 1 root root 107658752 11月 13 18:12 redis-container-save.tar
    -rw-------. 1 root root 107658752 11月 13 18:11 redis-image-save.tar
    -rw-------. 1 root root 538665984 11月 13 18:11 redis-mongo-save.tar
    
  4. docker export 需要指定的是 container ,不能像 docker save 那样既可以指定 image 又可以指定 container

· docker import
  1. 语法定义

    [root@apps data]# docker import --help
    
    Usage:	docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
    
    Import the contents from a tarball to create a filesystem image
    
    Options:
      -c, --change list       Apply Dockerfile instruction to the created image
      -m, --message string    Set commit message for imported image
          --platform string   Set platform if server is multi-platform capable
    
  2. 命令解释

    docker import 命令是用来将指定 container 导入为 image 文件,并将 image 保存到本地镜像仓库

  3. 实验演示

    # 找到通过 docker export 导出的容器 tar 文件
    [root@apps data]# ll
    总用量 838036
    -rw-------. 1 root root 104160768 11月 13 18:14 redis-container-export.tar
    -rw-------. 1 root root 107658752 11月 13 18:12 redis-container-save.tar
    -rw-------. 1 root root 107658752 11月 13 18:11 redis-image-save.tar
    -rw-------. 1 root root 538665984 11月 13 18:11 redis-mongo-save.tar
    
    # 将通过 docker export 导出的容器 tar 文件导入为该容器的镜像并保存到本地镜像仓库
    [root@apps data]# docker import redis-container-export.tar redis:V1.0.0.0
    sha256:b4113a3c8317b7627e7b193cbef4f555b679d71739c56fa40026281e666b689d
    
    # 可以看到上一步导入的自定义版本的镜像仓库
    [root@apps data]# docker images
    REPOSITORY                                                 TAG                      IMAGE ID            CREATED             SIZE
    redis                                                      V1.0.0.0                 b4113a3c8317        8 seconds ago       101MB
    mongo                                                      4.0.21                   e46cbb62419f        15 hours ago        425MB
    redis                                                      6.0.9                    62f1d3402b78        2 weeks ago         104MB
    
  4. docker importcontainer 导入后成为一个 image,而不是恢复为一个 containerdocker import 在将容器导入为镜像时,可以指定镜像的版本号。 docker import 的应用场景,主要是用来制作自定义基础镜像。比如:你从 CentOS 7 镜像启动成为了一个容器,并进入容器安装了很多软件(javayumredis),使用 docker export 将容器导出为 tar 文件,然后将该 tar 文件通过 docker import 导入为一个镜像文件,并分发给其他人使用。

P.S

  • docker save 保存的目标对象是镜像也可以是容器
  • docker load 载入的目标对象是镜像 tar,并将镜像 tar 载入到本地镜像仓库(将镜像恢复为镜像)
  • docker export 保存的目标对象是容器
  • docker import 载入的目标对象是容器 tar,并将容器 tar 导入到本地镜像仓库(将容器恢复为镜像)
  • docker load 不能对载入的镜像重命名, docker import 可以为镜像指定新名称和版本号
四、步骤二和步骤三混打
  1. 能否将 docker export 导出的 tar 文件,再使用 docekr load 导入到镜像仓库???

    [root@apps data]# docker load -i redis-container-export.tar 
    open /opt/lib/docker/tmp/docker-import-544933863/bin/json: no such file or directory
    

    P.S

    采用 docker export 命令导出为 tar 文件的不能采用 docker load 来导出为镜像文件

  2. 能否将 docker save 导出的 tar 文件,再使用 docker import 导入到镜像仓库???

    # 通过 docker import 命令将通过 docker save 导出的镜像再导入到镜像仓库可以成功
    [root@apps data]# docker import c save-redis:V1.0.0.1
    sha256:06426c8ee4a0f2caf259fde5033fdba663308ce892a017077e156256bf73fed2
    [root@apps data]# docker images
    REPOSITORY                                                 TAG                      IMAGE ID            CREATED             SIZE
    save-redis                                                 V1.0.0.1                 06426c8ee4a0        7 seconds ago       108MB
    redis                                                      V1.0.0.0                 b4113a3c8317        2 days ago          101MB
    mongo                                                      4.0.21                   e46cbb62419f        3 days ago          425MB
    redis                                                      6.0.9                    62f1d3402b78        2 weeks ago         104MB
    
    # 尝试启动,则启动失败
    [root@apps data]# docker run save-redis:V1.0.0.1
    docker: Error response from daemon: No command specified.
    See 'docker run --help'.
    
五、分析和总结

分析

  1. 查看通过 docker savedocker export 导出的 tar 文件的内容区别

    在这里插入图片描述

  2. 从上面的对比可以看出 docker save 导出的 tar 文件其实是一个 docker 分层文件系统,docker export 导出的 tar 文件内容是一个 Linux 系统的文件目录

  3. Docker 镜像实际上就是由一层一层文件进行叠加起来的,上层的文件会覆盖下层的同名文件,如果将 redis-container-save.tar 中的各层文件合并到一起,基本上就是 redis-container-export.tar 的全部内容,由于 redis-container-save.tar 里面的各层文件会存在很多重复的文件,这也解释了为什么通过 docker save 命令导出的 tar 会比 docker export 命令导出的 tar 要大很多的原因

总结

  1. docker load 必须要载入的是一个分层系统,而 redis-container-export.tar 并不具备这样的结构,因此无法载入

  2. docker import 仅仅是将 tar 包里面的文件复制进来,所以不管 tar 包里面的文件结构是怎样的都可以载入进来,所以能够载入 redis-container-save.tar

  3. 但是 redis-container-save.tar 并不是一个有效的操作系统镜像,因此当我们试图以 docker import 命令导入的该镜像启动为容器时,容器并不能启动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值