【问题标题】:Exposed ports from docker container cannot able to access on host server by IP Address in RedHat 8来自 docker 容器的暴露端口无法通过 RedHat 8 中的 IP 地址访问主机服务器
【发布时间】:2021-06-07 02:59:41
【问题描述】:

我在 RedHat 8 中运行 docker 容器。在我的 docker 容器中,我暴露了端口 8080 以便从外部访问。我可以从其他服务器远程登录 8080,但我无法通过 IP 地址从主机服务器远程登录 8080。

[root@redhat1 biz]# cat docker-compose.yml 
version: '3'  
services:
  web:
    image: nginx:latest
    ports:
     - "8080:80"
    links:
     - php
  php:
    image: php:7-fpm

无法使用 IP 地址从主机服务器访问公开的端口 8080。它可以通过 localhost 或 127.0.0.1 远程登录 8080。

通过IP地址从其他服务器Telnet 8080是可以的。

【问题讨论】:

  • 你的 docker up 命令是什么?你能分享你的 Dockerfile(s) 或 Docker-compose 文件吗?
  • @Kwright02,我的 docker-compose 文件在第一张截图中。
  • 我不是从屏幕截图中阅读的,请在您的帖子中发布内容。
  • @Kwright02 添加。
  • 所以当你尝试访问 localhost:8080 时你没有得到响应?

标签: docker docker-compose redhat firewalld redhat-containers


【解决方案1】:

在 firewalld 上检查主机服务器的防火墙设置是否有 8080 端口传入。

您可能需要修改主机上的 iptables 规则以允许来自 Docker 容器的连接。像这样的东西可以解决问题:

iptables -A INPUT -i docker0 -j ACCEPT 这将允许从 Docker 容器访问主机上的任何端口。

iptables 规则是有序的,这个规则可能会也可能不会执行您想要执行的操作,具体取决于在此之前的其他规则。

您将只能访问正在监听的主机服务 INADDR_ANY 例如,0.0.0.0 或显式侦听 docker0 接口。

【讨论】:

    【解决方案2】:

    本地生成的数据包不通过 NAT PREROUTING,这是大多数“转发端口”(DNAT)实现添加规则的地方。这解释了为什么您尝试使用来自不同服务器的公共 IP 地址会起作用。

    可以通过使用 NAT OUTPUT 链使 localhost 案例工作。我希望 docker 也会为这种情况添加规则。

    例如docker 大概有这样的规则:

    # iptables -t nat -A OUTPUT -p tcp --dst 127.0.0.1 --dport 8080 -j REDIRECT --to-ports 80
    

    可能缺少的内容是与您的公共 IP 地址相匹配的类似规则。这是有问题的,因为该规则需要知道您的公共 IP。这或许可以解释为什么 docker 不生成此规则。

    # iptables -t nat -A OUTPUT -p tcp --dst a.b.c.d --dport 8080 -j DNAT --to-destination 127.0.0.1:80
    

    默认情况下,Firewalld 不会阻止 OUTPUT 数据包。除非您自己进行了更改,否则我认为这不太可能是原因。暂时禁用它是一种快速验证的方法。

    【讨论】:

      【解决方案3】:

      如果您遵循了@erig 的建议,或者它似乎不适用于您,问题可能是您的 OUTPUT 表上有一个默认的 DROP 策略,如下所示:

      -P OUTPUT DROP
      -A OUTPUT -o lo -j ACCEPT
      -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
      

      您可能将来自lo(环回)的数据包列入白名单, docker-proxy 服务必须转身并在br 接口之一上创建新连接。将此行附加到您的规则集中,看看它是否解决了问题:

      -A OUTPUT -o br+ -m comment --comment "reach internal docker containers" -j ACCEPT
      

      这确保代理服务守护进程可以连接到它们的后端。

      【讨论】:

        猜你喜欢
        • 2018-04-21
        • 1970-01-01
        • 2019-09-10
        • 1970-01-01
        • 2016-10-09
        • 2017-08-31
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        相关资源
        最近更新 更多