我正在使用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协议,而我唯一可以设法find它的服务就是在wget程序提供的响应中寻找connected 。
我想知道是否有一个合法的方法来做到这一点,无论端口上使用什么协议。 请记住,我不是在寻找一些可以协调整个networking的大型服务。 我正在寻找一个小程序,就像在这里命名的那个程序,它可以在容器中find,一旦远程端口连接,就返回true。
Telnet通常用于快速检查连通性。
telnet <servername> <port number>
如果端口可以访问,你应该得到关于连接的消息,如下所示:
$ telnet www.google.com 80 Trying 216.58.195.132... Connected to www.google.com. Escape character is '^]'.
也有netcat ,这是另一个非常简单的networking工具,可以任意TCP和UDP连接。