Docker和Consul:Pinging服务有效,但curl总是返回无法连接到主机错误

时间:2016-04-10 23:25:42

标签: docker consul

我正在尝试使用Docker部署多个服务,并使用Consul进行服务发现。我已经浏览了各种指南和教程,并且我有以下bash脚本来设置我的Docker容器:

export PRIVATE_IP=XXX.XXX.XXX.XXX
export BRIDGE_IP=XXX.XXX.XXX.XXX
docker run -d --name consul -h $HOSTNAME -p $PRIVATE_IP:8300:8300 -p $PRIVATE_IP:8301:8301 -p $PRIVATE_IP:8301:8301/udp -p $PRIVATE_IP:8302:8302 -p $PRIVATE_IP:8302:8302/udp -p $PRIVATE_IP:8400:8400 -p $PRIVATE_IP:8500:8500 -p $BRIDGE_IP:53:53/udp progrium/consul -server -advertise $PRIVATE_IP -bootstrap
docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock -h $HOSTNAME gliderlabs/registrator consul://$PRIVATE_IP:8500
docker run -d --dns=$BRIDGE_IP --dns 8.8.8.8 --dns-search service.consul -p 3579:3579 --name service1 rcarrington/service1
docker run -d --dns=$BRIDGE_IP --dns 8.8.8.8 --dns-search service.consul -p 3580:3580 --name service2 rcarrington/service2

这可以工作,因为我可以导航到Consul UI并查看所有节点存在,我还可以导航到service1和service2公开的服务。我不确定的一件事是我不能将PRIVATE_IP和BRIDGE_IP设置为除docker服务器公开的端口以外的任何东西。如果我尝试将BRIDGE_IP设置为172.17.42.1(这显然是默认值),则脚本只会出错。

问题是我希望我的服务能够彼此通信,而他们似乎无法这样做。如果我从service2 ping service1,那么我得到如下响应:

# ping service1
# PING service1.service.consul (YYY.YYY.YYY.YYY): ZZ data bytes

这似乎是正确的,但是当我尝试使用curl导航到它的服务时,我收到couldn't connect to host错误。我已经尝试了主机名和IP地址的每个组合(包括正确的端口),没有运气。可能奇怪的是,ping返回的IP地址不是上面脚本中使用的1。

我正在Windows 10上运行最新的Docker-Toolbox。我的服务容器正在运行单声道并执行NancyFX自托管应用程序。

我假设我在bash脚本中做错了但是我不知道是什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您正在桥梁网络中使用领事,这就是您遇到此问题的原因。 Consul将分配一组不同的IP,如果其他服务不在其中,您将无法ping通。

"TaggedAddresses": {
        "lan": "172.17.0.2",
        "wan": "172.17.0.2"
    },

您必须了解当您的应用程序扩展到多个容器/服务器时需要服务发现这一事实,如果您只想在一个主机上运行它以进行测试,您实际上可以获得docker-compose设置的好处默认情况下,一个网桥中的所有容器和服务发现都将起作用。

因此,您需要使用--net = host来使用主机网络运行您的consul容器,您会看到TaggedAddresses现在是主机的地址。

curl http://localhost:8500/v1/catalog/nodes\?pretty

[
    {
        "ID": "5989c38f-298e-07f3-0069-d448dcc307d7",
        "Node": "consul-master",
        "Address": "10.11.14.171",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "10.11.14.171",
            "wan": "10.11.14.171"
        },
        "Meta": {},
        "CreateIndex": 5,
        "ModifyIndex": 6
    },

你也可以深入挖掘它在DNS级别的工作。

dig @127.0.0.1 -p 8600 stackoverflow.service.dc1.consul. ANY

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.55.amzn1 <<>> @127.0.0.1 -p 8600 stackoverflow.service.dc1.consul. ANY
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65131
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;stackoverflow.service.dc1.consul.  IN  ANY

;; ANSWER SECTION:
stackoverflow.service.dc1.consul. 0 IN  A   10.11.15.112
stackoverflow.service.dc1.consul. 0 IN  A   10.11.14.34
stackoverflow.service.dc1.consul. 0 IN  A   10.11.14.101

;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Thu Jul 13 10:13:35 2017
;; MSG SIZE  rcvd: 90

但是,您将面临curl的问题,因为使用--dns命令dns转发在主机网络模式下不起作用。这不是一个真正的问题,因为您可以使用类似dnsmasq的内容,或者已经存在应用程序可用于查找服务的软件包。例如:您可以在nodejs应用程序中使用的consul-npm