基于银河麒麟V10构建Docker基础镜像 - 本地打包

起因

因公司项目需要运行在银河麒麟V10的系统下,使用Docker制作开发环境,在测试过程尝试过用CentOS 7/8 作为基础镜像,但是发现CentOS 7 GCC版本比较低,CentOS 8软件源被关闭。突发奇想,想着用银河麒麟系统(以下简称麒麟系统)做个基础镜像。

步骤

  1. 从银河麒麟官网下载试用版高级服务器版系统镜像(桌面版是Ubuntu核心的,高级服务器版是CentOS核心)
  2. 使用虚拟机安装系统(最小系统安装)
    因公司项目是飞腾CPU(ARM构架)的,使用的是物理机,Window下可以用QEMU模拟ARM架构,但是效率太慢了,如果有知道提升速度的小伙伴,麻烦告知下,谢谢
  3. 构建镜像文件
#进入工作目录,可以随意定,不能用/root
mkdir /home/kylin-docker-fs && cd /home/kylin-docker-fs

#创建基础目录,dev 必须要创建,不然会提示找不到/dev/null
mkdir usr dev
cp -a /usr/lib /usr/lib64 /usr/bin /usr/share usr/

#创建链接2
ln -s usr/lib lib
ln -s usr/lib64 lib64
ln -s usr/bin bin

#复制配置以及root目录
cp -a /etc /root ./

#裁剪部分脚本,不然会提示/proc 没有mount 
rm -rf etc/profile.d/flatpak.sh etc/profile.d/gawk.csh etc/profile.d/gawk.sh etc/profile.d/lang.csh etc/profile.d/lang.sh etc/profile.d/system-info.sh

#测试镜像目录
chroot .

#镜像目录测试没有问题,打包
cd ..
tar -C kylin-docker-fs/ -z -c . -f kylin-armv8-docker.tar.gz
  1. 构建Docker镜像目录
mkdir /home/kylin-docker && cd /home/kylin-docker
mv ../kylin-armv8-docker.tar.gz ./
vi Dockerfile
##写入以下内容,内容模板来源于CentOS镜像的Dockerfile
	FROM scratch
	ADD kylin-armv8-docker.tar.gz /
	LABEL \
	    org.label-schema.schema-version="1.0" \
	    org.label-schema.name="Kylin Base Image" \
	    org.label-schema.vendor="Kylin" \
	    org.label-schema.license="GPLv2" \
	    org.label-schema.build-date="20220816" \
	    org.opencontainers.image.title="Kylin Base Image" \
	    org.opencontainers.image.vendor="Kylin" \
	    org.opencontainers.image.licenses="GPL-2.0-only" \
	    org.opencontainers.image.created="2022-08-16 00:00:00+00:00"

	CMD ["/bin/bash"]
#保存文件
:wq
  1. 构建镜像测试
cd /home/kylin-docker
docker build . -t kylin:10sp1
  1. 镜像构建完成后,docker images 查看镜像信息
    在这里插入图片描述
    至此,基础镜像构建完成。

遇到过的问题(Q&A)

Q:/usr/share目录没有拷贝,chroot进入测试,backspace 键变成空格,鼠标后退一个位置,但是字符是被删除了的
A:没有找到确定的原因,网上查找说是shell 的设置问题,后面拷贝/usr/share目录解决该问题

Q: 问题截图如下
基于银河麒麟V10构建Docker基础镜像 - 本地打包_第1张图片
A:镜像文件根目录创建/dev目录即可

Q:问题截图如下
基于银河麒麟V10构建Docker基础镜像 - 本地打包_第2张图片
A:解决方案,就是移除/etc目录下flatpak.sh,gawk.csh,gawk.sh,lang.csh,lang.sh,system-info.sh,应该是麒麟系统内部添加部分启动逻辑引起的问题。这里的粗暴移除,可能会对其他依赖功能有影响,因未经详细测试,后面再补充。

Q:使用的时候,发现用制作出来的镜像启动容器,性能和裸机差距较大,一个程序裸机花费7000s,容器花费9000+s(2022-09-27更新
A:具体原因没有排查出来,更换其他基础镜像测试,虽然也有损耗,但是在可以接受范围。

总结

这样创建出来的镜像体积相当巨大,压缩后600多M,解压缩达到1.6G。导致该镜像体积大的原因有两个
1.没有裁剪
2.银河麒麟在Server版本安装了很多非必要的库(例如Qt5、X11、GTK这些)
如果能裁剪,应该能达到CentOS那样的基础镜像大小。
其他系统应该也可以参考该方法制作,但是该方法制作的镜像移植性和兼容性没有测试过。

参考链接

Creating your Own Base Image for Docker
创建自己的Docker基础镜像(rhel、centos)

你可能感兴趣的:(Docker,docker,linux,运维)