【问题标题】:Getting "connection refused" when trying to access etcd from within a Docker container尝试从 Docker 容器中访问 etcd 时出现“连接被拒绝”
【发布时间】:2016-01-13 01:27:30
【问题描述】:

我正在尝试从正在运行的 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

所以从容器路由到主机时似乎出现了一些错误。但我无法弄清楚它是什么。谁能指出我正确的方向?

【问题讨论】:

  • 您确定 etcd 正在侦听该 IP 吗? 172.17.42.1 看起来像 docker0 ip。使用ss -l 列出打开的服务器套接字。我猜 etcd 正在监听不同的 IP。
  • 嗯,你是对的。 Etcd 只收听127.0.0.1:4001,即使我的配置中有0.0.0.0:4001。我不知道为什么它不尊重这一点。

标签: networking docker etcd


【解决方案1】:

原来 etcd 只在那台机器上监听 localhost:4001,这就是为什么我无法从容器内访问它。尽管我将侦听客户端 URL 之一配置为 0.0.0.0:4001

原来我运行了sudo systemctl enable etcd2,这导致它在云配置服务运行之前运行。因此,etcd 从默认配置开始,而不是我在云配置中指定的配置。运行 sudo systemctl disable etcd2 解决了这个问题。

【讨论】:

    【解决方案2】:

    我发现我必须使用 --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
    

    从任何可以访问该服务器的机器上运行。

    【讨论】:

    • 对此赞不绝口。希望这是在 docker 中运行 etcd 所必需的。谢谢。
    猜你喜欢
    • 2019-10-20
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多