所以我在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访问它?
答案 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