千家信息网

Docker如何使用busybox创建基础镜像

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下Docker如何使用busybox创建基础镜像,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Docker
千家信息网最后更新 2026年11月01日Docker如何使用busybox创建基础镜像

小编给大家分享一下Docker如何使用busybox创建基础镜像,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Docker镜像的首行从FROM alpine之类的镜像开始,但是最初的基础镜像是如何创建的,本文使用一个busybox创建一个基础镜像,相信在此过程中会对docker一些相关的概念有进一步的理解。

什么是基础镜像(base image)

简单来说,基础镜像就是没有From或者FROM scratch开头的Dockerfile所构建出来的镜像。比如alpine,这个很小的linux镜像目前只有4M左右

[root@kong ~]# docker images |grep alpinedocker.io/alpine        latest       3fd9065eaf02    4 months ago    4.15 MB[root@kong ~]#

它的Dockerfile很简单,只有三行,这就是一个基础镜像,

FROM scratchADD rootfs.tar.xz /CMD ["/bin/sh"]

在接下来的文章中我们将会像alpine那样来创建一个自己的基础镜像。

busybox

概要说明

busybox被称为嵌入式linux的瑞士军刀,这句话是在busybox自己介绍自己的时候提出的(The Swiss Army Knife of Embedded Linux)。busybox整合了很多小的unix下的通用功能到一个小的可执行文件之中,简单来说在unix或者linux下常用的那些功能在这里你都能找到,但是为了busybox的目标:嵌入式的linux,大小对于busybox来说是非常重要的优化要素和限制,这些功能有可能会有所阉割,但是对于一般需求来说已经足够。而alpine就是在busybox基础上增加了自己的包管理工具apk等功能创建了风靡一时的小巧镜像。busybox是用C语言开发的基于GPL的开源项目,目前的稳定版本为1.28.4

宿主机器

[root@kong ~]# uname -aLinux kong 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux[root@kong ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@kong ~]#

下载busybox

简单可以直接使用的二进制最新的版本为1.28.1

[root@kong ~]# wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64--2018-05-25 04:51:20-- https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64Resolving busybox.net (busybox.net)... 140.211.167.122Connecting to busybox.net (busybox.net)|140.211.167.122|:443... connected.HTTP request sent, awaiting response... 200 OKLength: 1001112 (978K)Saving to: 'busybox-x86_64'100%[==============================================================================================>] 1,001,112  19.3KB/s  in 30s  2018-05-25 04:51:57 (32.4 KB/s) - 'busybox-x86_64' saved [1001112/1001112][root@kong ~]#

设定busybox

[root@kong ~]# cp busybox-x86_64 /usr/local/bin/busybox[root@kong ~]# chmod +x /usr/local/bin/busybox[root@kong ~]# which busybox/usr/local/bin/busybox[root@kong ~]#

版本确认

输入busybox可以看出版本以及熟悉的linux下的工具,仔细看一遍就会理解busybox号称自己是瑞士军刀一点都不夸张,反过来说,瑞士军刀如果敢号称linux里的busybox可能会引起非议。

