Docker 的五大最佳实践
在本文中,我们将介绍一些基本的 Docker 最佳实践,这些实践将帮助我们优化镜像以获得更好的尺寸、安全性和开发人员体验。
最低权限用户
默认情况下,如果 Dockerfile 中未指定用户,它将使用该root
用户,这可能是一个很大的安全风险,因为 99% 的时间您的应用程序不需要 root 用户,这可能会使攻击者更容易提升主机上的权限。
为了避免这种情况,只需创建一个专用用户和一个专用组,然后Dockerfile
添加USER
指令以使用该用户运行应用程序。
注意:有些图片已经自带通用用户,我们可以直接使用。例如,node.js
图片就自带一个名为 的用户node
。
#2 多阶段构建
Docker 镜像通常比实际大小要大得多,这最终会影响我们的部署、安全性和开发体验。优化构建可能很复杂,因为很难保持镜像的整洁,最终会变得混乱,难以跟踪。我们最终还会在发布版本中附带一些不必要的资源,例如工具、开发依赖项、运行时或编译器。
TLDR
主要思想是将构建阶段与运行阶段分开。
- 从具有整个运行时或 SDK 的基础映像派生
- 复制我们的源代码
- 安装依赖项
- 生成构建工件
- 将构建的工件复制到更小的发布镜像中
下面是 Go 的一个示例,最终生产图像只有 10mb 左右!
注意:要了解有关多阶段构建的更多信息,请查看我之前的文章《构建小型容器的艺术》
3. 扫描安全漏洞
安全性是任何应用程序的重要组成部分,尤其是在医疗保健、金融等监管严格的行业。幸运的是,docker 自带了一个docker scan
命令,可以扫描镜像中的安全漏洞。建议将其作为 CI 设置的一部分。
$ docker scan <your-image>
node:17-alpine
以下是和 的扫描结果node:17
。我们可以看到node:17
,完整的操作系统发行版存在大量漏洞。
#4 使用较小尺寸的官方图片
说实话,无论是开发还是持续集成构建,没人喜欢拉取巨大的容器。虽然有时我们必须使用包含完整操作系统发行版的容器来完成特定任务,但在我看来,容器应该小巧,在代码交付时仅充当应用程序的独立包装器。因此,建议使用更小的镜像和更精简的操作系统发行版,这些发行版只捆绑必要的系统工具和库,从而最大限度地减少攻击面,并确保我们拥有更安全的镜像。
例如,alpine
在优化图像大小时经常使用一种常见的做法。Alpine Linux 是一个基于 musl libc 和 busybox 的面向安全的轻量级 Linux 发行版。
#5 使用缓存
我们知道,docker 镜像包含各种层,Dockerfile 中的每个命令或指令都会创建一个镜像层。因此,如果我们重建 docker 镜像,而 Dockerfile 或镜像层没有更改,Docker 将直接使用缓存的层来构建镜像。这将显著加快镜像重建速度。
下面是一个利用 Docker 层缓存进行缓存的示例node_modules
。根据 Dockerfile,可以在多种情况下实现缓存。
结论
在本文中,我们讨论了 Docker 的最佳实践,我希望本文对您有所帮助,如果您有任何问题,请随时通过LinkedIn或Twitter与我联系。
文章来源:https://dev.to/karanpratapsingh/top-5-docker-best-practices-57oh