导出 / 导入「镜像」本身
也就是把 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