某台服务器无法连接外网(国外网站),无法直接通过 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 保存的是镜像(image),docker export 保存的是容器(container);docker save 保存的文件导入后会保留层(layer),docker export 保存的文件导入后没有层关系,即仅保存容器当时的快照状态;docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;类比电脑,可以简单理解 save 就是相当于保存的是装机光盘 iso,export 保存的是当前系统文件备份。
docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。