k8s-demo集群搭建详细步骤02:构建宇宙中第一个基础容器镜像,致敬Docker之父Solomon Hykes

3,142 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

这个题目可能吓到大家了,不好意思,我猜宇宙中第一个容器镜像是DotCloud公司的Solomon Hykes构建的,致敬!

由于有同事问,构建自己的容器镜像怎么操作?搜索了一下,大部分文章介绍构建第一个容器镜像的方法有两种,一种是编写Dockerfile,基于一个容器镜像构建,另一种是基于容器镜像,先运行一个容器,在容器中执行一些列操作,然后退出容器,基于该容器commit一个新的容器镜像

同事的好奇打动了我,那就写一篇构建第一个基础容器镜像的文章吧,本文介绍的方法,不属于上述两种方法,所以有了这个吓人的奇葩标题,那就开始构建自己小宇宙中的第一个基础容器镜像吧

一、定义基础容器镜像(目标)

  • 可以运行一个shell:/bin/bash
  • 可以执行 ls命名,看一下根目录下有哪些文件
  • 实验环境是CentOS7.9
[root@master1 /]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@master1 /]# uname -r
4.4.248-1.el7.elrepo.x86_64

二、创建rootfs

1、新建临时rootfs根目录 /tmp/myimage

[root@master1 /]# mkdir /tmp/myimage
[root@master1 /]# mkdir /tmp/myimage/bin
[root@master1 /]# mkdir /tmp/myimage/lib64

2、确定bash命令依赖的动态库

[root@master1 /]# ldd /bin/bash | egrep -o '/lib.*\.[0-9]'
/lib64/libtinfo.so.5
/lib64/libdl.so.2
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2

3、确定ls命令依赖的动态库

[root@master1 /]# ldd /bin/ls | egrep -o '/lib.*\.[0-9]'
/lib64/libselinux.so.1
/lib64/libcap.so.2
/lib64/libacl.so.1
/lib64/libc.so.6
/lib64/libpcre.so.1
/lib64/libdl.so.2
/lib64/ld-linux-x86-64.so.2
/lib64/libattr.so.1
/lib64/libpthread.so.0

3、复制上述文件到 /tmp/myimage/lib64,并测试

[root@master1 /]# cp /bin/bash /tmp/myimage/bin/
[root@master1 /]# cp /bin/ls /tmp/myimage/bin/
[root@master1 /]# NEW_ROOT=/tmp/myimage
[root@master1 /]# NEW_LIBS="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"
[root@master1 /]# for i in $NEW_LIBS; do cp -v "$i" "${NEW_ROOT}${i}"; done
[root@master1 /]# NEW_LIBS="$(ldd /bin/bash | egrep -o '/lib.*\.[0-9]')"
[root@master1 /]# for i in $NEW_LIBS; do cp -fv "$i" "${NEW_ROOT}${i}"; done
[root@master1 /]# chroot /tmp/myimage/ /bin/bash
bash-4.2# /bin/ls /
bin  lib64
bash-4.2# /bin/ls -l /bin
total 1060
-rwxr-xr-x 1 0 0 964536 Jan 29 08:52 bash
-rwxr-xr-x 1 0 0 117608 Jan 29 08:55 ls
bash-4.2# exit
exit
[root@master1 /]# 

三、打包容器镜像 centos7-bash

[root@master1 /]# tar -C /tmp/myimage/ -c . |  docker import - centos7-bash
sha256:b3bb78b50d050bc047920b1745c4d47717786ded575e9d09b7cc37fd889c03fb
  • 查看镜像大小:4.37MB
[root@master1 /]# docker images
REPOSITORY                                        TAG       IMAGE ID       CREATED         SIZE
centos7-bash                                      latest    b3bb78b50d05   5 seconds ago   4.37MB

四、测试容器镜像

[root@master1 /]# docker run -it centos7-bash /bin/bash
bash-4.2# pwd                                                                                                                                         
/
bash-4.2# /bin/ls /
bin  dev  etc  lib64  proc  sys
bash-4.2# exit
exit
[root@master1 /]# 

在这里插入图片描述

参考


  • 先用起来,通过操作实践认识kubernetes(k8s),积累多了自然就理解了
  • 把理解的知识分享出来,自造福田,自得福缘
  • 追求简单,容易使人理解,知识的上下文也是知识的一部分,例如版本,时间等
  • 欢迎留言交流,也可以提出问题,一般在周末回复和完善文档
  • Jason@vip.qq.com 2022-3-29