译者 | 布加迪
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拉取和推送镜像的速度 。
推荐阅读
- 如何使用Docker进行Web应用的快速部署
- Jenkins+Docker一键打包部署Vue项目步骤详解
- Docker网络管理:连接容器和主机
- 优秀个人简历模板 优秀个人简历模板范文
- Malloc技术原理解析以及在转转搜索业务上的实践
- 使用Docker构建轻量级Linux容器
- 近二十年来最优秀的10部扫黑剧,《狂飙》第三,榜首实至名归
- Docker vs. Kubernetes:选择合适的场景
- JavaScript 循环:拥有最佳性能的最佳实践
- MySQL数据库备份与恢复策略:Java实践指南