您最终屈服于这些容器,发现它们解决了很多问题并且具有很多优点:
- 容器是不可变的:操作系统,库,文件夹和应用程序-由于所有这些都直接存储在容器中,因此您可以100%确保在质量检查中测试过的映像将始终投入生产。 它将以完全相同的方式工作。
- 轻量级容器:容器不会浪费内存。 容器不需要数百兆字节和千兆字节,而只需要内存用于主进程。
- 容器速度很快:容器的启动速度与常规Linux进程一样快。 不是分钟,而是几秒钟。

但是,许多人仍然认为容器是虚拟机,并且忘记了它们最重要的属性...
临时容器
可处置性是为什么您应该更改处理容器的方法的原因。
在任何情况下都不应采取以下措施,以免失去容器的优势:1.无需将数据存储在容器内。 在生命周期中,可以将容器吊起,销毁或更换。 如果应用程序在容器中运行,则此应用程序的1.0版应轻松更改为1.1版,而不会造成数据丢失和其他麻烦。 因此,如果要保存数据,则必须在上面写这些数据。 但是,那么您需要注意两个容器不要写到同一位置,以免损坏数据。 因此,请检查应用程序是否正确将数据写入共享存储。
2.无需拆分应用程序交付。 有人认为容器是同一虚拟机。 他们中的大多数人认为应将应用程序部署在现有容器中。 实际上,这也是可能的,尤其是在开发阶段,需要不断进行调试和部署。 但是他们应该只输入连续交付CD-ROM并将其转移到质量保证部门或生产中,作为其自身映像的一部分。 请记住:容器不可动摇。
3.无需创建大图像。 大图像更难分发。 因此,该映像应仅包括启动应用程序过程真正需要的文件和库。 无需安装不必要的程序包或运行更新(yum更新),从而无需在映像中创建新层并向其中写入大量文件。
4.请勿使用单层容器。 为了有效地使用多层(多级)文件系统,请始终为操作系统,用户名定义,配置以及最终为应用程序本身创建单独的层。 因此,重新创建,维护和分发图像将更加容易。
5.无需从正在运行的容器中创建映像。 换句话说,请勿使用docker commit命令创建映像,因为此类映像将不可复制。 相反,请始终使用Dockerfile或其他提供可重复性的S2I(源到图像)工具。 此外,在Dockerfile中,如果将更改存储在源存储库(git)中,则可以轻松跟踪更改。
6.无需仅使用最新标签。 对于Maven用户,此标签类似于SNAPSHOT。 由于容器文件系统的多层性质,标签非常有用。 但是,例如,在长达数月的休息后,您决定收集映像并突然发现应用程序不再启动,因为父层(Dockerfile语言中的FROM)已被不支持向后兼容性的新版本替换时,您可能会感到意外的意外。 或者因为从您正在等待的构建缓存中检索了错误的版本。 此外,在生产环境中部署容器时,还应避免使用最新标签,因为您将无法跟踪正在启动哪个版本的映像。
7.无需在一个容器中执行多个进程。 容器非常适合单个进程(http守护程序守护程序,应用程序服务器,DBMS)。 否则,您可能会遇到各种各样的麻烦,例如挖掘日志或单独更新进程。
8.无需在映像中存储凭据-为此,请使用环境变量。 不要在图像中规定任何登录名和密码。 而是使用环境变量从容器外部的源中提取相关数据。 Postgres图像是如何正确执行此操作的一个很好的示例。
9.无需以root用户身份运行进程。 “默认情况下,Docker容器以root身份运行。 (...)但是,随着技术的发展,可能会出现其他更安全的默认启动选项。 在当前条件下,根本需求可能被视为威胁,并且可能无法在所有环境中都提供。 要指定除root用户之外的其他用户(代表该用户启动容器),使用USER指令”(摘录自Docker Image Authors指南)
10.无需依赖IP地址。 每个容器都有自己的内部IP地址,该地址在重新启动容器后可以更改。 如果应用程序或微服务需要与另一个容器通信,请使用环境变量将所需的主机名从一个容器传输到端口号。
你还记得吗 现在您可以放心使用了。 可以在我们的博客上找到使用容器的实用技巧。