导入 / 导出镜像

导出 / 导入「镜像」本身

也就是把 docker images 里看到的那个镜像搬来搬去

导出镜像:docker save

# 导出为 tar 文件 docker save -o myapp.tar my-registry.com/ns/myapp:latest # 也可以导出多个 tag 到一个文件 docker save -o myapp-all.tar myapp:1.0 myapp:1.1 myapp:latest
  • -o myapp.tar:输出到文件

  • 后面的一个或多个名字:镜像名(可以带 registry / namespace / tag)

导入镜像:docker load

拿到 myapp.tar 之后,在另一台机器上:

docker load -i myapp.tar # 或 docker load < myapp.tar

导入后:

docker images | grep myapp

可以看到跟原来一样的镜像名 / tag。

适用场景:

  • 没有/不想用镜像仓库

  • 线下环境拷镜像

  • 备份镜像(不包含容器运行时数据)

gzip 压缩

save/load 文件可能很大:可以配合压缩:

docker save myapp:latest | gzip > myapp.tar.gz gunzip -c myapp.tar.gz | docker load


或者用 tar(麻烦些)

# 1. 先把 docker save 的 tar 写成文件 docker save -o myapp.tar myapp:latest # 2. 再用 tar -z 压缩这个文件 tar -zcf myapp.tar.gz myapp.tar # 1. 先解压出原始 tar tar -zxf myapp.tar.gz # 2. 再让 docker load 读这个 tar docker load -i myapp.tar

更换镜像名 / tag

docker load 之后会保留原始的名字和 tag

导入后想改名:

docker tag old-name:old-tag new-name:new-tag docker rmi old-name:old-tag # 如果不再需要

导出 / 导入「容器文件系统」

这是另外一套:导出的是某个容器当前的文件系统状态,而不是镜像的多层结构。

导出容器:docker export

先有一个容器,比如:

docker run --name myapp-run -d myapp:latest # 容器里可能做了一些更改,比如写了文件、apt install 等

导出它:

docker export -o myapp-rootfs.tar myapp-run # 或 docker export myapp-run > myapp-rootfs.tar

这里 myapp-run 是容器名或容器 ID。

导入为镜像:docker import

docker import myapp-rootfs.tar myapp-from-container:latest # 或 cat myapp-rootfs.tar | docker import - myapp-from-container:latest

这个得到的是一个新的镜像,但:

  • 没有原来的镜像层信息(都被扁平化成一个层)

  • Dockerfile 中的历史(ENV、CMD、ENTRYPOINT 等)基本丢了,只保留 export 出来的文件系统。

  • 适合用来做「简化后的基础镜像」。

适用场景:

  • 你在容器里面改了一堆东西,想把“当前状态”打包成新镜像

  • 做极简 rootfs 镜像(比如只要 /usr /bin /lib…)

export/import 没有元数据

导入后的镜像通常没有 CMD/ENTRYPOINT,启动时要手动指定:

docker run --rm -it myapp-from-container /bin/bash