目录
前言-
一、制作镜像-
方式1-在根文件系统目录下制作镜像-
方式2-使用根文件系统压缩包制作镜像-
二、本地导出、导入镜像-
1、导出为tar文件-
2、从tar包中导入镜像-
3、导出为tar.gz压缩包-
4、导入tar.gz压缩包-
前言
rdk-gen可以用来构建系统镜像,在使用pack_image.sh在完成构建后。deploy/rootfs路径下还存放着固件的根文件系统,可以通过chroot使用:
根文件系统中已经包含qemu-static,能被chroot挂载。意味着这个根文件系统可以用于制作成docker镜像。
文中用到的的docker命令:
docker build : 根据Dockerfile内容制作镜像
docker run: 使用镜像创建Docker容器并立刻运行
对镜像使用
save
、load
,对容器使用export
、import
docker save: 将镜像导出(默认情况式传输到 STDOUT)
docker load: 从tar或STDIN中导入镜像
docker ps:列出容器(运行中的)
docker ps -a
:列出所有容器
docker images:列出镜像
docker rm:删除容器
docker rmi:删除镜像
一、制作镜像
为了制作和使用docker容器至少需要安装 docker-compose
软件包。-
方式1-在根文件系统目录下制作镜像
在根文件系统中创建一个Dockerfile输入以下内容,制作一个新镜像:
FROM scratch
ADD . /
在根文件系统目录下使docker build
将其导入为docker镜像:
#格式: docker build -t <image-name> .
docker build -t x3rootfs .
随后可以通过docker run
创建一个用后就销毁的容器进行简单测试,在容器中输入exit
可以退出容器。
sudo docker run -it --rm x3rootfs /bin/bash
补充:删除容器
如果没有加上--rm
exit退出后容器不会被销毁。可以使用docker ps -a
列出所有容器,再用docker rm <容器id>将其销毁。
使用qemu仿真环境运行docker容器
参考文档Multi-platform images,如果主机和容器都配置好了qemu环境可以直接使用镜像,不需要借助docker内置的qemu-static;
但在生产环境下不推荐使用仿真环境,Qemu模拟AArch64架构会造成难以容忍的性能损失。
- 根据Qemu转译Armv8-a性能基准测试结果,6253CL 3.7Ghz在仿真环境下单核性能低于X3Pi A53 1.2Ghz,严重影响构建速度。不推荐将Qemu用于仿真性能高于Cortex-A7的平台。-
方式2-使用根文件系统压缩包制作镜像
这种方式比较适合CI与二次分发。
开发环境:
先将根文件系统打包成名称为 rootfs.tar.xz
的压缩包
#./rdk-gen/deploy
sudo tar zcvf rootfs.tar.xz -C rootfs .
sudo chmod 777 rootfs.tar.xz
部署与测试环境(RPI4):
创建一个目录用于存放 rootfs.tar.xz
同级在目录下创建一个Dockerfile输入以下内容:
FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/bash"]
同样使用docker build 将压缩包导入为镜像
docker build -t x3rootfs .
执行结果如下图所示
创建一个CI中常见的用后就销毁的容器:
sudo docker run -it --rm x3rootfs /bin/bash
编译multimedia_samples/sample_lcd:
在AArch64设备上运行docker容器
X3 rootfs制作的根文件系统在树莓派4的docker中性能表现良好
- 基准性能测试结果与RPi4相似
- 在IO性能上存在瓶颈,不推荐以SD卡为储存设备的载体托管容器-
二、本地导出、导入镜像
1、导出为tar文件
制作完镜像后可以将其导出供其他设备使用。
docker images
列出已有镜像
docker save -o x3rootfs.tar x3rootfs
将x3rootfs镜像导出到x3rootfs.tar这一文件中。
2、从tar包中导入镜像
为了演示方便在同一台设备上进行导入,先使用docker rmi x3rootfs
删除先前的x3rootfs镜像。
也可以使用docker rmi <image id>
删除镜像
接下来使用docker load -i x3rootfs.tar
从文件中导入镜像
3、导出为tar.gz压缩包
大多数情况下tar导出就能满足需求,但这是一个根文件系统镜像,体积太大。save除了能将其输出到文件中也能将其输入STDOUT,通过管道传递给其他程序。
参考官方的示例
Save an image to a tar.gz file using gzip
You can use gzip to save the image file and make the backup smaller.
$ docker save myimage:latest | gzip > myimage_latest.tar.gz
可以使用 docker save x3rootfs | gzip > x3rootfs.tar.gz
在导出时用gzip减小体积:
4、导入tar.gz压缩包
在本节的第二部分中使用了docker -i
导入了x3rootfs.tar。
此处还可以使用 docker load < x3rootfs.tar.gz
从STDIN导入文件: