首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker和Consul: Pinging服务有效,但curl总是返回无法连接到主机错误

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

Stack Overflow用户
提问于 2016-04-11 07:25:42
回答 2查看 1.4K关注 0票数 3

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

代码语言:javascript
复制
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公开的服务,这就可以工作。有一件事我不确定,那就是除了docker服务器公开的端口之外,我不能将PRIVATE_IP和BRIDGE_IP设置为任何其他值。例如,如果我尝试将BRIDGE_IP设置为172.17.42.1 (这显然是默认设置),脚本就会出错。

问题是,我希望我的服务能够相互通信,但它们似乎无法做到这一点。如果我从service2 ping service1,那么我会得到如下的响应:

代码语言:javascript
复制
# ping service1
# PING service1.service.consul (YYY.YYY.YYY.YYY): ZZ data bytes

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-04-11 16:27:20

尝试使用Docker Compose。它易于使用,并且具有内置网络,因此容器可以相互通信。

针对您的用例的一个简单的docker-compose.yml文件如下所示(未经测试):

代码语言:javascript
复制
version: '2'
services:
  consul:
    image: progrium/consul
    container_name: consul
    ports:
      - "8300:8300"
      - "8301:8301"
      - "8302:8302"
      - "8400:8400"
      - "8500:8500"
  registrator:
    image: gliderlabs/registrator
    container_name: registrator
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
  service1:
    image: rcarrington/service1
    container_name: service1
    ports:
      - "3579:3579"
  service2:
    image: rcarrington/service2
    container_name: service2
    ports:
      - "3580:3580"

默认情况下,所有容器都被添加到网络docker_default中,并且能够通过container_name (例如ping service1 )相互ping。

如果您想创建自定义网络,您可以执行以下操作:

代码语言:javascript
复制
services:
  consul:
    ...
    networks:
      - consulnet
  registrator:
    ...
    networks:
      - consulnet
networks:
  consulnet

有关Docker Compose中的网络的更多信息,请参见this link

票数 2
EN

Stack Overflow用户

发布于 2017-07-14 14:51:13

您在桥接网络中使用consul,这就是您面临问题的原因。领事将分配一组不同的it,如下所示,如果其他服务不在其中,您将无法ping通这些it。

代码语言:javascript
复制
"TaggedAddresses": {
        "lan": "172.17.0.2",
        "wan": "172.17.0.2"
    },

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

因此,您需要使用--net=host通过主机的网络运行您的领事容器,您将看到TaggedAddresses现在是主机的地址。

代码语言:javascript
复制
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级别上也工作正常。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36536740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档