gpt4 book ai didi

docker - 如何检查应用程序是否已在容器内启动

转载 作者:行者123 更新时间:2023-12-02 08:15:17 30 4
gpt4 key购买 nike

我们有一个集成测试套件,可以在启动任何测试用例之前启动容器。我们过去常常在执行任何测试之前等待端口可用,这表明应用程序已准备好接收请求。但在 1.7.1 版本中,在应用程序在容器内启动之前,端口即可立即可用。

是否可以选择推迟 docker 端口转发,直到端口在容器内打开?

或者是否有其他可靠的方法来检查应用程序是否已在容器内启动?

最佳答案

But with version 1.7.1 ports are instantly available, before application has even started inside container.

我认为这不是真的——也就是说,我认为这取决于您尝试联系端口的方式。例如,考虑这样的容器:

$ docker run -it -p 8888:80 alpine sh

这里我们设置了从主机端口 8888 到容器端口 80 的端口转发,但我们没有设置任何内容来监听容器内部。尝试连接到 localhost 上的端口 8888 会导致连接成功并立即关闭:

$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

这正是您所经历的。但是,如果我们使用主机的 IP 地址而不是 localhost,我们会看到不同的行为:

$ telnet 192.168.1.55 8888
Trying 192.168.1.55...
telnet: connect to address 192.168.1.55: Connection refused

如果在容器内我启动一个 Web 服务器:

/ # apk add mini_httpd
[...]
/ # mini_httpd
mini_httpd: started as root without requesting chroot(), warning only

然后我就可以成功连接了:

$ telnet 192.168.1.55 8888
Trying 192.168.1.55...
Connected to 192.168.1.55.
Escape character is '^]'.

发生这种情况是因为通过 localhost 的连接由绑定(bind)到端口 8888 的 Docker 用户态代理处理:

# netstat -tlnp | grep 8888
tcp6 0 0 :::8888 :::* LISTEN 2809/docker-proxy

但是到另一个接口(interface) ip 的连接(以及源自另一个主机的任何连接)将由 iptables nat 表中的规则处理:

# iptables -t nat -S DOCKER
-N DOCKER
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8888 -j DNAT --to-destination 172.17.0.138:80

Or is there other reliable method to check if application has started inside container?

您有几个选择:

  • 直接连接容器ip即可,而不是依赖端口转发。例如,在上面的示例中,我启动的容器被分配了地址 172.17.0.138。我可以直接连接到该地址而不是主机地址。查找 docker 容器的 IP 地址很容易:

    $ docker检查 --format '{{ .NetworkSettings.IPAddress }}' my-container172.17.0.138

  • 等待您成功连接到您的应用程序。在此示例中,我最终启动了一个 Web 服务器,我可以等到 curl 成功连接:

    while ! curl -sf http://localhost:8888/; do
    sleep 1
    done

    如果无法成功获取 URL,-f 标志会告诉curl 退出并返回错误代码。

关于docker - 如何检查应用程序是否已在容器内启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31836321/

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