我正在尝试使用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公开的服务,这就可以工作。有一件事我不确定,那就是除了docker服务器公开的端口之外,我不能将PRIVATE_IP和BRIDGE_IP设置为任何其他值。例如,如果我尝试将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。
我在Windows10上运行最新的Docker-Toolbox,我的服务容器运行单声道并执行NancyFX自托管应用程序。
我假设我在bash脚本中做错了什么,但我不知道是什么。任何帮助都将不胜感激。
发布于 2016-04-11 16:27:20
尝试使用Docker Compose。它易于使用,并且具有内置网络,因此容器可以相互通信。
针对您的用例的一个简单的docker-compose.yml文件如下所示(未经测试):
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。
如果您想创建自定义网络,您可以执行以下操作:
services:
consul:
...
networks:
- consulnet
registrator:
...
networks:
- consulnet
networks:
consulnet有关Docker Compose中的网络的更多信息,请参见this link。
发布于 2017-07-14 14:51:13
您在桥接网络中使用consul,这就是您面临问题的原因。领事将分配一组不同的it,如下所示,如果其他服务不在其中,您将无法ping通这些it。
"TaggedAddresses": {
"lan": "172.17.0.2",
"wan": "172.17.0.2"
},你必须理解当你的应用程序扩展到多个容器/服务器时需要服务发现的事实,如果你想只在一台主机上运行它进行测试,你实际上可以获得docker-compose的好处,将所有容器设置在一个网桥中,服务发现将默认工作。
因此,您需要使用--net=host通过主机的网络运行您的领事容器,您将看到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
https://stackoverflow.com/questions/36536740
复制相似问题