为什么我不能通过名称或VIP访问Docker Swarm中的服务?

时间:2017-04-16 17:48:11

标签: docker dns load-balancing docker-swarm docker-swarm-mode

所以我在Ubuntu主机上运行了一个docker引擎(版本1.12.6,build 78d1802)。

我使用

创建了一个群
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 个答案:

答案 0 :(得分:2)

来自this页面:

  

默认情况下,当您创建连接到网络的服务时,swarm会为服务分配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