- A+
容器十戒原文链接:https://developers.redhat.com/blog/2016/02/24/10-things-to-avoid-in-docker-containers/
所以你最终选择了容器,发现他们解决了很多问题并且有很多优势:
第一:容器是不可变的 - 操作系统,库版本,配置,文件夹和应用程序都包装在容器内。您保证在QA中测试的相同镜像将以相同的行为到达生产环境。
第二: 容器是轻量级的 - 容器的内存占用很小。容器只会为主进程分配内存,而不是数百或数千MB。
第三: 容器速度很快 - 可以像典型的Linux流程启动一样快速启动一个容器。而不是几分钟,你可以在几秒钟内开始一个新的容器。
但是,许多用户仍然像处理典型的虚拟机一样处理容器,并忘记容器具有重要特性: 容器是 一次性的。
这一特性迫使用户改变他们应该如何处理和管理容器的思维方式; 我会解释,你应该什么不要做,以保持提取容器的最佳效益:
1)不要将数据存储在容器中
可以停止,销毁或更换容器。在容器中运行的应用程序版本1.0应该很容易地被版本1.1所取代,而不会对数据造成任何影响或丢失。因此,如果您需要存储数据,请在卷中进行。在这种情况下,如果两个容器在同一卷上写入数据可能会导致损坏,则还应该小心。确保您的应用程序旨在写入共享数据存储。
2)不要将应用程序分开部署
3)不要创建大镜像
大镜像将更难以分发。确保你只有必需的文件和库来运行你的应用程序/进程。不要安装不必要的软件包或运行“ 下载许多文件到新镜像层”的“更新” (yum update)。
更新:还有另一篇文章更好地解释了这个建议:https://developers.redhat.com/blog/2016/03/09/more-about-docker-images-size/
4)不要使用单层镜像
要有效使用分层文件系统,请始终为您的操作系统创建您自己的基础映像图层,为用户名定义创建另一图层,为运行时安装创建另一图层,为配置创建另一图层,最后是你的应用程序的另一层。重新创建,管理和分发您的镜像会更容易。
5)不要从正在运行的容器创建镜像
换句话说,不要使用“docker commit”来创建镜像。这种创建镜像的方法是不可重现的,应该完全避免。始终使用Dockerfile或其他完全可重现的S2I(源到图)方法,并且如果将Dockerfile存储在源代码管理存储库(git)中,则可以跟踪对Dockerfile的更改。
6)不要只使用“最新”标签
最新的标签就像Maven用户的“SNAPSHOT”一样。鼓励标签是因为容器的分层文件属性。几个月后,当您构建映像时,您不希望有任何意外,并且发现应用程序无法运行,因为父层(FROM Dockerfile中的)被替换为新版本,因为它不是向后兼容的,或者是因为错误从构建缓存中检索“最新”版本。在生产中部署容器时,也应该避免使用“最新”标签,因为您无法跟踪正在运行的镜像版本。
7)不要在单个容器中运行多个进程
容器对于运行单个进程(http守护进程,应用程序服务器和数据库)来说是完美的,但如果您拥有多个进程,那么管理,检索日志,并单独更新进程。
8)不要在镜像中存储凭据
使用环境变量 - 您不想在镜像中对任何用户名/密码进行硬编码。使用环境变量从容器外部检索该信息。这个原理的一个很好的例子是Postgres镜像。
9)不要以root用户身份运行进程
“默认情况下,docker容器以root身份运行。随着 docker 的成熟,更安全的默认选项可能会变得可用。目前,需要根对他人是危险的,可能并不适用于所有环境。您的映像应该使用USER指令来指定一个非root用户容器以“”运行。(来自 Docker映像作者指南)
10)不要依赖IP地址
每个容器都有自己的内部IP地址,如果你启动和停止容器,它可能会改变。如果您的应用程序或微服务需要与另一个容器通信,请使用环境变量将正确的主机名和端口从一个容器传递到另一个容器。