Docker镜像与容器的导入和导出
Docker镜像与容器的导入和导出
ZhangCurryDocker镜像与容器的导入和导出
镜像和容器的导入、导出操作主要涉及到下面的几个命令:save、load、export、import
镜像导入是一个复制的过程,容器导入是将当前容器变成一个新的镜像。
docker save命令保存的是镜像(image),docker export命令保存的是容器(container)。
export命令导出的tar文件略小于save命令导出的。
因为export导出的是容器,export导出的文件在import导入时,无法保留镜像所有的历史(即每一层layer信息),不能进行回滚操作。而save是根据镜像来的,所以导入时可以完整保留下每一层layer信息。
docker load不能对导入的镜像重命名,而docker import导入可以为镜像指定新名称
- 若是只想备份image,使用save和load。
- 若是在启动容器后,容器内容有变化,需要备份,则使用export和import。
容器和镜像是两个不一样的东西,所以他们的导出和导入有所区别。
| 容器(container) | 镜像(image) | |
|---|---|---|
| 导入 | docker import | docker save |
| 导出 | docker export | docker load |
示例
需求1:将本地运行的容器,导出成 tar,tar 上传到服务器,服务器 docker 导入,并运行,相关操作如下:
1 | docker export vlmcsd_vlmcsd_1 -o vlmcsd_vlmcsd_1.tar |
需求2:将本地镜像,导出成 tar,tar 上传到服务器,服务器 docker 导入,并运行,相关操作如下:
1 | docker save 3b9acedb6a46 -o vlmcsd.tar |
容器导出
docker export <CONTAINER ID>/<NAMES> -o <STDOUT>$ docker export --help1
2
3
4
- CONTAINER ID/NAMES 容器的名字或者 ID
- STDOUT 要导出的路径及文件名
Usage: docker export [OPTIONS] CONTAINER
Export a container’s filesystem as a tar archive
Options:
-o, –output string Write to a file, instead of STDOUT
1 |
|
- FILE 要导入的文件
导入完成后,使用 docker images 查看所有镜像,会发现刚刚导入的 REPOSITORY 和 TAG 为 <none>。
这时候可以使用 docker tag 命令进行重命名 / 打标签。
也可以一步到位,在导入的时候就指定
REPOSITORY和TAG。
1 | $ docker import --help |
镜像导出
docker save <CONTAINER ID>/<NAMES> -o <STDOUT>$ docker save --help1
2
3
4
- CONTAINER ID/NAMES 镜像的名字或者 ID
- STDOUT 要导出的路径及文件名
Usage: docker save [OPTIONS] IMAGE [IMAGE…]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
-o, –output string Write to a file, instead of STDOUT
1 |
|
- FILE 要导入的路径及文件名
1 | $ docker load --help |
打标签
docker tag <source IMAGE ID> <target image name>:<tag>$ docker tag --help1
2
3
4
- source image id 为 `<none>` 的镜像 id
- `target image name:tag` 新命名的镜像名称及标签
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
1 |
|
- [OPTIONS]: 可选参数,例如
-o,用于指定输出的文件名。 - IMAGE [IMAGE…]: 指定要保存的一个或多个镜像的名称或ID。
使用场景
- 镜像的备份与归档。
- 将镜像从一个环境迁移到另一个环境,例如从开发环境到测试环境。
示例代码
将名为myimage:latest的Docker镜像保存到名为myimage_latest.tar的文件中:
1 | docker save -o myimage_latest.tar myimage:latest |
docker export命令
与docker save不同,docker export命令是用于将一个运行中的容器的文件系统导出为tar归档文件。这个命令适用于需要导出容器内容,而不是镜像的场景。
命令语法
1 | docker export [OPTIONS] CONTAINER |
- [OPTIONS]: 可选参数,例如
-o,用于指定输出的文件名。 - CONTAINER: 指定要导出的容器的ID或名称。
使用场景
- 容器的文件系统备份。
- 从运行中的容器创建镜像。
示例代码
将名为mycontainer的容器导出到名为mycontainer.tar的文件中:
1 | docker export -o mycontainer.tar mycontainer |
docker save与docker export的差异
尽管docker save和docker export都可以用于备份Docker镜像和容器的内容,但它们之间有几个关键区别: - 内容: docker save导出的是镜像的所有层和元数据,而docker export仅导出容器的当前文件系统状态。 - 用途: docker save适合镜像的迁移和备份,docker export适合容器文件系统的备份。 - 结果: 通过docker save导出的tar文件可以使用docker load命令重新导入为Docker镜像;通过docker export导出的tar文件可以使用docker import命令创建新的Docker镜像,但不包含原始镜像的层信息或历史。
理解这些差异有助于您根据具体的需求选择正确的工具,无论是进行镜像的备份、迁移,还是容器文件系统的导出。
接下来,我们将探讨如何使用docker load和docker import命令来导入这些导出的tar文件,以及这两个命令之间的区别。
Docker镜像导入方法
在成功导出Docker镜像或容器后,下一步是将这些导出的文件导入到另一个Docker环境中。Docker提供了两种命令来实现这一功能:docker load和docker import。这两个命令在功能上相似,但各自适用于不同的场景和需求。
docker load命令
docker load命令用于将通过docker save命令导出的tar归档文件导入为Docker镜像。这一命令确保了镜像的所有层和元数据都被完整地恢复,适合于镜像的迁移和恢复。
命令语法
1 | docker load [OPTIONS] |
- [OPTIONS]: 可选参数,例如
-i,用于指定输入的tar归档文件。
使用场景
- 从tar归档文件中恢复Docker镜像。
- 将镜像迁移至另一个Docker环境。
示例代码
从名为myimage_latest.tar的文件中加载镜像:
1 | docker load -i myimage_latest.tar |
docker import命令
docker import命令用于创建一个新的Docker镜像,从通过docker export命令或任意tar归档文件导出的容器文件系统中。与docker load不同,docker import不恢复镜像的层和元数据,而是创建一个新的镜像层。
命令语法
1 | docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] |
- file|URL|-: 指定tar归档文件的路径,可以是本地文件路径、URL或者直接从标准输入中读取。
- [REPOSITORY[:TAG]]: 可选参数,用于指定新创建镜像的仓库和标签。
使用场景
- 从容器的文件系统创建新的Docker镜像。
- 从备份或其他tar归档文件中恢复容器数据。
示例代码
从名为mycontainer.tar的文件创建一个新的镜像,并指定标签:
1 | docker import mycontainer.tar mynewimage:latest |
docker load与docker import的差异
docker load和docker import在导入Docker镜像时扮演了不同的角色,主要区别如下: - 源文件: docker load用于导入通过docker save创建的tar文件,而docker import用于导入通过docker export或其他方式创建的容器文件系统的tar文件。 - 结果: docker load恢复一个完整的镜像,包括所有层和元数据;docker import创建一个新的镜像,仅包含单个层。 - 使用场景: docker load适合于镜像的完整迁移和备份恢复;docker import适合于基于容器文件系统创建新镜像或从备份中恢复数据。
理解这些差异有助于您根据具体的需求和场景,选择最合适的命令来导入Docker镜像。
接下来,我们将深入探讨如何处理Docker容器的导出与导入,这包括容器数据卷的备份与恢复,以及使用docker export与docker import命令处理容器数据的高级技巧。这将为您提供更全面的操作指南,帮助您高效管理Docker环境中的资源。
Docker容器的导出与导入
在日常开发和运维中,除了镜像的导入导出,处理Docker容器的导出与导入也是一项重要的技能。这不仅涉及到容器文件系统的备份与恢复,还包括如何高效地管理容器数据卷,确保数据的持久化和一致性。接下来,我们将探讨容器数据的导出导入方法,以及如何利用这些方法在不同环境之间迁移容器数据。
容器导出为镜像
在某些情况下,您可能需要将正在运行的容器及其当前状态导出为一个新的镜像,以便在其他地方重现相同的环境。这可以通过结合使用docker commit和docker save命令来实现。
docker commit命令
首先,使用docker commit命令将容器的当前状态保存为一个新的镜像。
1 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
- CONTAINER: 要导出的容器ID或名称。
- [REPOSITORY[:TAG]]: 新创建镜像的仓库和标签。
示例
将名为mycontainer的容器保存为一个新的镜像mycontainerimage:latest:
1 | docker commit mycontainer mycontainerimage:latest |
接下来,您可以使用docker save命令将这个新创建的镜像导出为tar文件,如前文所述。
容器数据卷的备份与恢复
对于使用数据卷的容器,备份和恢复数据卷内容是维护数据持久性的关键步骤。Docker没有直接的命令来备份或恢复数据卷,但您可以通过在运行的容器内部或者使用Docker卷挂载的主机路径来手动备份数据卷。
数据卷备份
使用docker cp命令或直接在宿主机上压缩数据卷目录来备份数据。
数据卷恢复
将备份文件解压到新容器的数据卷路径或挂载的宿主机路径上。
使用docker export与docker import处理容器数据
虽然docker export和docker import主要用于容器的文件系统,但通过先将容器导出为镜像,再进行导出导入操作,也可以间接实现容器数据的迁移。
容器导出
首先,使用docker commit将容器保存为镜像,然后使用docker save导出为tar文件。
容器导入
使用docker load将tar文件导入为镜像,然后基于这个镜像启动新容器,实现数据的迁移。
小结
处理Docker容器的导出与导入,不仅仅是关于文件的传输,更涉及到对容器状态和数据持久性的管理。



