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

Why Can't I Access Service in Docker Swarm by its Name or VIP?

所以我在 Ubuntu 主机中有一个 docker 引擎(版本 1.12.6,内部版本 78d1802)运行。

我使用

创建了一个 swarm
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 访问它?

来自 this 页:

By default, when you create a service attached to a network, the swarm assigns the service a VIP. The VIP maps to a DNS alias based upon the service name. Containers on the network share DNS mappings for the service via gossip so any container on the network can access the service via its service name.

看来 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

新建 service/container:

$ 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