2017-04-16 103 views
1

所以我有一个在Ubuntu主机上运行的docker引擎(版本1.12.6,build 78d1802)。为什么我无法通过名称或VIP访问Docker群集中的服务?

我创建开始使用

docker swarm init --advertise-addr 192.168.1.2 

我使用,我创建了一个名为nodeapp服务如下

docker service create --name nodeapp --publish 3000:3000 --replicas 2 node-app-image 

现在本地预置的图像当我输入curl localhost:3000我得到预期的正确的一个群回应和一切工作到这一点。

This document和我提到的很多其他人似乎建议docker v1.12.x通过DNS或VIP方法内置负载平衡/路由。

所以我想通过服务名称或虚拟IP来访问我的服务如下

curl nodeapp:3000,而我得到curl: (6) Could not resolve host: nodeapp

curl 10.255.0.6:3000,而我得到curl: (7) Failed to connect to 10.255.0.6 port 3000: Connection timed out

请注意,我使用以下命令获取虚拟IP

docker service inspect --format {{.Endpoint.VirtualIPs}} nodeapp其中收益率为[{boq3g7s47w47q2ej56li9s3dw 10.255.0.6/16}]

为什么我无法使用VIP或服务名称访问我的服务,即使我可以使用localhost:3000访问它?

回答

1

this页:

默认情况下,当您创建连接到网络的服务,该群分配服务的VIP。 VIP根据服务名称映射到DNS别名。网络上的容器通过闲话共享服务的DNS映射,因此网络上的任何容器都可以通过服务名称访问该服务。

因此,似乎DNS解析只能在容器之间工作,而不是在主机上(至少默认情况下,我假设有一种方法可以在主机上配置DNS来解决这些服务)。

例如,创建一个服务运行的nginx:

docker service create \ 
    --replicas 3 \ 
    --name my-web \ 
    --network my-network \ 
    nginx 

查看服务:

$ docker service ps my-web 

NAME        IMAGE NODE DESIRED STATE CURRENT STATE    ERROR 
my-web.1.63s86gf6a0ms34mvboniev7bs nginx node1 Running  Running 58 seconds ago 
my-web.2.6b3q2qbjveo4zauc6xig7au10 nginx node2 Running  Running 58 seconds ago 
my-web.3.66u2hcrz0miqpc8h0y0f3v7aw nginx node3 Running  Running about a minute ago 

创建新的服务/容器:

$ docker service create \ 
    --name my-busybox \ 
    --network my-network \ 
    busybox \ 
    sleep 3000 

查看容器:

$ docker service ps my-busybox 

NAME         IMAGE NODE DESIRED STATE CURRENT STATE   ERROR 
my-busybox.1.1dok2cmx2mln5hbqve8ilnair busybox node1 Running  Running 5 seconds ago 

输入容器:

$ docker exec -it my-busybox.1.1dok2cmx2mln5hbqve8ilnair /bin/sh 

从容器内,可以解决nginx的服务:

$ nslookup my-web 

Server: 127.0.0.11 
Address 1: 127.0.0.11 

Name:  my-web 
Address 1: 10.0.9.2 ip-10-0-9-2.us-west-2.compute.internal 
+0

感谢@约翰。这有助于我理解这个问题。好,如果别人可以阐明如何使用单个ip或DNS从外部暴露群集,这与传统的负载平衡设置将如何执行相似,但没有静态链接任何工作节点(即在nginx配置文件中),同时考虑到我们可以随后发布docker服务规模和docker swarm连接命令,以扩展解决方案需要自动包含新节点的位置。这甚至可能吗? – Harindaka

+0

我不知道这是否会有所帮助https://github.com/vfarcic/docker-flow-proxy – Harindaka

+0

Docker swarm网络自动负载均衡服务的副本,关于“静态链接”,这正是dns的目的。在运行api和服务API之间有一个不同之处,你想在群集中做什么,它不是公开,而是发布它们。看看这个页面 - > https://docs.docker.com/docker-cloud/apps/ports/ – Dani

相关问题