我正在做一个专注于Docker的实习,我必须对具有客户端,服务器和数据库的应用程序进行负载平衡。我使用Nginx作为负载均衡器,我的目标是根据CPU使用情况动态扩展服务器容器的数量。例如,如果CPU使用率超过60%,我想动态添加一个新容器而不重新启动Nginx来划分CPU使用率。 我必须修改nginx.conf文件以添加新容器,但我必须重新启动Nginx容器才能应用更改,这非常慢。
所以我的问题是:有一种(免费的)动态方式吗?
告诉我你是否想要更多信息并原谅我可怜的英语。 感谢。
编辑:我做了@Konstantin Azizov告诉我:
docker cp ./new.conf $(docker ps -f "name=dockerizedrubis_nginx" -q ):/etc/nginx/nginx.conf
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c 'kill -HUP $(cat /run/nginx.pid)'
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c '/etc/init.d/nginx reload'
配置文件很好地粘贴在支持Nginx的容器中,我发送HUP信号以重新配置Nginx进程然后我重新加载以应用我的更改。没有错误,并且即时重新加载工作正常,但我的新节点没有被Nginx考虑,请求仍然只针对创建的第一个节点......
编辑2:我找到了问题的根源。似乎为了在' docker-compose scale'之后更新容器的/ etc / hosts,需要停止,删除和重新启动此容器。就我而言,我真的不想停止支持Nginx的容器。
问题:任何人都知道如何在重新扩展后更新容器的/ etc / hosts而不必重新启动容器(在脏脚本旁边)?
感谢。
答案 0 :(得分:1)
不幸的是,没有简单的(免费)方法可以在不重新启动的情况下更改配置,这是实现零停机时间缩放的唯一方法,它可以正常重启,当您正常地重新启动Nginx时,它将生成具有新配置的新实例,等待直到它启动然后使用先前的配置杀死旧实例。
请参阅official guide。
答案 1 :(得分:1)
我使用Json Wilder中的nginx-proxy映像暂时在容器之间进行负载均衡,并且它适用于多个可伸缩服务。它监视docker守护程序,如果发生事件,它会重建nginx配置文件,在扩展时添加新容器实例,或者在扩展时删除它。
由于Docker 1.10(不确定这是否是正确版本),Docker守护程序中嵌入了一个内部DNS,因此从那时起我就使用了循环功能。现在我使用oficial nginx图像代理将请求传递给我定义为网络选项别名的域。由于我的英语不好,我不知道自己是否清楚,但我相信我的Github例子可能有所帮助。