Docker export/import 和 docker save/load 都是用于容器和镜像的备份和迁移,但它们有一些关键的区别:
-
docker export/import:
- export 作用于容器,import 创建镜像
- 导出的是容器的文件系统,不包含镜像的元数据
- 丢失了镜像的层级结构
- 通常用于创建轻量级的镜像
使用方法:
docker export my_container > container.tar cat container.tar | docker import - new_image:tag
-
docker save/load:
- 作用于镜像
- 保留完整的镜像信息,包括所有层、标签、元数据等
- 保留镜像的层级结构
- 文件通常比 export 大,因为包含了所有的历史信息
使用方法:
docker save my_image:tag > image.tar docker load < image.tar
主要区别:
-
操作对象:
- export/import 操作容器
- save/load 操作镜像
-
保留的信息:
- export/import 只保留文件系统
- save/load 保留完整的镜像信息和历史
-
文件大小:
- export 通常产生较小的文件
- save 产生较大的文件,因为包含了更多信息
-
用途:
- export/import 适合创建小型基础镜像或简化已有镜像
- save/load 适合完整备份和迁移镜像
-
层级结构:
- export/import 会丢失层级结构
- save/load 保留完整的层级结构
-
元数据:
- export/import 不保留元数据(如环境变量、工作目录等)
- save/load 保留所有元数据
选择使用哪种方法取决于你的具体需求。如果你需要完整备份镜像或在系统间迁移,使用 save/load 更合适。如果你想创建一个精简的镜像或只关心文件系统内容,export/import 可能更合适。
那么,export/import 会保留容器里的数据吗
是的,docker export/import 确实保留容器里的数据。让我详细解释一下:
-
数据保留:
- docker export 会导出容器的整个文件系统,包括容器运行时产生或修改的所有数据。
- 这包括容器启动后添加、修改或删除的所有文件。
-
什么被保留:
- 容器内的所有文件和目录
- 运行时生成的数据
- 用户在容器内创建或修改的文件
-
什么不被保留:
- 容器的元数据(如环境变量、工作目录、端口映射等)
- 容器的历史记录
- 容器的卷(volumes)中的数据(除非卷被挂载到容器的文件系统内)
-
使用场景:
- 当你想要捕获容器在某个特定时刻的状态,包括所有运行时更改。
- 创建一个包含特定数据或配置的新镜像。
-
注意事项:
- 虽然数据被保留,但容器的运行状态(如正在运行的进程)不会被保存。
- 导入后创建的新镜像会失去原始镜像的层结构,可能导致镜像大小增加。
示例:
# 导出正在运行的容器,包括其中的所有数据
docker export my_running_container > container_with_data.tar
# 从导出的文件创建新镜像
cat container_with_data.tar | docker import - new_image:tag
# 使用新镜像启动容器
docker run -it new_image:tag /bin/bash
在新容器中,你会发现原容器中的所有文件和数据都被保留下来了。
总之,docker export/import 是保留容器数据的有效方法,特别是当你需要捕获容器在特定时刻的完整状态时。但要记住,这种方法不保留容器的配置信息和镜像的层结构。