尝试访问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 

我有四个其他主机,这工作正常,但在这台机器上的每个容器都有这个问题。 我真的不知道发生了什么,我不知道如何debugging它。

我的etcd环境variables是

 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 

所以当从容器路由到主机时似乎有一些错误。 但我无法弄清楚它是什么。 任何人都可以指向正确的方向吗?

我观察到我必须使用–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 

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

事实certificate,etcd只在本机上监听localhost:4001 ,这就是为什么我无法从容器中访问它。 这是尽pipe我configuration其中一个监听客户端url为0.0.0.0:4001

事实certificate,我运行了sudo systemctl enable etcd2 ,导致它在运行cloud-config服务之前运行。 因此,etcd以默认configuration开始,而不是我在云configuration中指定的configuration。 运行sudo systemctl disable etcd2修复了这个问题。