当Alpine存在时,为什么要使用Ubuntu作为Docker的基础镜像?

在为构建新容器选择基本映像时,您的本能反应可能是选择尽可能精简的基本映像。毕竟,较小的基本映像会导致更快的构建操作。它们也更安全,因为它们的攻击面更小。
但是,这并不意味着在选择基础图像时越小越好。为了证明这一点,本文详细介绍了两种基本不同类型的基本映像之间的区别:基于Ubuntu Linux的映像和基于Alpine Linux的映像。
正如我们将看到的,尽管两个基本映像本质上都不比另一个好,但每个都更适合于某些用例。你不应该仅仅因为Ubuntu是一个更大的基础图像就选择Alpine而不是Ubuntu。
为什么选择正确的基础图像很重要
为容器选择正确的基本映像是成功地将应用程序容器化的第一步。您选择的基础图像类型很重要,因为:
- 依赖项:如果您的应用程序运行所需的依赖项包含在基本映像中,那么在配置您的码头工人形象通过在Dockerfile中添加自定义命令。
- 可扩展性:在基本镜像中内置更多的依赖关系和其他资源,也可以更容易地随时间更新容器,而无需修改Dock2022世界杯阿根廷预选赛赛程erfiles。
- 安全性:基本映像中的组件越少,映像包含易受攻击的库或攻击者可以利用的其他资源的风险就越低。
- 图像“膨胀”:使用不必要的大基础图像可能导致图像膨胀这意味着容器映像很大——因此下载时间更长——因为它们包含应用程序不需要的组件。
为了选择正确的基础图像,您需要在图像中包含的资源数量和图像的总体大小之间找到适当的平衡。2022世界杯阿根廷预选赛赛程它们往往是相互竞争的优先级,因为在基本映像中包含的实用程序和库越多,基本映像就越大。
一般来说,基础图像分为两大类。第一种是使用全面的操作系统(如Ubuntu)创建的基本映像。另一个包括基于极简操作系统(如Alpine Linux)的映像。
以Ubuntu和Alpine为例,让我们比较每一种类型的基本镜像,并权衡其优缺点。
使用Ubuntu作为基础镜像
Ubuntu基本镜像,你可以在码头工人中心的根文件系统创建Ubuntu基地Ubuntu Linux操作系统的一个变种。
需要注意的是,Ubuntu Base是一个轻量级的Ubuntu版本,比你在电脑上安装桌面版的Ubuntu要轻。Ubuntu Base不包含运行图形界面、办公软件和其他与大多数容器用例无关的实用程序所必需的软件。所以,即使你使用Ubuntu作为基础镜像,你也会得到一个相对精简的镜像;目前Ubuntu基本镜像的大小都在75兆以下。
尽管如此,如果你运行Ubuntu 20.04基本镜像并查看/bin目录的内容,你会看到它包含数百个实用程序(这只是/bin;在文件系统的其他部分有附加的软件):
Apt hostid脚本
Apt-cache主机名scriptlive
Apt-cdrom i386脚本播放
Apt-config iconv sdiff
让我看看
Apt-key infocmp选择编辑器
Apt-mark infocap - sensible-browser
Arch安装sense -editor
一个智能寻呼机
2sum ipcmk seq
Base32 ipcrm搜索
Base64 ipcs setpriv
Basename ischroot setsid
基本连接设置项
击杀sg
Bashbug最后的sh
Captoinfo lastb应该是sum
Cat lastlog sha224sum
修改LDD sha256sum
链接sha384sum
Chcon linux32 sha512sum
CHFN linux64撕碎
CHGRP在关闭
Chmod现场技能
选择本地检查面板
Chown localedef sleep
CHRT日志器
CHSH登录分类
Cksum日志名分裂
清除ls状态
Clear_console lsattr stdbuf
CMP LSBLK模型
通信系统
Cp lsipc sum
Csplit锁同步
剪掉llogins标签
达什,我很高兴
日期lnstail
add man tar
deb-system -helper创建任务集
deb-system -invoke McOokie tee
Debconf md5sum临时文件
md5sum debconf-apt-progress。textutils测试
debconf- communication混乱
Debconf-copydb mkdir timeout
摆脱mkfifo加载
债务设置选择机制
显示mktemp顶部
德尔塔多触点
Df挂载输出
Diff mountpoint tr
Diff3 mv true
截断目录名
Dircolors nawk set
Dirname newgrp tsort
很漂亮
Dnsdomainname nisdomainname tzselect
域名nl uclampset
DPKG noup挂载
Dpkg-deb进程名称
Dpkg-divert发送器解压缩
Dpkg-maintscript-helper numfmt unexpand
Dpkg-query od unique
Dpkg-realpath分页解除链接
Dpkg-split部分取消共享
Dpkg-statoverride passwd update-alternatives
触发粘贴正常运行时间
杜路径用户
执行perl utmpdump命令
执行命令perl5.34.0 vdir
执行命令pgrep vmstat
展开pidof w
到期pidwait墙
迷你手表
因子能力wc
故障日志PLDD WDCTL
查找pmap的位置
假的?
Fgrep printenv .debianutils
Fincore打印谁
找到prelimit whoami
查找ps x86_64
羊群PTX xargs
FMT PWD是的
折叠PWDX ypdomainname
免费的rbash zcat
Getconf readlink ZCMP
Getent realpath zdiff
Getopt renice zdump
Gpasswd reset zegrep
GPGV resizepart zfgrep
Grep rev . force
组rgrep zgrep
Gunzip rm zless
Gzexe rmdir zmore
Gzip run-parts znew
如果您想知道总共有多少个文件,下面是答案:
294
正如你所看到的,在Ubuntu基本镜像的/bin目录下有294个实用程序。默认情况下,所有这些软件都可以在Ubuntu基本镜像中使用,不需要开发人员添加。
使用Ubuntu基本映像
要使用Ubuntu作为容器的基本镜像,首先创建一个Dockerfile,将Ubuntu标识为镜像。例如:
复制app /usr/bin/app
这个Dockerfile使用Ubuntu 20.04作为其基本镜像,并在其上安装了一个名为“app”的应用程序。
如果希望安装其他软件并将其包含在容器中,则需要设置Dockerfile以运行apt并安装所需的软件包。例如:
运行apt update;Apt -y install package1
复制app /usr/bin/app
要从Dockerfile中构建一个容器,可以运行:
使用阿尔卑斯基地图像
如果你选择使用Alpine的基本镜像,你只需创建一个Dockerfile,如下所示:
复制app /usr/bin/app
如果你需要安装额外的软件,你可以使用apk, Alpine的包管理器:
运行apk add -update -no-cache package1 package2
复制app /usr/bin/app
正确配置Dockerfile后,继续按正常方式构建容器:
Ubuntu与Alpine的优势
部分得益于这些广泛的内置工具集合,Ubuntu基本镜像比真正的极简基本镜像(如Alpine)提供了某些优势:
- 更多工具:Ubuntu基本镜像默认包含更多库和实用程序。这减少了在构建自己的容器映像时必须在基本映像上安装的软件数量。
- Apt默认:Apt, Ubuntu包管理器,被内置到Ubuntu的基本镜像中。在创建容器时,您可以使用apt从Ubuntu的60,000个软件包中安装其他软件。Alpine Linux也提供了一个包管理器,但是它不能像apt那样访问那么多的包。
- 广泛的支持:Ubuntu是最流行的Linux发行版之一,它不仅广泛用于运行容器,还用于各种其他目的。这意味着开发人员和系统管理员可能对Ubuntu很熟悉,即使他们以前没有使用过Docker。在Docker环境之外,Alpine Linux不太常见。
Ubuntu与Alpine的缺点
虽然Ubuntu的基本镜像在很多方面都很有优势,高山Linux在某些情况下是更好的选择。与Alpine相比,Ubuntu的缺点包括:
- 较大的图像尺寸:高山基地图像总共大约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发行版更有意义。
为什么Ubuntu有时是比Alpine更好的基础镜像选择
可以肯定的是,Alpine的基础映像比Ubuntu更小、更精简。然而,这并不意味着阿尔卑斯山脉作为基础图像总是更好。如果您的Docker容器需要Ubuntu中包含的额外实用程序和库,那么选择Ubuntu而不是Alpine是有意义的。