Docker无法访问容器外部端口

4

我正在本地主机上使用端口2181运行zookeeper(而不是通过docker)。

同时,尝试通过以下方式在docker compose中运行docker镜像。

#
  # Mesos
  #
  mesos-master:
    image: mesosphere/mesos-master:1.0.3
    restart: always
    privileged: true
    network_mode: host
    volumes:
      - ~/mesos-data/master:/tmp/mesos
    environment:
      MESOS_CLUSTER: "mesos-cluster"
      MESOS_QUORUM: "1"
      MESOS_ZK: "zk://localhost:2181/mesos"
      MESOS_PORT: 5000
      MESOS_REGISTRY_FETCH_TIMEOUT: "2mins"
      MESOS_EXECUTOR_REGISTRATION_TIMEOUT: "2mins"
      MESOS_LOGGING_LEVEL: INFO
      MESOS_INITIALIZE_DRIVER_LOGGING: "false"

ZooKeeper正在监听2181端口,但是我的Docker进程仍无法连接到ZooKeeper的2181端口。

是否还有什么遗漏的地方?

谢谢。


尝试在compose文件中添加hostname: 127.0.0.1 - yamenk
zk 是否也在 network_mode: host 下运行?另外,请尝试使用 127.0.0.1 而不是 localhost - Tarun Lalwani
ZK是一个正常的进程,而不是作为Docker运行。 - user1578872
1个回答

11

你正在容器内指向localhost。这意味着你的Docker容器尝试在特定端口上连接到容器本身(localhost),而不是服务器的本地主机。你需要指定一个特定的IP地址来连接,或者可以使用--net="host"选项运行Docker容器。

$ docker run -d --net="host" ...

这将在宿主机网络中创建您的容器,而不是默认的桥接网络。

例如:我创建了一个apache容器(默认),并映射主机上端口为127.0.0.1:80。因此,在我的服务器上,我可以使用curl命令访问127.0.0.1:80

$ docker run -d -p 80:80 httpd

curl 127.0.0.1:80 可以在本地运行:

$ curl localhost:80
<html><body><h1>It works!</h1></body></html>

如果我启动了一个带有curl安装的辅助容器,我将在其中使用curl访问127.0.0.1:80:

    $ docker run --rm tutum/curl /bin/bash -c 'curl 127.0.0.1:80'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

因为容器在默认桥接网络中,并试图在80端口上向自身进行curl,所以连接被拒绝。

现在我在host网络内启动容器:

$ docker run --net=host --rm tutum/curl /bin/bash -c 'curl 127.0.0.1:80'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   8573      0 --:--:-- --:--:-- --:--:-- 22500
<html><body><h1>It works!</h1></body></html>

--net=host 在你的 docker-compose 文件中的翻译意思是你需要加入 network_mode: host


我已经在我的Docker Compose中添加了network_mode: host。另外,ZK是一个普通的进程而不是作为Docker运行。 - user1578872
@user1578872,您能否从您的服务器使用curl命令访问localhost:2181,以检查Zookeeper是否可访问并正常工作?之后,请尝试从部署在主机网络上的容器内部执行相同的操作。 - lvthillo
它在我的主机上运行,但在部署在主机网络中的容器内部不起作用。不确定还需要添加什么。 - user1578872
Docker inspect container-id 的输出是什么?请检查 Networks 部分。对于 "Bridge",它应该为空:"",而对于 "host": {} 部分应该有配置。 - lvthillo
我还发现他们添加了MESOS_IP=127.0.0.1MESOS_HOSTNAME=localhost作为环境变量。此外,你正在使用Docker而不是Toolbox、Docker Machine或其他工具。 - lvthillo
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接