尝试从Docker容器中访问etcd时获得“连接被拒绝”

时间:2015-10-14 19:38:36

标签: networking 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

因此从容器路由到主机时似乎有一些错误。但我无法弄清楚它是什么。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分: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

从任何可以到达该服务器的机器上运行。

答案 1 :(得分:1)

事实证明,etcd只是在该机器上监听localhost:4001,这就是为什么我无法从容器内访问它。尽管我将其中一个监听客户端网址配置为0.0.0.0:4001

事实证明我运行sudo systemctl enable etcd2,导致它在cloud-config服务运行之前运行。因此,etcd以默认配置启动,而不是我在云配置中指定的配置。正在运行sudo systemctl disable etcd2解决了问题。