2015-10-14 1320 views
1

我試圖從正在運行的Docker容器中訪問etcd。當我運行嘗試訪問Docker容器內的etcd時出現「連接被拒絕」

curl http://172.17.42.1:4001/v2/keys 

我得到

curl: (7) Failed to connect to 172.17.42.1 port 4001: Connection refused 

我還有其他四臺主機,其中能正常工作,但這種機器上的每個容器有這個問題。對於發生了什麼,我真的很茫然,我不知道如何去調試它。

我ETCD環境變量

ETCD_ADVERTISE_CLIENT_URLS=http://10.242.10.2:2379 
ETCD_DISCOVERY=https://discovery.etcd.io/<token_removed> 
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.242.10.2:2380 
ETCD_LISTEN_CLIENT_URLS=http://10.242.10.2:2379,http://127.0.0.1:2379,http://0.0.0.0:4001 
ETCD_LISTEN_PEER_URLS=http://10.242.10.2:2380 

我還可以訪問ETCD從主機與

curl http://localhost:4001/v2/keys 

所以似乎有從容器路由出去到主機時一定誤差。但我無法弄清楚它是什麼。任何人都可以將我指向正確的方向嗎?

+0

你確定etcd正在監聽IP嗎? '172.17.42.1'看起來像docker0 ip。使用'ss -l'列出打開的服務器套接字。我猜想etcd正在傾聽不同的IP。 – ZeissS

+0

嗯,你是對的。 Etcd只在'127.0.0.1:4001'上監聽,即使我在我的配置中有'0.0.0.0:4001'。我不確定它爲什麼不尊重這一點。 –

回答

1

原來etcd只在該機器上監聽localhost:4001,這就是爲什麼我無法從容器內訪問它。儘管我將其中一個監聽客戶端網址配置爲0.0.0.0:4001

事實證明,我運行了sudo systemctl enable etcd2,導致它在運行cloud-config服務之前運行。因此,etcd以默認配置開始,而不是我在我的雲配置中指定的配置。運行sudo systemctl disable etcd2修復了此問題。

5

我觀察到我不得不使用--advertise-client-urls和--listen-client-urls。像這樣:

./etcd --advertise-client-urls 'http://0.0.0.0:2379,http://0.0.0.0:4001' --listen-client-urls 'http://0.0.0.0:2379,http://0.0.0.0:4001' 

然後,我是能夠成功地做到

curl -L http://hostname:2379/version 

從可能到達該服務器的機器,它的工作。

+0

不能滿足這個要求。希望這被指出在Docker中運行etcd需要。謝謝。 – barefootsanders

相關問題