微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让nginx等待我的上游服务在Docker Swarm中启动?

我将一个Nginx代理服务和一个rails应用服务部署到一个docker swarm中。 Nginx取决于我的docker-compose文件中的应用程序。

我的Nginx.conf文件将stream量导向我的上游应用服务(在端口3000上公开),就像这样(只显示上游部分)。

upstream puma { server app:3000; }

我的docker-compose文件看起来像这样:

version: '3.1' services: app: image: my/rails-app:latest networks: - proxy web: image: my/Nginx:1.11.9-alpine command: /bin/sh -c "Nginx -g 'daemon off;'" ports: - "80:80" depends_on: - app networks: - proxy networks: proxy: external: true

我的主机设置为swarm manager。

这一切工作完全正常 – 没有问题。

但是 ,即使在我的docker-compose文件中有一个依赖部分 – 在Nginx服务启动时应用程序服务可能不会完全 (?)准备就绪,所以当上游服务configuration部分尝试DNSparsing“app: 3000“,好像还没有完全find它。 所以,当我访问我的网站时,我在我的Nginx日志中find以下错误消息:

2017/02/13 10:46:07 [error] 8#8: *6 connect() Failed (111: Connection refused) while connecting to upstream,client: 10.255.0.3,server: www.mysite.com,request: "GET / HTTP/1.1",upstream: "http://127.0.53.53:3000/",host: "preprod.local"

如果我杀死了正在运行Nginx服务的docker容器,并且swarm重新调度它一会儿,然后返回,如果我然后访问相同的URL它完全正常,并且请求成功地传递到app:3000。

我怎样才能防止这种情况的发生 – 启动时间有一点点,当Nginx启动的时候,它还不能正确parsing我的叫做app:3000的群集服务 – 而是试图将stream量传递到一个IP地址….

顺便说一句 – 如果我重新启动我的虚拟机相同的情况 – 当docker(在群模式)再次提出服务 – 我可以结束了同样的问题。 重新启动Nginx容器解决了这个问题。

我已经想出了一种方法来做到这一点 – 这是使用Dockerfile或docker-compose文件HEALTHCHECK部分。

首先,看起来好像在部署堆栈的时候, depends_on选项没有被真正使用

docker stack deploy -c docker-compose.yml mystack

Swarm模式下的Docker如果由于其他原因无法正常启动或失败,则会重新启动服务任务。 所以, depends_on选项并不是那么有用。

所以这是我的解决方案,到目前为止它的工作得很好:

version: '3.1' services: app: image: my/rails-app:latest networks: - proxy web: image: my/Nginx:1.11.9-alpine command: /bin/sh -c "Nginx -g 'daemon off;'" ports: - "80:80" networks: - proxy healthcheck: test: ["CMD","wget","-qO-","http://localhost/healthcheck"] interval: 5s timeout: 3s retries: 3 networks: proxy: external: true

所以我做的是,从Nginx服务器我尝试访问我的Rails应用程序的路线 – 我创建了一个名为/ healthcheck,它返回一个200的状态代码

所以,当我尝试访问它,结果是失败(应用程序服务器还没有准备好) – Nginx将被重新启动。 希望当它再次启动时,应用程序服务器将可用,并且上游应用程序:3000指令将执行正确的DNS解析。

所以用这种方法,我一起“砍死”了在群集模式下工作的(missing) depends_on行为。

depends_on选项不会等待容器准备就绪,直到它运行。 https://docs.docker.com/compose/startup-order/

还有两个选项。

从Compose v2.1开始,可以在depends_on选项中包含healthcheck。 https://docs.docker.com/compose/compose-file/compose-file-v2/#dependson

你可以使用像dockerize或wait-for-it这样的外部工具来做同样的事情 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