无需Docker Registry传输Docker镜像

我在 Alpine Linux软件开发环境构建 采用Docker运行容器,在部署了合适的运行环境之后,想要把镜像保存下来,用到其他环境中使用。通常我们分发Docker镜像都会使用 Kubernetes部署registry仓库 。但是,对于个人偶尔使用的私有镜像,也许并不想这么折腾(不论是推送到公共镜像服务器还是自建镜像服务器)。此时,可以使用Docker内置的镜像输出和加载功能。

  • 首先对运行的容器进行镜像保存:

docker commit 对运行的容器进行镜像保存
docker commit acloud-dev local:acloud-dev
  • 然后将Docker镜像保存为一个tar文件:

docker save 将镜像保存为tar文件
docker save -o ~/acloud-dev.tar local:acloud-dev
  • 将输出的镜像文件scp到目标主机上

  • 在目标主机上执行以下命令加载自己制作的镜像:

在目标主机上执行 docker load 将镜像tar文件加载到docker系统中作为镜像
docker load -i ~/acloud-dev.tar
  • 然后就可以直接使用这个镜像用于后续工作了,例如运行容器:

运行 acloud-dev 容器
docker run -dt --name acloud-dev --hostname acloud-dev \
    -p 1122:22 \
    -p 13000:3000 \
    -p 18080:8080 \
    -p 14000:4000 \
    -p 1180:80 \
    -p 1443:443 \
    -v /home/admin/secrets:/home/admin/.ssh \
    -v /home/admin/docs:/home/admin/docs \
    acloud-dev

# 如果需要在运行时注入环境变量,则添加类似如下参数(添加代理案例)
#    -e HTTP_PROXY=http://172.17.0.1:3128 \
#    -e HTTPS_PROXY=http://172.17.0.1:3128 \
#    -e NO_PROXY=localhost,127.0.0.1,*.baidu.com,192.168.0.0/16,10.0.0.0/8 \

备注

已验证: dockersaveloadnerdctl加载镜像到Kubernetes 完全兼容,可以相互转换

参考