[root@kong ~]# busyboxBusyBox v1.28.1 (2018-02-15 14:34:02 CET) multi-call binary.BusyBox is copyrighted by many authors between 1998-2015.Licensed under GPLv2. See source distribution for detailedcopyright notices.Usage: busybox [function [arguments]...]  or: busybox --list[-full]  or: busybox --install [-s] [DIR]  or: function [arguments]...  BusyBox is a multi-call binary that combines many common Unix  utilities into a single executable. Most people will create a  link to busybox for each function they wish to use and BusyBox  will act like whatever it was invoked as.Currently defined functions:  [, [[, acpid, add-shell, addgroup, adduser, adjtimex, arch, arp, arping, ash, awk, base64, basename, beep, blkdiscard, blkid,  blockdev, bootchartd, brctl, bunzip2, bzcat, bzip2, cal, cat, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt,  chvt, cksum, clear, cmp, comm, conspy, cp, cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup,  deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, dpkg, dpkg-deb, du, dumpkmap,  dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, factor, fakeidentd, fallocate, false,  fatattr, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free, freeramdisk, fsck,  fsck.minix, fsfreeze, fstrim, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, groups, gunzip, gzip, halt, hd, hdparm,  head, hexdump, hexedit, hostid, hostname, httpd, hush, hwclock, i2cdetect, i2cdump, i2cget, i2cset, id, ifconfig, ifdown,  ifenslave, ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, ipneigh,  iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, less, link, linux32, linux64, linuxrc, ln, loadfont,  loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsscsi, lsusb, lzcat, lzma,  lzop, makedevs, makemime, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat,  mknod, mkpasswd, mkswap, mktemp, modinfo, modprobe, more, mount, mountpoint, mpstat, mt, mv, nameif, nanddump, nandwrite,  nbd-client, nc, netstat, nice, nl, nmeter, nohup, nproc, nsenter, nslookup, ntpd, nuke, od, openvt, partprobe, passwd, paste,  patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff, powertop, printenv, printf, ps,  pscan, pstree, pwd, pwdx, raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath, reboot, reformime,  remove-shell, renice, reset, resize, resume, rev, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-init, run-parts,  runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch, setconsole, setfattr, setfont, setkeycodes,  setlogcons, setpriv, setserial, setsid, setuidgid, sh, sha1sum, sha256sum, sha3sum, sha512sum, showkey, shred, shuf, slattach,  sleep, smemcap, softlimit, sort, split, ssl_client, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svc, svlogd,  swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd,  time, timeout, top, touch, tr, traceroute, traceroute6, true, truncate, tty, ttysize, tunctl, ubiattach, ubidetach, ubimkvol,  ubirename, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpd, udpsvd, uevent, umount, uname, unexpand, uniq, unix2dos, unlink,  unlzma, unshare, unxz, unzip, uptime, users, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, w, wall, watch, watchdog,  wc, wget, which, who, whoami, whois, xargs, xxd, xz, xzcat, yes, zcat, zcip[root@kong ~]

创建rootfs

这张图在镜像基础介绍的时候已经被无数次看到了,rootfs是linux中重要的概念,而alpine中也有ADD rootfs.tar.xz这样一句,接下来我们将了解一下如何生成一个简单的rootfs

创建目录并进入

[root@kong ~]# mkdir rootfs[root@kong ~]# cd rootfs/[root@kong rootfs]#

创建rootfs

执行如下语句

for module in `busybox --list-modules`do mkdir -p `dirname "$module"` ln -sf /bin/busybox "$module"done

执行日志

[root@kong rootfs]# for module in `busybox --list-modules`> do>  mkdir -p `dirname "$module"`>  ln -sf /bin/busybox "$module"> done[root@kong rootfs]#

结果确认

[root@kong rootfs]# lsbin linuxrc sbin usr[root@kong rootfs]# find . -type d../usr./usr/bin./usr/sbin./sbin./bin[root@kong rootfs]#

将busybox拷贝至新创建的./bin目录下

这样,上述命令的链接对象就存在了

[root@kong rootfs]# cp /usr/local/bin/busybox bin/[root@kong rootfs]# ls -l bin/busybox-rwxr-xr-x. 1 root root 1001112 May 25 05:27 bin/busybox[root@kong rootfs]#

创建rootfs.tar

此处注意相对路径,而后续次相对路径会展开至/下,从而创建新的系统的rootfs,这也是从零搭建linux(linux from scratch)的重要操作之一。

[root@kong rootfs]# tar cpf rootfs.tar .tar: ./rootfs.tar: file is the archive; not dumped[root@kong rootfs]#

简单说明:busybox -list-modules列出了busybox的所有模块,然后以此为基础,创建了一个小型的rootfs
[root@kong rootfs]# busybox -list-modules |wc -l
389
[root@kong rootfs]#

准备Dockerfile

准备一个一行的Dockerfile

[root@kong rootfs]# vi Dockerfile[root@kong rootfs]# cat Dockerfile From scratch[root@kong rootfs]#

创建base镜像,由于没有发现具体的内容,所以未创建出具体镜像。另外,本文为了演示方便,直接在此处创建Dockerfile,这并不是一个好主意,实际的时候请不要这样做,如果当前目录下有100G的文件,就会无比缓慢,而且也不规范,无关物品需要清场。

