1.最低特权用户
默认情况下,如果 Dockerfile 中未指定用户,它将使用该root用户,这可能是一个很大的安全风险,因为 99% 的应用程序不需要 root 用户,这可能使攻击者更容易升级主机的权限。
为了避免这种情况,只需在 中创建一个专用用户和一个专用组,Dockerfile并添加USER指令以使用该用户运行应用程序。
注意:一些镜像已经带有一个通用用户,我们可以使用它。例如,node.js镜像带有一个名为node.
3.多阶段构建
Docker 镜像通常比它们必须的要大得多,这最终会影响我们的部署、安全性和开发体验。优化构建可能很复杂,因为很难保持图像干净,最终会变得混乱且难以遵循。我们最终还会在我们的版本中发布不必要的资产,例如工具、开发依赖项、运行时或编译器
TLDR
主要思想是将构建阶段与运行时阶段分开
1.从具有整个运行时或 SDK 的基础映像派生
2.复制我们的源代码
3.安装依赖项
4.生成构建工件
5.将构建的工件复制到更小的发布映像
下面是一个 Go 的例子,最终的生产图像只有 10mb 左右
3.扫描安全漏洞
安全性是任何应用程序的重要组成部分,特别是如果您在医疗保健、金融等高度监管的行业工作。幸运的是,docker 带有一个docker scan
命令,可以扫描我们的图像以查找安全漏洞。建议将其用作 CI 设置的一部分
docker scan <image>
node:17-alpine
这是和的扫描结果node:17
。正如我们所见node:17
,完整的操作系统发行版存在大量漏洞
4.使用较小尺寸的官方镜像
老实说,没有人喜欢在开发或 CI 构建期间拉出巨大的容器。虽然有时我们必须为特定任务使用具有完整操作系统分布的容器,但在我看来,容器应该很小,并且在交付代码时仅充当我们应用程序的隔离包装器。因此,建议使用更精简的 OS 发行版的较小映像,这些发行版仅捆绑必要的系统工具和库,同时最大限度地减少攻击面并确保我们拥有更安全的映像
例如,alpine
在优化图像大小时经常使用一种常见的做法。Alpine Linux 是一个基于 musl libc 和 busybox 的面向安全的轻量级 Linux 发行版
5.使用缓存
众所周知,docker images 包含各种层,并且在 Dockerfile 中,每个命令或指令都会创建一个镜像层。因此,如果我们重建我们的 docker 镜像并且 Dockerfile 或层没有改变,Docker 将只使用缓存层来构建镜像。这会显着加快镜像重建速度
下面是一个示例,说明我们如何node_modules
利用 docker 层缓存进行缓存。这可以根据我们的 Dockerfile 在多种情况下实现
发表评论 取消回复