导出镜像
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。
导出镜像的命令为
# images [images...] 可以有多个 images 镜像 docker save [options] images [images...]
查看 save 的介绍
[root@dce-10-6-215-215 ~]# 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 # 写入一个文件,而不是STDOUT
例如我有两个镜像,一个 nginx,一个 busybox
使用下面命令导出
# -o /opt/images.tar.gz 表示将镜像导出到 /opt/images.tar.gz # nginx:latest busybox:1.35.0 表示将这两个镜像都导出在 images.tar.gz 里 docker save -o /opt/images.tar.gz nginx:latest busybox:1.35.0 # > -o /opt/images_new.tar.gz 表示将镜像导出到 /opt/images_new.tar.gz docker save > /opt/images_new.tar.gz nginx:latest busybox:1.35.0
导出后查看
导入镜像
上面我们已经导出了镜像,然后就可以导入镜像了,导入镜像使用 docker load [options]
[root@dce88 ~]# 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 # 静默输出
先将本地的 nginx 和 busybox 镜像删除
docker rmi nginx:latest busybox:1.35.0
在导入
# 使用 -i 导入 [root@dce88 ~]# docker load -i /opt/images.tar.gz 08249ce7456a: Loading layer 83.9MB/83.9MB d5b40e80384b: Loading layer 62.01MB/62.01MB b2f82de68e0d: Loading layer 3.072kB/3.072kB 41451f050aa8: Loading layer 4.096kB/4.096kB 44193d3f4ea2: Loading layer 3.584kB/3.584kB e7344f8a29a3: Loading layer 7.168kB/7.168kB Loaded image: nginx:latest cf4ac4fc0144: Loading layer 1.463MB/1.463MB Loaded image: busybox:1.35.0 # 使用 < 导入 [root@dce88 ~]# docker load < /opt/images.tar.gz 08249ce7456a: Loading layer 83.9MB/83.9MB d5b40e80384b: Loading layer 62.01MB/62.01MB b2f82de68e0d: Loading layer 3.072kB/3.072kB 41451f050aa8: Loading layer 4.096kB/4.096kB 44193d3f4ea2: Loading layer 3.584kB/3.584kB e7344f8a29a3: Loading layer 7.168kB/7.168kB Loaded image: nginx:latest cf4ac4fc0144: Loading layer 1.463MB/1.463MB Loaded image: busybox:1.35.0
使用 export 和 import
这两个命令是通过容器来导入、导出镜像。首先我们使用 docker ps -a 命令查看本机所有的容器。
[root@dce88 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b6f479620115 nginx:latest "/docker-entrypoint.…" 11 hours ago Up 11 hours 80/tcp strange_lichterman d15271086cb7 nginx "/docker-entrypoint.…" 11 hours ago Exited (0) 11 hours ago focused_einstein f277875aed02 gitlab/gitlab-ce:14.8.2-ce.0 "/assets/wrapper" 2 days ago Up 2 days (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp gitlab-dev
export 导出容器
使用 docker export 命令根据容器 ID 将镜像导出成一个文件
语法
# export 导出的是容器,不是镜像。save 导出的是镜像,不是容器 docker export [options] container
启动 nginx 镜像在导出
# 如果没有启动的容器,则需要启动容器 docker run -it -d nginx:latest # 使用 export 导出容器,使用的是容器 id docker export -o nginx-test.tar b6f479620115
import 导入容器
使用 docker import 命令则可将这个镜像文件导入进来
命令
docker import [options] file|URL|- [REPOSITORY[:TAG]]
上面我们已经使用 export 导出了一个 nginx-test.tar 的文件,接下来我们使用 import 导入
# 先删除 nginx 镜像 docker rmi nginx:latest
在导入镜像
# 导入镜像,mynginx:v1.21 是我们自己定义的镜像名称 docker import nginx-test.tar mynginx:v1.21
区别
export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
- 文件大小不同:export 导出的镜像文件体积小于 save 保存的镜像
- 是否可以对镜像重命名
- docker import 可以为镜像指定新名称
- docker load 不能对载入的镜像重命名
- 是否可以同时将多个镜像打包到一个文件中
- docker export 不支持
- docker save 支持
- 是否包含镜像历史
- export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作
- 而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)
- 应用场景不同
- docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
- docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。