容器镜像的导入导出
第1关:导入导出容器
任务描述
本关任务是学习导入导出容器,要求学习者参照示例完成将busyboxContainer
容器的文件系统保存为一个tar
包,通过该tar
包导入一个busybox:v1.0
镜像。
相关知识
将 "容器的文件系统"保存到 tar 包
docker export
是将“容器的文件系统”导出为一个tar
包。注意是操作的对象是容器!它的具体语法如下:
docker export [OPTIONS] CONTAINER
其中:
docker export
:Docker
将容器导出到tar
包的命令关键词;
OPTIIONS
: 命令选项,-o
指定写到一个文件中,而不是标准输出流中;
Container
: 需要导出到tar
包的容器。
例如,将容器container1
的“文件系统”保存到tar
包,对应的语句如下:
docker export container1 > container1.tar 或者 docker export container1 -o container1.tar
从tar包导入一个镜像
docker import
使用docker export
导出的tar包加载为一个镜像。它的具体语法如下:
docker import [OPTIONS] 文件|URL|- [镜像名]
其中:
docker import
:Docker
从tar
包加载镜像的命令关键词;
OPTIIONS
: 命令选项;
文件|URL|
: 指定docker import
的对象,可以是文件或者某个URL
;
[镜像名]
: 以<仓库名>:<标签>
的方式来指定。
例如,从container1.tar
中加载镜像,镜像名为test:v1.0
,对应的语句如下:
docker cat container1.tar | docker import - test:v1.0
实例
在本机以ubuntu
镜像为基础创建了一个容器,并在容器的/dir1
目录下创建了1.txt
和2.txt
两个文件,然后将改容器导出为tar
文件。
[root@localhost step2]# docker run -it ubuntu /bin/bash root@a2864c3ed14f:/# touch /dir1/1.txt root@a2864c3ed14f:/# touch /dir1/2.txt [root@localhost tempdir]# docker export a286 > ubuntu-test.tar [root@localhost tempdir]# ls ubuntu-test.tar
执行cat ubuntu-test.tar | docker import - ubuntu:test
命令,将导出的tar
包(ubuntu-test.tar)
导入成一个镜像,镜像名为ubuntu:test
。然后使用ubuntu:test
创建一个容器,查看容器中/dir1的内容,发现1.txt和2.txt都存在。
[root@localhost tempdir]# cat ubuntu-test.tar | docker import - ubuntu:test sha256:34be0173049d9f177d84117a786bc02de18c9c84137ea9c61288810c0917c671
docker export 和 docker save的区别
首先,两者的操作对象不同。docker save
是将一个镜像保存为一个tar
包,而docker export
是将一个容器快照保存为一个tar
包。
然后,docker export
导出的容器快照文件将丢弃所有的历史记录和元数据信息,即仅保存容器当时的快照状态;而docker save
保存的镜像存储文件将保存完整记录,体积也要大。下图就能够很好的说明,ubuntu:test
仅仅占97.8MB而ubuntu:latest
却占了120MB。
[root@localhost step2]# docker images ubuntu REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu test 34be0173049d 5 seconds ago 97.8 MB ubuntu latest 14f60031763d 2 weeks ago 120 MB [root@localhost tempdir]# docker run ubuntu:test ls /dir1 1.txt 2.txt
任务要求
本关的编程任务是补全step3/imexport.sh
文件中的内容,要求实现导入导出容器。具体要求如下,
- 将
busyboxContainer
容器的文件系统保存为一个tar
包;
- 通过该
tar
包导入一个busybox:v1.0
镜像。
本关涉及的代码文件step3/imexport.sh
的代码框架如下:
#!/bin/bash #以busybox为镜像创建一个容器,容器名为busyboxContainer docker run --name busyboxContainer busybox echo "hello" #1.然后将busyboxContainer导出为容器快照:busybox.tar #********** Begin *********# #********** End **********# #2.最后使用该容器快照导入镜像,镜像名为busybox:v1.0。 #********** Begin *********# #********** End **********#
测评说明
下面是对平台如何评测你所实现功能的说明及样例测试。本关的测试文件是step3/imexporttest.sh
。
具体测试过程如下:
- 平台运行
step3/imexport.sh
;
- 平台运行
step3/imexporttest.sh
,并以标准输入方式提供测试输入;
- 平台获取
step3/imexporttest.sh
的输出,然后将其与预期输出比较,如果一致则测试通过;否则测试失败。
以下是平台对step3/imexport.sh
的样例测试集: 测试输入: 无 测试输出: success
参考答案:
#以busybox为镜像创建一个容器,容器名为busyboxContainer #拉取busybox 最新镜像,实际生产中,docker pull 这一步可以省略,docker run的时候会自己去拉取。 docker pull busybox docker run --name busyboxContainer busybox echo "hello" #1.然后将busyboxContainer导出为容器快照:busybox.tar #********** Begin *********# docker export busyboxContainer > busybox.tar.gz #********** End **********# #2.最后使用该容器快照导入镜像,镜像名为busybox:v1.0 #********** Begin *********# cat busybox.tar.gz | docker import - busybox:v1.0 #********** End **********#