2017-04-16 102 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

相關問題