译者 | 布加迪
审校 | 重楼
Docker是流行的容器化软件,但不是每个人都在高效地使用它。如果您不遵循Docker的优秀实践,您的应用程序就很容易受到安全问题或性能问题的影响。
本文介绍了您可以用来高效地使用Docker功能的几个最佳实践。这些措施提高了安全性,并确保您创建易于维护的Docker文件。
1.使用官方Docker镜像
在容器化处理应用程序时,必须使用Docker镜像。您可以使用自定义配置构建镜像,也可以使用Docker的官方镜像。
构建自己的镜像需要您自行处理所有配置。比如说,若为Node.js应用程序构建镜像,您必须下载Node.js及其依赖项。这个过程很耗时,可能不会生成所有正确的配置。
Docker建议您使用官方的Node.js镜像,它包含所有正确的依赖项。Docker镜像有更好的安全措施,具有轻量级的优点,并针对各种环境进行了测试。你可以在Docker的官方镜像页面上找到官方镜像。
2.使用Docker镜像的特定版本
当您拉取官方镜像时,它通常带有最新标签,这代表该镜像的最新更新版本。每当使用该镜像构建容器,它都是上一个容器的不同版本。
使用不同的Docker镜像版本进行构建可能导致应用程序出现不可预测的行为。版本可能会与其他依赖项冲突,最终导致应用程序失败。
Docker建议您使用特定版本的镜像进行拉取和构建。官方镜像也有说明文档,介绍了最常见的用例。
比如说,使用docker pull alpine:3.18.3,而不是docker pull alpine。Docker将提取该特定版本。然后,您可以在后续构建中使用它,从而减少应用程序中的错误。您可以在Docker官方镜像页面的Supported标签和相应的Dockerfile链接下找到镜像的特定版本:
3.扫描镜像以查找安全漏洞
如何确定想要构建的镜像没有安全漏洞?扫描就行。可以使用Docker scan命令扫描Docker镜像。语法如下:
docker scan [IMAGE]
您必须先登录到Docker才能扫描镜像。
docker login
然后,扫描您想要检查的特定镜像:
docker scan ubuntu: latest
一种名为Synk的工具可以扫描镜像,根据严重程度列出任何漏洞。您可以看到漏洞的类型和指向相关信息的链接(包括如何修复它)。您可以从扫描结果中判断镜像对您的应用程序而言是否足够安全。
4.使用小型Docker镜像
当您拉取Docker镜像时,它附带所有系统实用程序。这增加了不需要的工具的镜像大小。
大型Docker镜像占用存储空间,并且减慢容器的运行速度。它们存在安全漏洞的可能性也更大。
您可以使用Alpine镜像减小Docker镜像的大小。Alpine镜像是轻量级的,只附带必要的工具。它们减少了存储空间,使应用程序运行起来更快速、更高效。
可以在Docker上找到大多数官方镜像的Alpine版本。下面是PostgreSQL的Alpine版本的示例:
5.优化缓存镜像层
Dockerfile中的每个命令代表镜像上的一个层。这些层有不同的实用程序,并执行不同的功能。如果您查看Docker Hub上的官方镜像,将会看到用于创建它们的说明。
Dockerfile包含创建镜像所需的全部内容。这就是为什么许多开发人员青睐Docker而不是虚拟机的原因之一。
下面是示例Alpine镜像的结构:
当您构建基于镜像的应用程序时,实际上在为镜像添加更多的层。Docker从上到下在Dockerfile上运行指令,如果一个层发生了变化,Docker必须重建后续的层。
最佳实践是将您的Dockerfile按照由更改最少的文件到更改最频繁的文件这个顺序排列。不会改变的指令(比如安装)可以放在文件的顶部。
当您修改一个文件时,Docker根据修改后的文件进行构建,并在上面缓存未修改的文件。因此,流程运行速度更快。
请看上图所示的例子。如果应用程序文件发生了变化,Docker将从那里构建,它没必要再次安装NPM包。
如果从镜像构建,该过程将比从头重建所有其他层运行得更快。缓存也加快了从Docker Hub拉取和推送镜像的速度。
6.使用.dockerignore文件
在使用Dockerfile构建镜像时,您可能希望保留某些信息的私密性。一些文件和文件夹可能是项目的一部分,但您不希望将它们包含在构建过程中。
使用.dockerignore文件可以大大减小镜像大小。这是由于构建过程只包含必要的文件。它还有助于保持文件的私密性,避免暴露密钥或密码。
.dockerignore文件是您在与Dockerfile相同的文件夹中创建的一个文件。它是一个文本文件,酷似.gitignore文件,含有您不希望在构建过程中包含的任何文件的名称。
这里有一个例子:
7.使用最小权限用户原则
默认情况下,Docker使用root用户作为管理员以便获得运行命令的权限,但这种做法不好。如果其中一个容器存在漏洞,黑客就可以访问Docker主机。
为了避免这种情况,应创建专用的用户和用户组。您可以为用户组设置相应的权限,以保护敏感信息。如果用户受到危及,您可以在不暴露整个项目的情况下删除该用户。
下面这个例子展示了如何创建用户并设置权限:
一些基本镜像在其中创建了伪用户。您可以使用已安装的用户,而不是root用户权限。
最佳实践是减少漏洞和编写更简洁代码的好方法。您可以将许多最佳实践应用于使用的每项Docker特性。
一个组织良好的项目可以更容易与Kubernetes等其他编排工具进行同步。您可以从本文中概述的这些方法入手,在学习Docker的过程中采用更多的方法。
原文标题:8 Docker Best Practices You Should Know About,作者:Sandra Dindi