gpt4 book ai didi

docker - docker 容器如何可靠地表明它们不仅在运行,而且已经准备就绪?

转载 作者:行者123 更新时间:2023-12-02 21:04:55 25 4
gpt4 key购买 nike

我有一个运行一个提供微服务的小型TCP服务器的Docker容器。

容器化过程开始后,该过程需要几毫秒的时间才能开始侦听其端口。如果在此之前尝试连接,则任何客户端的连接都将被connection refused终止。

忙于等待容器状态更改为running并不能阻止这种情况,因为在启动该过程之后需要一段时间才能启动服务。

容器过程向主机指示其已真正准备就绪的良好/常规方式是什么?

最佳答案

轮询服务是常规方法。不用理会Docker在说什么;尝试建立连接,如果遇到连接被拒绝的错误,请重试,直到连接成功或等待时间过长。

大多数容器只有在实际准备接受流量时才真正开始侦听其TCP端口。客户通常通过轮询套接字来解决此问题,通常使用诸如wait-for-it之类的专用工具。一个非常合理的替代方法是让客户端尝试在初次启动时进行连接,如果该连接失败,则崩溃,然后让协调器重新启动Pod(即使只有 docker run --restart on-failure 足以使其正常工作)。

由于容器与主机系统是隔离的,因此容器没有一条可以宣传“我准备好了!”的路径。例如,如果一个容器创建了一个文件来宣告准备就绪,那么它将需要与主机系统进行一些共享存储才能创建该文件,而协调器(例如Docker Compose)则需要意识到这一点。这不是任何通常的协调器的标准部分。

轮询方法的另一个重要方面是问题和解决方案都不是特定于Docker的。如果您仅在不涉及Docker的Ubuntu主机上运行service mysql start,它仍然需要一分钟左右的时间,并且相同的轮询方法将起作用。如果数据库位于其他主机或云提供商的某个位置,则您没有共享的文件系统,但是您可以再次对其进行轮询,直到数据库就绪为止。诸如Consul之类的工具可以基于轮询已知服务来构建服务目录。 @DavidSzalai's answer提到了Kubernetes运行状况检查,它再次具有类似的方法(“尝试连接或崩溃”绝对是管理Kubernetes托管客户端的常规方法)。

关于docker - docker 容器如何可靠地表明它们不仅在运行,而且已经准备就绪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58701168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com