菜单
Docker镜像的导出与导入

起因

某台服务器无法连接外网(国外网站),无法直接通过 docker-compose.yml 文件来镜像编排编译。所以使用其他服务器的镜像来直接使用。

操作

1、导出已有镜像

# 查看已有镜像
docker images
# 保存对应的镜像包
docker save <image-id> -o name.tar 

操作如下所示,可一次性保存多个镜像到一个文件

# 查看已有镜像
PS E:\dnmp\images-backup> docker images
REPOSITORY   TAG          IMAGE ID       CREATED        SIZE
dnmp-php74   latest       af78b7175d2a   5 hours ago    174MB
dnmp-php82   latest       deac47a7671e   5 hours ago    779MB
dnmp-nginx   latest       6104708b2f7e   18 hours ago   72.2MB
redis        7.2-alpine   1a34bdba051e   2 weeks ago    59.8MB
mysql        8.0.34       59ae56ac42c6   2 years ago    783MB

# 保存对应的镜像包 
docker save -o dnmp-all-images.tar dnmp-php74:latest dnmp-php82:latest dnmp-nginx:latest redis:7.2-alpine mysql:8.0.34

2、在目标鸡导入

将导出的 tar 包上传到目标机器执行导入

# 载入镜像包
docker load -i name.tar 

操作如下:

# 导入
PS E:\dnmp\images-backup> docker load -i .\dnmp-all-images.tar
Loaded image: dnmp-php74:latest
Loaded image: dnmp-php82:latest
Loaded image: dnmp-nginx:latest
Loaded image: redis:7.2-alpine
Loaded image: mysql:8.0.34

# 再次查看
PS E:\dnmp\images-backup> docker images
REPOSITORY   TAG          IMAGE ID       CREATED        SIZE
dnmp-php74   latest       af78b7175d2a   5 hours ago    174MB
dnmp-php82   latest       deac47a7671e   5 hours ago    779MB
dnmp-nginx   latest       6104708b2f7e   18 hours ago   72.2MB
redis        7.2-alpine   1a34bdba051e   2 weeks ago    59.8MB
mysql        8.0.34       59ae56ac42c6   2 years ago    783MB

3、启动新导入的容器

因为是使用容器编排,所以在不导致其他容器服务中断的情况下将 docker-compose.yml 中对应的 services 开启,使用 up 命令更新即可。

docker compose up -d

注:使用 docker compose down 先停止然后再启动也是一样的,但会导致其他容器服务中断。

扩展知识

docker save 与 docker export 命令的区别 ?

  1. docker save 保存的是镜像(image),docker export 保存的是容器(container);
  2. docker save 保存的文件导入后会保留层(layer),docker export 保存的文件导入后没有层关系,即仅保存容器当时的快照状态;
  3. docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;

类比电脑,可以简单理解 save 就是相当于保存的是装机光盘 iso,export 保存的是当前系统文件备份。

应用场景不同

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

参考来源:\ https://www.hangge.com/blog/cache/detail_2411.html\ https://www.cnblogs.com/williamwucoder/p/13682347.html