【容器使用】如何使用 docker 和 tar 命令来操作容器镜像
好的,我们来详细讲解一下如何使用 docker
和 tar
命令来操作容器镜像。
这主要涉及两个核心操作:
- 将容器保存/导出为
tar
文件(用于备份、迁移或离线分享)。 - 从
tar
文件加载/导入镜像(用于恢复或部署)。
1. 将容器/镜像打包成 tar 文件
有两种主要命令可以实现这个目的:docker export
和 docker save
。它们有重要区别:
特性 | docker save | docker export |
---|---|---|
操作对象 | 镜像 (Image) | 容器 (Container) |
输出内容 | 保存镜像的所有层、标签、历史记录 | 只导出容器当前文件系统的快照 |
是否包含元数据 | 是 (如标签、历史命令、层结构) | 否 |
典型用途 | 备份镜像,以便在其他地方恢复 | 部署一个纯净的应用,不包含构建历史 |
1.1 使用 docker save
将镜像打包成 tar
这是最常用的方法,用于备份或迁移镜像。
基本语法:
docker save -o <输出的tar文件名>.tar <镜像名>:<标签>
操作示例:
-
查看本地镜像,确认你要打包的镜像名称和标签。
docker images # 输出示例: # REPOSITORY TAG IMAGE ID CREATED SIZE # nginx latest 2b7d6430f78d 2 weeks ago 142MB # ubuntu 20.04 6b7dfa7e8fdb 4 weeks ago 77.8MB
-
将
nginx:latest
镜像保存为nginx_backup.tar
文件。docker save -o nginx_backup.tar nginx:latest
-o
或--output
:指定输出文件的路径和名称。
-
你也可以将多个镜像打包到一个 tar 文件中。
docker save -o my_images.tar nginx:latest ubuntu:20.04
-
使用 gzip 压缩以减小文件体积(推荐)。
docker save nginx:latest | gzip > nginx_backup.tar.gz
1.2 使用 docker export
将容器打包成 tar
这个方法用于导出某个容器的文件系统状态。
基本语法:
docker export -o <输出的tar文件名>.tar <容器名或容器ID>
操作示例:
-
查看正在运行的容器,找到你要导出的容器 ID 或名称。
docker ps # 如果容器已停止,可以查看所有容器 docker ps -a
-
假设有一个容器 ID 为
a1b2c3d4
,将其导出为my_container.tar
。docker export -o my_container.tar a1b2c3d4
2. 从 tar 文件加载/导入镜像
同样,根据你使用的打包方法,也有两种对应的加载命令。
2.1 使用 docker load
导入由 save
创建的 tar 文件
这是恢复镜像的标准方法。
基本语法:
docker load -i <镜像tar文件>
操作示例:
- 从
nginx_backup.tar
文件加载镜像。docker load -i nginx_backup.tar
-i
或--input
:指定要加载的 tar 文件。
-
如果文件是
.tar.gz
格式,也可以直接加载。docker load -i nginx_backup.tar.gz
-
查看加载的镜像,确认是否成功。
docker images
加载的镜像会保留其原来的名称和标签。
2.2 使用 docker import
导入由 export
创建的 tar 文件
这个方法会将一个文件系统快照导入为一个新的镜像。
基本语法:
docker import <容器tar文件> [新镜像名]:[新标签]
操作示例:
-
从
my_container.tar
文件创建一个新的镜像,并命名为my_imported_image:v1
。docker import my_container.tar my_imported_image:v1
-
查看新创建的镜像。
docker images
-
运行这个新镜像来启动一个容器。
docker run -it my_imported_image:v1 /bin/bash
注意:由
export/import
创建的镜像不包含任何原始命令历史或元数据,你可能需要在docker run
时指定要运行的命令(如/bin/bash
)。
操作流程总结
场景一:备份和恢复一个镜像(最常用)
- 备份:
docker save -o my_app.tar my_app:prod
- 将
my_app.tar
文件拷贝到另一台机器。 - 恢复:
docker load -i my_app.tar
- 运行:
docker run -d my_app:prod
场景二:将一个容器的当前状态固化为新镜像
- 对容器进行了一些修改(例如安装了软件)。
- 导出:
docker export -o container_snapshot.tar my_container
- 导入为镜像:
docker import container_snapshot.tar my_new_image:latest
- 基于新镜像运行:
docker run -it my_new_image:latest /bin/bash
重要提示
- 权限: 操作
docker
命令通常需要sudo
权限或加入docker
用户组。 - 空间: 确保磁盘有足够空间存放
tar
文件,尤其是镜像较大时。 - 命令区分: 牢记
save/load
针对的是镜像,而export/import
针对的是容器。混淆它们会导致操作失败或丢失元数据。 - 压缩: 使用
gzip
压缩(生成.tar.gz
)可以显著减少文件大小,节省传输时间和存储空间。docker load
可以直接读取压缩文件。