Docker是部署Web应用程序的绝佳工具,但前提是你要按照预期的方式使用它。有很大的潜力开枪打自己的脚。所以如果你想把自己从痛苦的调试时间中拯救出来,确保你避免这些常见的错误。
旁注:如果你想让你的生活更轻松一点,看看sliplane.io。这是一个简单的Docker托管解决方案,可帮助您避免这里提到的一些陷阱。
1. 不设置资源限制❌
如果您在单个服务器上运行多容器设置,这一点尤其重要。贪婪的服务会占用您机器上的所有CPU或内存,使其他容器没有资源可供使用,或者更糟糕的情况:冻结整个服务器。
使用--cpu-quota和--memory标志在运行时限制容器的资源使用:
docker run --memory="512m" --cpu-quota=50000 your-image-name
如果可以的话,避免在运行容器的同一台服务器上构建镜像。构建会占用大量CPU和内存,如果你不考虑这一点,你的服务器会比你说“请不要崩溃!😰”更快崩溃。
2. 不清理❌
没有人喜欢清理,但如果你不想淹没在自己的💩中,这是一项必要的任务。Docker映像可能很大——有时是千兆字节。如果你部署了新版本的镜像,不再需要旧版本的镜像,你应该摆脱它们。未使用的容器和卷也是如此。它们加起来很快,你的部署很快就会失败,你又花了45分钟,直到你发现你的磁盘已满…
使用以下方法删除悬空(未标记,未使用)的Docker对象:
docker container prune
docker image prune
docker volume prune
docker system prune # this removes all dangling images, volumes and containers
通过添加-aarg删除所有未使用的Docker对象(也包括标记的images):
docker container prune -a
docker image prune -a
docker volume prune -a
docker system prune -a # this removes all unused images, volumes and containers
3. 泄露image中的秘密❌
应用程序在构建时要求访问机密的情况并不少见。人们没有意识到的是,在构建时被秘密烘焙的镜像需要被视为秘密!Docker镜像不是保险库。你放在里面的所有东西都可以被每个有权访问镜像的人读取(除非你做了一些疯狂的事情并加密它)。所以永远不要在Docker Hub上发布镜像,如果你把秘密烘焙进去的话!
如果可以的话,避免在构建时传递机密,依靠环境变量或使用机密管理器。如果根本不可能,请确保仅在受信任的环境中构建镜像,将其保存在私有注册表中,仅通过加密线路移动它,并在不再需要它时立即修剪它…
也可以看看这篇博文,了解如何处理构建秘密。
4. 没有监测❌
容器是隔离的和短暂的,这在安全性和便携性方面非常出色,但在监控方面并不理想。
每次要检查日志文件时都必须将docker exec放入容器中是一件非常痛苦的事情,因此请务必提前做好准备。
首先,您可以做的最简单的事情是挂载一个卷来保存您的日志文件,这样它们至少是持久的。但是如果没有日志轮换,理想情况下没有某种搜索日志的方法,这种设置很快就会达到极限。
为了获得更高的可见性,您可以通过将数据流式传输到外部系统并设置资源监控工具来跟踪容器中的CPU和内存使用情况来实现日志监控。
在专业环境中,通常使用ELK堆栈进行监控。
5. 没有优化Docker镜像❌
如前所述,Docker镜像可能很大(最大可达数GB!)。我想在这里提到的最后一个错误是没有优化您的Docker镜像。它不仅节省了大量空间,还减少了攻击面,使您的部署更快。
以最小化Nuxt 3的Docker镜像为例。作者Jonas Schoz设法将镜像大小从1.4 GB降低到只有160 MB!这几乎是10倍的改进,只需遵循几个简单的步骤:
- 使用尽可能小的基础镜像
- 在您的. docker忽略文件中排除不必要的文件
- 从CDN提供静态资产
- 使用多阶段构建
小结
常见的Docker部署错误包括:
- 跳过资源限制,
- 未能清理,
- 将敏感数据构建到您的image中,
- 忽视记录和监测以及
- 错过了优化images。