3

所以我有一个在 Ubuntu 主机上运行的 docker 引擎(版本 1.12.6,构建 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我得到了预期的正确响应,并且到目前为止一切正常。

该文档和我提到的许多其他文档似乎表明 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 访问它?

4

1 回答 1

2

这个页面:

默认情况下,当您创建连接到网络的服务时,swarm 会为该服务分配一个 VIP。VIP 根据服务名称映射到 DNS 别名。网络上的容器通过 gossip 共享服务的 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
于 2017-04-16T18:04:33.593 回答