集装箱码头出现后,集装箱技术在互联网领域得到空前的普及。无论是大公司还是钓市初创公司,农民基本上都会在各种技术社区或各种演讲会上学习相关技术。作为一个跳楼创业公司,我们也不例外。去年,我们做了一些关于Docker.Solution的事情,一年前测试了一些程序,今天我总结了在践踏坑的过程中遇到的坑和一些想法,希望能给认识Docker并渴望尝试的人一些启示。当然,在这方面有丰富经验的学生更欢迎提出一些建议或建议。
我们项目的标准PHP技术栈:PHP-FPM+Nginx运行在阿里云的ECS上,数据库也是阿里云的服务。
从理论上讲,对于一般的刁丝创投公司的刁丝项目来说,没有必要使用过于复杂的技术,对新技术的约束也是大农的职业道德。在项目上线以来遇到的各种问题中,如上一篇文章中提到的laravel的性能问题,而HHVM或PHP7,这些新技术都提到性能,所有的突然切换风险都太大,因此可以使用Container运行一些服务测试;例如,以前有一个BUG,一个接口问题占用了太多的内存,导致系统响应超时;例如,在看过其他人在各种技术会议上共享的经验之后,我真的很想自己尝试一下。
根据Docker的哲学,每个容器都是一个独立的服务,服务通过接口相互协作,采用的方案是PHP-FPM和Nginx分别在不同的容器中运行,PHP-FPM容器将端口暴露给Nginx容器。
容器之间的网络通信最初使用Docker自己的链接。虽然链接很简单,但它不是很有用。Link是通过在启动容器时修改/ETC/HOST文件来实现的。当时遇到的一个问题是,容器的IP在通过链接重新启动之后发生了变化,但是容器中没有链接。还有一个问题是,当同一个服务需要打开多个容器时,当然,如果它以集群方式运行,则更加困难,因此链接只能在本地开发、本地开发中发挥作用。领事做服务发现。领事不在这里介绍。感兴趣的学生可以阅读这篇文章:使用领事和注册官为码头集装箱服务发现(https:www.livewyer.comblog201502service-discovery-docker-containers-u)。
然后放在主机,和代码的目录是安装在容器启动。根据所使用的接口方案,接口分为几个不同的容器中运行,和资源隔离的应力进行了测试。符合预期,很满意。然后,我们选择了两个容器运行hhvm测试和性能真的提高了很多。整体结构如下图所示:
这可以正常使用,然后处理日志。首先,主机上安装了一个目录来存储日志,但这与Docker的想法不太一致。所以我们得到了一个LogStash容器,并把各种容器的日志写入LogSTASH容器中。
然后我们监控集装箱。我们使用ONAPM服务,这并不坏。还有其他开源工具可供选择,但使用ONAPM服务更方便。
一个完整的技术堆栈已经建立,运行几天没有问题。当然,作为搜索者,有更高的要求。后来,我想到了一个问题:Docker的想法是容器是一个完整的服务,但是我们使用的是在容器中运行PHP-FPM,代码不在容器中,而是通过目录安装来实现这一点。追求完美:完美之路
事实上,把代码放入容器不仅仅是为了思想的完美,而且为了另一个目的:基于DOCKER的CI。基本的想法是每一个版本都建立了一个新的图像版本。在编译过程中,代码需要更新到最新版本,然后安装依赖的第三方库和其他与业务相关的预处理。构建完成后,推到注册表,然后在每个节点下拉,重新启动容器。整个过程
怎么样这是完美的。如果现实是如此完美,但现实总是会有各种各样的坑等待着你!
首先,在使用这个机制之前,发布代码、合并分支只需几秒钟,然后在每个节点下拉代码。但是在使用DOCKER之后,合并分支需要建立一个镜像,建立一个推送寄存器,然后把镜面拉到每个节点,更不用说说了。它还需要几分钟。此时,一些学生可能会说DOCKER镜像的原理不是层机制。是的,是层。每个构建只需要更新需要更新的层,但是仍然没有办法只更新那些像Git之类的文件,至少更新整个项目的代码目录。
其次,我们之前只需要更新代码,但现在我们需要重新启动容器。最初,重新启动容器非常快,但是PHP-FPM在容器中运行非常慢。我猜它会发送一个SigTalk的信号到集装箱的过程中,当DOCKER停止执行。PHP-FPM在处理SIGTERM信号时会做一些清理工作,节点至少有几十个容器,每个容器都会重新启动,这很耗时。
在使用完美机制之后,这种简单的发布需要几分钟。尽管整个过程是完全自动的,但是没有必要在完美理念上妥协。
此外,还有一个非常奇怪的问题:当容器升级到1.10时,在容器启动后经常会遇到端口不可通行。此时,如果您进入容器发起一个网络请求,如IP低于ping时,端口将恢复正常。长期使用各种工具进行调试,仍然没有发现问题所在,DiaosiPioneer公司也没有精力研究这样一个深奥的探索。莱姆,不得不暂时搁置一段时间。
虽然没有理想的完美解决方案,但是也使整个框架更加方便扩展,比如在交通高峰期快速上架的节点。由于近年来云计算的发展,这个问题也更容易解决。ODE放置在主机目录中,所以基本上每个主机只需要三个条件就可以上网:
在购买ECS之后,完成上述操作以生成系统映像,当新节点需要联机时,该系统映像可以直接用于配置服务器。已被领事提及。
DOCKER群将用于未来的集群管理。当对调度的需求很大时,可以尝试使用Mesos或Kubernetes。然而,集装箱的生态链发展很快,在需要时可能有更好的解决方案。
简单地概括整个感知过程,从体系结构的角度来看,永远不会有完美的体系结构,只有最适合自己的体系结构。团队对各种技术的理解以及技术选择的复杂性。不要看几个牛分享他们的技术架构,而是急于尝试他们自己的项目。最后,即使他们做不到,也会给其他人留下一团糟去清理。最后,在迭代过程中保持项目简单的能力始终是衡量代码农民技术水平的一个重要标准。