2017-07-08 66 views
0

我在我的服務中有一個HTTP健康檢查,公開在localhost:35000/health上。目前它總是返回200 OK。對健康檢查的配置是通過HTTP API編程方式,而不是一種服務的配置,但在本質上,它是:Mac容器託管網絡的Docker - 領事健康檢查連接被拒絕

set id: service-id 
set name: health check 
set notes: consul does a GET to '/health' every 30 seconds 
set http: http://127.0.0.1:35000/health 
set interval: 30s 

當我直接在我的主機上運行的開發模式(consul agent -dev -ui)領事健康檢查通過沒有任何問題。然而,當我在泊塢窗容器中運行領事,健康檢查與失敗:

2017/07/08 09:33:28 [WARN] agent: http request failed 'http://127.0.0.1:35000/health': Get http://127.0.0.1:35000/health: dial tcp 127.0.0.1:35000: getsockopt: connection refused 

泊塢窗容器啓動領事,據我所知,在exaclty相同的狀態主機版本:

version: '2' 
services: 
    consul-dev: 
    image: "consul:latest" 
    container_name: "net-sci_discovery-service_consul-dev" 
    hostname: "consul-dev" 
    ports: 
     - "8400:8400" 
     - "8500:8500" 
     - "8600:8600" 
    volumes: 
     - ./etc/consul.d:/etc/consul.d 
    command: "agent -dev -ui -client=0.0.0.0 -config-dir=/etc/consul.d" 

我猜問題是,領事正試圖對容器回送接口執行GET請求,而不是我打算的,這是主機的回送接口。這是一個正確的假設嗎?更重要的是,我需要做些什麼來糾正問題?

回答

0

因此,發現在macOS的某些早期版本中存在一個阻止使用docker0網絡的錯誤。雖然該bug在較新版本中得到修復,但Docker支持擴展到較舊版本,因此Docker for Mac目前不支持docker0。詳情請參閱this discussion

解決方法是爲主機上的回送接口創建別名,將該服務設置爲偵聽該別名或0.0.0.0,並配置Consul將健康檢查GET請求發送到別名。

設置別名(選擇一個不是被用於其他任何的私有IP地址,我選擇了一個A類地址,但是這無關緊要):

sudo ifconfig lo0 alias 10.200.10.1/24 

要刪除別名:

sudo ifconfig lo0 -alias 10.200.10.1 

從上面的服務定義,HTTP線現在應該爲:

set http: http://10.200.10.1:35000/health 

而且偵聽健康檢查請求的HTTP服務器還需要監聽10.200.10.20.0.0.0。後面的選項是在討論中提出的,但我只用別名嘗試過。

我已經更新了問題的標題,以更準確地反映問題,現在我知道解決方案。希望它也能幫助其他人。