当Alpine存在时,为什么使用Ubuntu作为Docker基础镜像?
在为构建新容器选择基本映像时,您可能会本能地选择最精简的基本映像。毕竟,基础映像越小,构建操作就越快。它们也更安全,因为它们的攻击面更小。
然而,这并不意味着在选择基本图像时,越小越好。为了证明这一点,本文介绍了两种基本不同类型的基映像之间的差异:基于Ubuntu Linux的基映像和基于Alpine Linux的基映像。
正如我们将看到的,尽管这两种基本映像在本质上都不比另一种更好,但它们都更适合于某些用例。你不应该仅仅因为Ubuntu是一个更大的基本映像而选择Alpine而不是Ubuntu。
为什么选择正确的基本图像很重要
为容器选择正确的基映像是成功地对应用程序进行容器化的第一步。你选择的基本图像类型有以下原因:
- 依赖项:如果应用程序运行所需的依赖项包含在基本映像中,则在配置应用程序时不必做那么多工作码头工人形象通过在Dockerfile中添加自定义命令。
- 可扩展性:在基本映像中内置更多的依赖项和其他资源,也可以更容易地随时间更新容器,而无需修改Docke2022世界杯阿根廷预选赛赛程rfiles。
- 安全性:基本映像中的组件越少,映像包含易受攻击的库或其他资源的风险就越低。
- 图像“膨胀”:使用不必要的大基本图像会导致图像膨胀,这意味着容器映像很大——因此需要更长的时间下载——因为它们包含应用程序不需要的组件。
为了选择正确的基本图像,您需要在图像中包含的资源数量和图像的总体大小之间找到正确的平衡。2022世界杯阿根廷预选赛赛程这些往往是相互竞争的优先级,因为在基本映像中包含的实用程序和库越多,基本映像就越大。
一般来说,基本图像分为两大类。第一种是使用完整的操作系统(如Ubuntu)创建的基本映像。另一种包括基于极简操作系统(如Alpine Linux)的映像。
以Ubuntu和Alpine为例,让我们比较每种类型的基本映像并权衡其优缺点。
使用Ubuntu作为基础映像
Ubuntu基本图片,你可以在码头工人中心的根文件系统创建Ubuntu基地它是Ubuntu Linux操作系统的变种。
值得注意的是,如果你在你的电脑上安装了桌面版的Ubuntu, Ubuntu Base是一个轻量级的Ubuntu版本。Ubuntu Base不包含运行图形界面、办公软件和其他与大多数容器用例无关的实用程序所需的软件。所以,即使你使用Ubuntu作为基础图像,你也会得到一个相对精简的图像;目前Ubuntu基本映像的大小在75兆以下。
尽管如此,如果你运行Ubuntu 20.04基本映像并查看/bin目录的内容,你会看到它包含数百个实用程序(这就是/bin;在文件系统的其他部分有额外的软件):
Apt主机脚本
Apt-cache主机名scriptlive
Apt-cdrom i386脚本播放
Apt-config iconv sdiff
Apt-get id sed
按键infocmp选择编辑器
Apt-mark infotocap敏感浏览器
Arch安装敏感编辑器
Awk ionice敏感寻呼机
B2sum ipcmk seq
Base32 ipcrm搜索
Base64 ipcs setpriv
Basename ischroot setsid
基本连接setterm
击杀sg
Bashbug最后一个sh
Captoinfo lastb sha1sum
Cat lastlog sha224sum
Chage LDD sha256sum
chatattr链接sha384sum
Chcon linux32 sha512sum
CHFN linux64 shred
CHGRP ln shuf
Chmod现场技能
选择区域检查台板
Chown localedef sleep
CHRT记录器snice
CHSH登录排序
Cksum日志名分裂
清除ls stat
Clear_console lsattr stdbuf
CMP LSBLK stty
通信模块
Cp lsipc求和
Csplit会阻塞同步
切lslogins标签
快跑,战术
日期lns尾部
Dd man焦油
helper mawk任务集
deb-system -invoke cookie tee
Debconf md5sum tempfile
md5sum debconf-apt-progress。textutils测试
debconf- communication mesg tic
Debconf-copydb mkdir超时
Debconf-escape mkfifo tload
Debconf-set-selections mknod toe
Debconf-show mktemp top
Delpart more touch
安装tput
差异挂载点tr
Diff3 mv true
截断目录名称
Dircolors nawk tset
Dirname newgrp tsort
Dmesg nice tty
Dnsdomainname nisdomainname tzselect
Domainname nl lampset
DPKG nohup数量
Dpkg-deb nproc uname
Dpkg-divert nsenter解压缩
Dpkg-maintscript-helper numfmt unexpand
Dpkg-query od uniq
Dpkg-realpath寻呼机断开链接
Dpkg-split partx unshare
Dpkg-statoverride passwd update-alternatives
dpkg-触发器粘贴正常运行时间
Du pathchk用户
Echo perl utmpdump
Egrep perl5.34.0 vdir
Env pgrep vmstat
展开w
过期pidwait墙
小指表
因子pkill wc
故障日志PLDD WDCTL
Fallocate pmap whereis
虚假陈述
Fgrep printenv。debianutils
Fincore printf who
找到prlimit whoami
find nt ps x86_64
聚集PTX xargs
FMT PWD是的
折叠PWDX ypdomainname
免费rbash zcat
Getconf readlink ZCMP
Getent realpath zdiff
Getopt renice zdump
Gpasswd重置zegrep
GPGV resizepart zfgrep
Grep rev zforce
分组rgrep zgrep
枪炮
Gzexe rmdir zmore
Gzip运行部件znew
如果你想知道总共有多少文件,下面是答案:
294
正如你所看到的,在Ubuntu的基本映像的/bin目录中有294个实用程序。默认情况下,所有这些软件都在Ubuntu基本映像中可用,开发者不需要添加它。
Ubuntu优势vs. Alpine
在某种程度上,由于这些庞大的内置工具集合,Ubuntu基本映像比真正的极简基本映像(如Alpine)提供了某些优势:
- 更多的工具:默认情况下,Ubuntu基本映像包含更多的库和实用程序。这减少了在构建自己的容器映像时必须安装在基本映像之上的软件数量。
- 默认情况下:Apt, Ubuntu包管理器,内置在Ubuntu基本映像中。在创建容器时,你可以使用apt从Ubuntu的60,000个包中安装其他软件。Alpine Linux也提供了一个包管理器,但是它不能访问apt那样多的包。
- 广泛支持:Ubuntu是最流行的Linux发行版之一,它不仅被广泛用于运行容器,还被广泛用于各种其他目的。这意味着Ubuntu对于开发人员和系统管理员来说很可能是熟悉的,即使他们以前没有使用过Docker。Alpine Linux在Docker上下文中不太常见。
使用Ubuntu基本映像
要使用Ubuntu作为容器的基本映像,首先创建一个Dockerfile,将Ubuntu标识为映像。例如:
复制app /usr/bin/app
这个Dockerfile使用Ubuntu 20.04作为它的基本映像,并在它上面安装了一个名为“app”的应用程序。
如果您想安装额外的软件并将其包含在容器中,则需要设置Dockerfile以运行apt并安装所需的包。例如:
RUN apt update;Apt -y install package1 package2
复制app /usr/bin/app
要从Dockerfile构建一个容器,运行:
Ubuntu与Alpine的缺点
虽然Ubuntu基本映像在很多方面都有优势,高山Linux在某些情况下是更好的选择。Ubuntu相对于Alpine的缺点包括:
- 更大的图像尺寸:阿尔卑斯基地图像总共大约5.5兆字节——比Ubuntu占用的大约75兆字节要小得多。因此,使用Alpine作为基本映像创建的容器也会更小。反过来,基于alpine的容器将花费更少的时间来下载、扫描和(在大多数情况下)运行。
- 更广泛的攻击面:因为Ubuntu基本映像默认包含比Alpine更多的实用程序和库,所以它们具有更高的安全风险。
为了了解Alpine到底小了多少,下面是Alpine基本映像中/bin中包含的实用程序列表:
拱
灰
base64
bbconfig
busybox
猫
chgrp
修改文件权限
乔恩
cp
日期
dd
df
dmesg命令
dnsdomainname
dumpkmap
回声
艾德
egrep
假
fatattr
fdflush
fgrep
fsync
getopt
grep
gunzip
gzip
主机名
ionice
iostat
ipcalc
kbd_mode
杀了
链接
linux32
linux64
ln
登录
ls
lzop
makemime
mkdir
mknod
mktemp
更多的
山
挂载点
mpstat
mv
netstat
不错的
pidof
平
ping6
pipe_progress
printenv
ps
松材线虫病
reformime
牧师
rm
删除文件夹
掌管部分
sed
setpriv
一些
上海
睡眠
统计
stty
苏
同步
焦油
触摸
真正的
umount
uname
usleep
看
zcat
在/bin中总共有81个实用程序——不是一个微不足道的数字,但仍然比Ubuntu的294个少得多。
此外,如果你仔细观察,你会发现Alpine的大多数实用程序实际上只是到BusyBox的符号链接,BusyBox是一个可执行文件,在单个应用程序中提供了许多Unix工具:
总计808
lrwxrwxrwx 1 root root 12 Apr 4 16:06 arch -> /bin/busybox
lrwxrwxrwx 1 root root 12 Apr 4 16:06 ash -> /bin/busybox
lrwxrwxrwx 1 root root 12 Apr 4 16:06 base64 -> /bin/busybox
lrwxrwxrwx 1 root root 12 Apr 4 16:06 bbconfig -> /bin/busybox
-rwxr-xr-x 1 root root 824984 Apr 4 10:19 busybox
...
因此,从技术上讲,Alpine实际上只包含一个实用程序——BusyBox。从这个意义上说,Alpine更精简,更容易保护,因为您唯一需要担心的漏洞是影响BusyBox的漏洞。但在Ubuntu中却不是这样,默认安装的数百个工具中的每一个都可能受到任意数量的漏洞的影响。
底线:在安全性是最优先考虑的用例中,和/或应用程序依赖关系很少的情况下,使用Alpine作为基础映像比使用Ubuntu或类似的“全分量”Linux发行版更有意义。
使用Alpine基础图像
如果你选择使用Alpine基础映像,你只需创建一个Dockerfile,如下所示:
复制app /usr/bin/app
如果你需要安装额外的软件,你可以使用apk, Alpine的包管理器:
运行apk add -update -no-cache package1 package2
复制app /usr/bin/app
正确配置Dockerfile后,继续构建容器:
为什么Ubuntu有时是比Alpine更好的基映像选择
当然,与Ubuntu相比,Alpine的基础映像更小、更精简。然而,这并不意味着Alpine作为基本形象总是更好。如果你的Docker容器需要Ubuntu中包含的额外工具和库,那么选择Ubuntu而不是Alpine是有意义的。
