该博客将介绍我在过去几个月中看到的10种容器反模式:
- 容器中的数据或日志 –容器是无状态应用程序的理想选择,并且具有短暂性。 这意味着不应将任何数据或日志存储在容器中,否则当容器终止时它们将丢失。 而是使用卷映射将它们持久保存在容器之外。 ELK堆栈可用于存储和处理日志。 如果在早期测试过程中使用了托管卷,请使用
-v
switch和docker rm
命令删除托管卷。 - 容器的IP地址 –为每个容器分配一个IP地址。 多个容器相互通信以创建应用程序,例如,部署在应用程序服务器上的应用程序将需要与数据库进行通信。 现有容器将终止,新容器将始终启动。 依靠容器的IP地址将需要不断更新应用程序配置。 这将使应用程序变得脆弱。 而是创建服务。 这将提供一个逻辑名称,可以独立于容器数量的增加和减少而进行引用。 它还提供了基本的负载平衡。
- 在容器中运行单个进程 –
Dockerfile
使用一个CMD
和ENTRYPOINT
。 通常,CMD将使用脚本来执行映像的某些配置,然后启动容器。 不要尝试使用该脚本启动多个进程。 创建Docker映像时遵循关注点分离模式很重要。 这将使管理容器,收集日志,更新每个单独的流程变得更加困难。 您可以考虑将应用程序分解为多个容器并独立进行管理。 - 不要使用
docker exec
–docker exec
命令在正在运行的容器中启动新命令。 这对于使用docker exec -it {cid} bash附加外壳非常有用。 但是除了容器已经在运行它应该运行的进程以外。 - 保持映像精简 –创建一个新目录,并将Dockerfile和其他相关文件包含在该目录中。 在创建映像之前,也请考虑使用.dockerignore删除任何日志,源代码,日志等。 确保解压缩所有下载的工件后,将其删除。
- 从正在运行的容器中创建映像 –可以使用
docker commit
命令创建新映像。 在容器中进行任何更改时,这很有用。 但是使用此方法创建的图像是不可复制的。 而是在Dockerfile中进行更改,终止现有容器并使用更新的映像启动新容器。 - Docker映像中的安全凭证 –不要在Dockerfile中存储安全凭证。 它们以明文形式并检入到存储库中。 这使他们完全脆弱。 使用
-e
将密码指定为运行时环境变量。 另外,----env-file
可用于从文件读取环境变量。 另一种方法是使用CMD
或ENTRYPOINT
指定脚本。 该脚本将从第三方提取凭据,然后配置您的应用程序。 -
latest
标签 :以像couchbase
这样的图像couchbase
很诱人。 如果未指定标签,则使用图像couchbase:latest
启动容器。 该图像可能实际上不是最新的,而是指向较旧的版本。 将应用程序投入生产需要具有映像精确版本的完全控制器环境。 阅读此Docker: Docker队长@adrianmouat 的最新困惑帖子。 确保在运行容器时始终使用标签。 例如,使用couchbase:enterprise-4.5.1
,而不是只是couchbase
。 - 阻抗不匹配 –在开发,测试,测试和生产环境中,请勿使用不同的图像,甚至不要使用不同的标签。 作为“真理之源”的图像应创建一次并推送到存储库中。 该映像应用于以后的不同环境。 在某些情况下,您可以考虑在Maven构建中对WAR文件运行单元测试,然后创建映像。 但是任何系统集成测试都应该在将要投入生产的映像上进行。
- 发布端口 –不要使用
-P
发布所有公开的端口。 这将允许您运行多个容器并发布它们的暴露端口。 但这也意味着将发布所有端口。 而是使用-p
发布特定端口。
您还遵循其他哪些反模式?
适用于Java开发人员的Docker是一个自定进度的动手实践讲习班,它解释了如何开始使用适用于Java开发人员的Docker。
对更深入的潜水教程感兴趣吗? 观看JavaOne的2小时教程!
couchbase.com/containers展示了如何在各种框架中运行Couchbase。
翻译自: https://www.javacodegeeks.com/2016/11/docker-container-anti-patterns.html