【问题标题】:Unable to discover docker containers无法发现 docker 容器
【发布时间】:2015-09-25 05:22:14
【问题描述】:

我正在关注本教程以进行服务发现http://jasonwilder.com/blog/2014/07/15/docker-service-discovery

简单地说:

我创建了一个运行在 x.y.z.d:4001 的 etcd 主机

docker run -d --name etcd -p 4001:4001 -p 7001:7001 coreos/etcd

在 backend_serverip:8000 和 docker-register 创建了一个运行容器的后端服务器

$ docker run -d -p 8000:8000 --name whoami -t jwilder/whoami
$ docker run --name docker-register -d -e HOST_IP=$(hostname --all-ip-addresses | awk '{print $1}') -e ETCD_HOST=x.y.z.d:4001 -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register

在 backend2_serverip:8000 和 docker-register 创建另一个运行容器的后端服务器

 $ docker run -d -p 8000:8000 --name whoami -t jwilder/whoami
 $ docker run --name docker-register -d -e HOST_IP=$(hostname --all-ip-addresses | awk '{print $1}') -e ETCD_HOST=x.y.z.d:4001 -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register

创建了一个运行 docker-discover 的客户端和一个 ubuntu 镜像

$ docker run -d --net host --name docker-discover -e ETCD_HOST=10.170.71.226:4001 -p 127.0.0.1:1936:1936 -t jwilder/docker-discover

当我查看日志以查看容器是否正在注册时,我看到以下错误

2015/07/09 19:28:00 error running notify command: python /tmp/register.py, exit status 1
2015/07/09 19:28:00 Traceback (most recent call last):
 File "/tmp/register.py", line 22, in <module>
backends = client.read("/backends")
 File "/usr/local/lib/python2.7/dist-packages/etcd/client.py", line 347, in read
self.key_endpoint + key, self._MGET, params=params, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/etcd/client.py", line 587, in api_execute
return self._handle_server_response(response)
  File "/usr/local/lib/python2.7/dist-packages/etcd/client.py", line 603, in _handle_ser
etcd.EtcdError.handle(**r)
  File "/usr/local/lib/python2.7/dist-packages/etcd/__init__.py", line 184, in handle
raise exc(msg, payload)
etcd.EtcdKeyNotFound: Key not found : /backends

我尝试手动创建此目录,我也尝试使用特权选项运行容器但没有运气

【问题讨论】:

    标签: docker registry service-discovery etcd


    【解决方案1】:

    您收到的错误来自bug in the code。问题是您的 etcd 目录中不存在 /backends。您可以通过运行以下命令手动创建它:

    curl -L http://127.0.0.1:4001/v2/keys/backends -XPUT -d dir=true
    

    一旦目录存在于 etcd 中,您将不会再收到错误。

    我创建了一个 pull request 来修复错误,如果你想使用修复的代码,你可以构建自己的图像:

    git clone git@github.com:rca/docker-register.git
    cd docker-register
    docker build -t docker-register .
    

    那么您的 docker register 命令将如下所示:

    $ docker run --name docker-register -d -e HOST_IP=$(hostname --all-ip-addresses | awk '{print $1}') -e ETCD_HOST=x.y.z.d:4001 -v /var/run/docker.sock:/var/run/docker.sock -t docker-register
    

    请注意,我只是从命令中的图像名称中删除了jwilder/,以便它使用您的本地版本。

    【讨论】:

    • 谢谢,帮了大忙!
    猜你喜欢
    • 2019-07-18
    • 2015-12-01
    • 2019-10-05
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多