docker 撰写健康检查问题
docker compose healthcheck issue
在我的 docker-compose.yml(版本 - 2.3)中,我为几个服务设置了健康检查。这是相关的 yml 片段 -
healthcheck:
test: ["CMD-SHELL", "/secrets/authz_Startup.sh"]
interval: 30s
timeout: 30s
retries: 3
start_period: 300s
这是我的 authz_Startup.sh 内容 -
#!/bin/bash
HTTP_STATUS="$(curl -IL --silent https://myHost.com/authz/ping 2>/dev/null | head -n 1 | cut -d ' ' -f 2)";
if [ "$HTTP_STATUS" = "200" ]; then
echo "Service started";
exit 0;
else
echo "***Service NOT started*** --> $HTTP_STATUS";
exit 1;
fi
exit;
但是,当我 运行 "docker-compose up" 然后使用 "docker inspect --format='{{json .State.Health}}' CONTAINER_ID | jq" 检查健康检查输出时,我总是得到 -
{
"Status": "unhealthy",
"FailingStreak": 16,
"Log": [
{
"Start": "2018-03-10T16:05:18.361126144+05:30",
"End": "2018-03-10T16:05:18.668852098+05:30",
"ExitCode": 1,
"Output": "***Service NOT started*** --> \n"
},
{
"Start": "2018-03-10T16:05:48.676933885+05:30",
"End": "2018-03-10T16:05:48.973643139+05:30",
"ExitCode": 1,
"Output": "***Service NOT started*** --> \n"
}
]
}
但是我能够从终端运行这个脚本并得到"Service started"消息。当我从浏览器请求 ping url 并且典型的响应时间以毫秒为单位时,我也能够看到“200 OK”响应。此外,在声明服务 "unhealthy" 之前,我能够在我的浏览器上看到 200 响应。
我无计可施,试图找出我做错了什么。有人可以帮我解决这个问题吗?
想通了 -->
在我的设置中,我在端口 8080 上有 4 个 docker 容器 运行ning tomcat 服务器并映射到端口(9000、9001、9002 和 9003)和一个 Apache Web 服务器 运行在我的 ubuntu (v16.04) 服务器上的端口 443 上 ning。 Apache 有一个配置为将请求转发到单个 docker 容器的反向代理。这部分工作正常。例如。 - 我向 apache 网络服务器发出请求 (https://myHost.com/authz/ping) and the request forwards to the individual docker container (http://myHost.com:9000/authz/ping)。
但是,docker 容器中的 healthcheck api 运行 以及所有这一切,同时我试图发出此请求 --> https://myHost.com/authz/ping 但 docker 容器是无法连接到主机上的 Apache 网络服务器 运行ning,这就是它失败的原因。
我将健康检查 url 更改为 http://localhost:9000/authz/ping,它开始正常工作。
所以,这个位现在已经排序,但我仍然需要想出一些方法来从 docker 容器内提供服务,在主机上发现服务 运行ning。
在我的 docker-compose.yml(版本 - 2.3)中,我为几个服务设置了健康检查。这是相关的 yml 片段 -
healthcheck:
test: ["CMD-SHELL", "/secrets/authz_Startup.sh"]
interval: 30s
timeout: 30s
retries: 3
start_period: 300s
这是我的 authz_Startup.sh 内容 -
#!/bin/bash
HTTP_STATUS="$(curl -IL --silent https://myHost.com/authz/ping 2>/dev/null | head -n 1 | cut -d ' ' -f 2)";
if [ "$HTTP_STATUS" = "200" ]; then
echo "Service started";
exit 0;
else
echo "***Service NOT started*** --> $HTTP_STATUS";
exit 1;
fi
exit;
但是,当我 运行 "docker-compose up" 然后使用 "docker inspect --format='{{json .State.Health}}' CONTAINER_ID | jq" 检查健康检查输出时,我总是得到 -
{
"Status": "unhealthy",
"FailingStreak": 16,
"Log": [
{
"Start": "2018-03-10T16:05:18.361126144+05:30",
"End": "2018-03-10T16:05:18.668852098+05:30",
"ExitCode": 1,
"Output": "***Service NOT started*** --> \n"
},
{
"Start": "2018-03-10T16:05:48.676933885+05:30",
"End": "2018-03-10T16:05:48.973643139+05:30",
"ExitCode": 1,
"Output": "***Service NOT started*** --> \n"
}
]
}
但是我能够从终端运行这个脚本并得到"Service started"消息。当我从浏览器请求 ping url 并且典型的响应时间以毫秒为单位时,我也能够看到“200 OK”响应。此外,在声明服务 "unhealthy" 之前,我能够在我的浏览器上看到 200 响应。
我无计可施,试图找出我做错了什么。有人可以帮我解决这个问题吗?
想通了 --> 在我的设置中,我在端口 8080 上有 4 个 docker 容器 运行ning tomcat 服务器并映射到端口(9000、9001、9002 和 9003)和一个 Apache Web 服务器 运行在我的 ubuntu (v16.04) 服务器上的端口 443 上 ning。 Apache 有一个配置为将请求转发到单个 docker 容器的反向代理。这部分工作正常。例如。 - 我向 apache 网络服务器发出请求 (https://myHost.com/authz/ping) and the request forwards to the individual docker container (http://myHost.com:9000/authz/ping)。
但是,docker 容器中的 healthcheck api 运行 以及所有这一切,同时我试图发出此请求 --> https://myHost.com/authz/ping 但 docker 容器是无法连接到主机上的 Apache 网络服务器 运行ning,这就是它失败的原因。
我将健康检查 url 更改为 http://localhost:9000/authz/ping,它开始正常工作。 所以,这个位现在已经排序,但我仍然需要想出一些方法来从 docker 容器内提供服务,在主机上发现服务 运行ning。