[root@kong rootfs]# docker build -t busyboxbase:latest .Sending build context to Docker daemon 2.415 MBStep 1/1 : FROM scratch ---> No image was generated. Is your Dockerfile empty?[root@kong rootfs]# docker images |grep busyboxbase[root@kong rootfs]#

from scracth

有From,这个scratch可以pull么,目前的版本已经将其作为一个保留名称

[root@kong rootfs]# docker search scratch |grep 'an explicitly empty'docker.io  docker.io/scratch              an explicitly empty image, especially for ...  407    [OK]    [root@kong rootfs]# docker pull scratchUsing default tag: latestError response from daemon: 'scratch' is a reserved name[root@kong rootfs]#

将此Dockerfile添加一行没有实际作用的,看看scratch到底是什么

[root@kong rootfs]# vi Dockerfile [root@kong rootfs]# cat Dockerfile From scratchMAINTAINER LiuMiao [root@kong rootfs]#

进行构建,发现产生了一个0字节的镜像文件,也与scratch的原意相通

[root@kong rootfs]# docker build -t busyboxbase:latest .Sending build context to Docker daemon 2.415 MBStep 1/2 : FROM scratch ---> Step 2/2 : MAINTAINER LiuMiao  ---> Running in b118fd7c73a7 ---> 2074dc76c09eRemoving intermediate container b118fd7c73a7Successfully built 2074dc76c09e[root@kong rootfs]# docker images |grep busyboxbasebusyboxbase           latest       2074dc76c09e    14 seconds ago   0 B[root@kong rootfs]#

至此,我们理解了from scratch确实不会有额外的添加,接下来我们像alpine那样添加如下两句

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

我们的Dockerfile也是几乎一样的三行

[root@kong rootfs]# cat Dockerfile From scratchADD rootfs.tar /CMD ["/bin/sh"][root@kong rootfs]#

这样就创建了一个1M的busybox为基础的镜像

[root@kong rootfs]# docker build -t busyboxbase:latest .Sending build context to Docker daemon 2.415 MBStep 1/3 : FROM scratch ---> Step 2/3 : ADD rootfs.tar / ---> 0fbb0c8c7579Removing intermediate container 8311e96f456cStep 3/3 : CMD /bin/sh ---> Running in efb85c4526bf ---> 02270c80a4e4Removing intermediate container efb85c4526bfSuccessfully built 02270c80a4e4[root@kong rootfs]# docker images |grep busyboxbasebusyboxbase           latest       02270c80a4e4    9 seconds ago    1.01 MB[root@kong rootfs]#

运行并使用

使用docker run发现此镜像所启动的容器并无异常之处

[root@kong rootfs]# docker run --rm -it busyboxbase sh/ # hostnameb7f9e9646746/ # uname -aLinux b7f9e9646746 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 GNU/Linux/ #

以上是"Docker如何使用busybox创建基础镜像"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

镜像 基础 版本 功能 重要 接下来 内容 军刀 就是 文件 时候 瑞士军刀 目录 篇文章 瑞士 一行 只有 实际 嵌入式 工具 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州淘业互联网络科技 为想互联网科技怎么样 互联网电商科技 互联网巨头反垄断金融科技 科技与互联网发展 互联网的科技创新 互联网科技公司官网 宜安科技 互联网金融 中正互联网科技招聘 农村开互联网科技讲堂 港股科技和互联网 花神(南京)互联网科技有限公司 高科技互联网发展前景如何 玉溪新华互联网科技好不好 朱啸虎曾投资哪些互联网科技企业 21世纪互联网科技成就 互联网科技快讯热点 承德科技产业互联网平台 重庆科技产业互联网有哪些 现代科技的标志之一的互联网 湖北九亚互联网络科技有限公司 科技互联网公司装修 互联网巨头科技公司 互联网金融 科技创新 荆州市昕露互联网络科技有限公司 互联网科技融合创新 卡尔迅互联网科技有限公司 广州燕处互联网科技有限公司 黑龙江互联网科技公司 中国主要互联网科技公司
0