我正在使用docker
和docker-compose
编写一个由其他几个服务组合而成的服务。由于内部服务相互服务,因此必须按照预定义的优先级启动它们。我发现最简单的方法是使用启动脚本运行每个服务(在其指定的容器中)以在实际运行容器的服务之前检查先决条件。以下是我现在正在使用的方法:
#!/bin/sh
cd /external-indexer
echo "Waitng for RabbitMQ on $RMQ_HOST:$RMQ_PORT"
until curl http://$RMQ_HOST:$RMQ_PORT/ > /dev/null 2>&1
do
echo "$(date) - RabbitMQ is not ready yet"
sleep 1
done
echo "$(date) - RabbitMQ is ready"
echo "Waitng for PostgreSQL on $PG_HOST:$PG_PORT"
until wget $PG_HOST:$PG_PORT -t 1 2>&1 | grep " connected"
do
echo "$(date) - PostgreSQL is not ready yet"
sleep 1
done
echo "$(date) - PostgreSQL is ready"
./run-service
如您所见,在启动当前服务之前,我正在等待其他两个服务(RabbitMQ 和 PostgreSQL)。而且它可以正常工作。但问题是 PostgreSQL 不提供 HTTP 协议,我唯一能找到它是否正在提供服务的方法就是在程序connected
提供的响应中查找wget
。
我想知道是否有一种合法的方法可以做到这一点,无论端口上使用什么协议都可以。请记住,我不是在寻找可以协调整个网络的大型服务。我正在寻找一个小程序,就像这里提到的程序一样,它可以在容器中找到,并且一旦可以在远程端口上建立连接,它就会返回 true。
答案1
Telnet 通常用于快速检查连通性。
telnet <servername> <port number>
如果端口可访问,您应该会收到一条有关已连接的消息,如下所示:
$ telnet www.google.com 80
Trying 216.58.195.132...
Connected to www.google.com.
Escape character is '^]'.
还有网猫,这是另一个非常简单的网络工具,可以建立任意 TCP 和 UDP 连接。