busybox编译安装并将其打包为docker基础镜像

busybox是一个开源项目,docker的很多轻量级镜像都是基于此制作出来的,现在的实验目标为:下载一个最新的busybox编译安装包,将它安装后,打包成一个可以运行的极为精简的系统镜像,可运行基础命令,比如,ls,more,cat等等命令,但没有用户系统这些。

下载链接为:https://busybox.net/downloads/busybox-1.32.0.tar.bz2

一,环境准备工作

所有工作都是在一台vm虚拟机上完成,系统为centos7,既然是编译,自然需要gcc这些基本的编译工具,因此,命令如下:

yum install ncurses-devel ncurses gcc gcc-c++  bzip2-y

打包成docker镜像,自然需要docker环境了哦。docker环境的建立没什么好说的了,请戳我的博客:

https://blog.csdn.net/alwaysbefine/article/details/110310112

二,解压下载下来的安装包

tar jxf busybox-1.32.0.tar.bz2

三,进入解压出来的目录,开始编译工作

busybox的编译比较类似内核编译,因此,不能直接make && make install。

上图提示,要么 make menuconfig  要么 make defconfig ,make menuconfig是菜单模式,类似内核编译的那种菜单, make defconfig 是默认选项编译,也就是所有编译都是按默认的来。

在这,我们选择使用第二个命令 make defconfig 所有默认即可。

执行命令:

make install 

输出如下:

此时,在此目录下会生成一个_install 的文件夹,进入这个目录,看看有什么?

[root@centos8 _install]# pwd
/root/busybox-1.32.0/_install
[root@centos8 _install]# ll
total 8
drwxr-xr-x 2 root root 4096 Dec 19 20:57 bin
lrwxrwxrwx 1 root root   11 Dec 19 20:57 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 Dec 19 20:57 sbin
drwxr-xr-x 4 root root   29 Dec 19 20:57 usr

那么,这个时候的busybox可以打包了吗?  NO,还需要四个本机的动态链接库,执行命令如下:

mkdir lib64
cp /lib64/libm.so.6 ./lib64/
cp /lib64/libc.so.6 ./lib64/
cp /lib64/ld-linux-x86-64.so.2 ./lib64/
cp /lib64/libresolv.so.2 ./lib64

四,开始打包工作

[root@centos8 _install]# pwd
/root/busybox-1.32.0/_install
[root@centos8 _install]# tar cf rootfs.tar .
tar: ./rootfs.tar: file is the archive; not dumped
[root@centos8 _install]# ll
total 12808
drwxr-xr-x 2 root root    4096 Dec 19 20:57 bin
drwxr-xr-x 2 root root      90 Dec 19 21:07 lib64
lrwxrwxrwx 1 root root      11 Dec 19 20:57 linuxrc -> bin/busybox
-rw-r--r-- 1 root root 4751360 Dec 19 21:07 rootfs.tar
drwxr-xr-x 2 root root    4096 Dec 19 20:57 sbin
drwxr-xr-x 4 root root      29 Dec 19 20:57 usr

rootfs.tar  这个文件就是打包后的成果,将该文件与下面所编写的dockerfile 文件放置在同一个目录下。 

五,dockerfile 制作镜像,编写dockerfile 和build

vim Dockerfile

From scratch
ADD rootfs.tar /
CMD ["/bin/sh"]

官方说明:scratch镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像。地位类似于Oracle的dual表,如果有熟悉Oracle的同学我相信会立刻明白scratch是什么东西的。可以这么说,这玩意又玄又虚。

[root@centos8 _install]# docker build -t busybox:v1.0 .
Sending build context to Docker daemon  9.495MB
Step 1/3 : From scratch
 ---> 
Step 2/3 : ADD rootfs.tar /
 ---> 5ef18d0fa9ec
Step 3/3 : CMD ["/bin/sh"]
 ---> Running in a2194430cbd2
Removing intermediate container a2194430cbd2
 ---> 5fd14d1f9b5f
Successfully built 5fd14d1f9b5f
Successfully tagged busybox:v1.0

六,查看新build的镜像,并运行测试它

[root@centos8 _install]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED              SIZE
busybox                       v1.0                5fd14d1f9b5f        About a minute ago   4.54MB
[root@centos8 _install]# docker run -it --rm busybox:v1.0
/ # ls
bin      dev      etc      lib64    linuxrc  proc     sbin     sys      usr
/ # r
raidautorun   readahead     realpath      renice        return        rmmod         rtcwake       runsv
rdate         readlink      reboot        reset         rev           route         run-init      runsvdir
rdev          readonly      reformime     resize        rm            rpm           run-parts     rx
read          readprofile   remove-shell  resume        rmdir         rpm2cpio      runlevel
/ # touch hello
/ # ls
bin      dev      etc      hello    lib64    linuxrc  proc     sbin     sys      usr

至此,一个袖珍的操作系统被打包到docker镜像内了,只有最基本的功能哦。包括镜像给的IP都有哦

[root@centos8 _install]# docker run -it --rm busybox:v1.0
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