容器可以解决很多问题,并且具有诸多优势,当你投身其中时便会发现其奥妙所在。
第一:容器是不可变的 - 操作系统,库版本,配置,文件夹和应用程序都包装在容器内。 您可以使用通过相同QA测试的镜像,使产品具有相同的表现。
第二: 容器是轻量级的 - 容器的内存占用很小。没有成百上千的MB,容器只会分配主进程的内存。
第三: 容器是快速的 - 你可以像一个典型的linux进程一样快速启动一个容器。只需要几秒钟,您就可以启动一个新的容器。
然而,许多用户仍然像对待典型的虚拟机那样对待容器。他们似乎都忘记了容器的重要特性:容器是一次性的。
容器的准则:
“容器是临时的”。
这个特性迫使用户改变处理和管理容器的心态;我将会向你说明在容器中不应该做的那些事,以确保容器可以发挥出最佳效果:
1) 不要将数据存储在容器中 - 容器可以被停止,销毁或者替换。 在容器中运行的应用程序版本1.0很容易被1.1版本替换而不会产生任何影响或数据丢失。 因此,如果您需要存储数据,请在卷中进行。 当然在这种情况下,您还应该注意,如果两个容器在相同的卷上写入数据,有可能会导致损坏。 请确保您的应用程序被设计为写入共享数据存储。
2)不要将应用程序分成两个部分 -有些人认为容器像虚拟机,大多数人往往认为他们应该将应用程序部署到现有的运行容器中。 在开发阶段这样是可以的,您需要连续部署和调试;但对于连续交付(CD)管道到QA和产品,您的应用程序应该是映像的一部
3)不要创建大镜像 - 大图像将更难分发。 确保您仅具有运行应用程序/进程所需的文件和库。 不要安装不必要的包或运行“更新” (yum更新) ,下载许多文件到一个新的图像层。
4)不要使用单层镜像 - 要有效地使用分层文件系统,始终为您的操作系统创建您自己的基本镜像层, 用户名定义的为一个图层, 运行时安装的为一个图层,配置的为一个图层,最后为您的应用程序建立一个层。 这样将更容易重新创建,管理和分发您的图像。
5)不要从正在运行的容器中创建镜像 – 换句话说,不要使用“docker commit”创建镜像。 这种创建图像的方法不可重现,应该完全避免。 始终使用Dockerfile或任何其他完全可重复的S2I(源图像)的方法,如果将它存储在源代码控制存储库(git)中,您可以跟踪对Dockerfile的更改。
6)不要只使用“最新”标签 - 最新标签就像“Maven用户快照”。 基于容器分层文件系统的性质,标签实际上是被鼓励使用的,你应该不会希望看到当你几个月后创建镜像时的不兼容,或从创建缓存的检索中检索到了一个错误的“最新”版本。当您不能跟踪正在运行的版本时,在生产环境部署容器时应该避免“最新”标签的出现。
7)不要在一个容器中运行多个进程 - 容器可以完美的运行单个进程(http守护进程,应用程序服务器,数据库),但如果你有一个以上的进程,你可能会在管理上,检索日志,以及单独地更新的过程中遇到更多的麻烦。
8)不要在镜像中存储凭证。 使用环境变量 – 不要对镜像中的任何用户名/密码进行硬编码。 使用环境变量从容器外部检索此信息。 这个原则的一个很好的例子是Postgres图像 。
9)不要以root用户身份运行进程 - “默认情况下,docker容器会以root身份运行。随着Docker的成熟,更安全的默认选项可能会变得可用。 现在,要求root对其他人来说是危险的,并且可能在所有环境中都不可用。 您的镜像应该使用USER指令来为容器指定非root用户
10)不要依赖IP地址 - 每个容器都有自己的内部IP地址,如果启动和停止容器,它的地址可能会改变。 如果您的应用程序或微服务需要与另一个容器通信,请使用环境变量将正确的主机名和端口从一个容器传递到另一个容器。