当前位置: 首页 > 知识库问答 >
问题:

AWS ElasticBeanstalk上的Docker:“host.Docker.internal:主机网关”:连接被拒绝。Iptables问题?

曾山
2023-03-14

所以我有一个在AWS ElasticBeanstalk(最新的Docker平台)上运行的多容器项目。

这些容器共享相同的网桥网络,因为它们需要能够彼此通信(端口3000、8080、9090、9100)。但其中一个容器也需要能够与主机通信(端口55113、56113)。

通常,只需将额外的_hosts:“host.docker.internal:host gateway”添加到该容器中,然后使用主机即可。码头工人。容器内部的而不是localhost,即host。码头工人。内部:55113。我以前在Debian上成功地使用过它。

但这对AWS ElasticBeanstalk不起作用,连接被拒绝。

我做错什么了吗?有什么解决办法吗?

AWS ElasticBeanstalk平台:

Docker running on 64bit Amazon Linux 2/3.4.2

主机的Docker

$ sudo docker --version

Docker version 20.10.4, build d3cb89e

$ sudo docker-compose --version

docker-compose version 1.29.2, build unknown

项目docker-compose.yml:(仅显示相关部分)

version: "3.9"

services:
  prometheus:
    image: prom/prometheus:v2.28.1
    container_name: prometheus
    ports:
      - 9090:9090
    extra_hosts:
      - host.docker.internal:host-gateway # <-------- EXTRA HOST

networks:
  default:
    name: monitoring

容器调试:

$ sudo docker exec -it prometheus cat /etc/hosts

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.1  host.docker.internal # <-------- the mapping is present
172.25.0.4  f01ffc6b2a8a

$ sudo docker exec -it prometheus wget host.docker.internal

Connecting to host.docker.internal (172.17.0.1:80)
wget: can't connect to remote host (172.17.0.1): Connection refused

$ sudo docker exec -it prometheus wget host.docker.internal:55113  # <-------- the port I want to reach

Connecting to host.docker.internal:55113 (172.17.0.1:55113)
wget: can't connect to remote host (172.17.0.1): Connection refused

主机的iptables(由AWS和/或Docker配置,我没有编辑):

$ sudo iptables -S

-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o br-a8a58f19c627 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-a8a58f19c627 -j DOCKER
-A FORWARD -i br-a8a58f19c627 ! -o br-a8a58f19c627 -j ACCEPT
-A FORWARD -i br-a8a58f19c627 -o br-a8a58f19c627 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.25.0.2/32 ! -i br-a8a58f19c627 -o br-a8a58f19c627 -p tcp -m tcp --dport 8080 -j ACCEPT
-A DOCKER -d 172.25.0.3/32 ! -i br-a8a58f19c627 -o br-a8a58f19c627 -p tcp -m tcp --dport 9100 -j ACCEPT
-A DOCKER -d 172.25.0.4/32 ! -i br-a8a58f19c627 -o br-a8a58f19c627 -p tcp -m tcp --dport 9090 -j ACCEPT
-A DOCKER -d 172.25.0.5/32 ! -i br-a8a58f19c627 -o br-a8a58f19c627 -p tcp -m tcp --dport 3000 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i br-a8a58f19c627 ! -o br-a8a58f19c627 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o br-a8a58f19c627 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

主机的开放端口:

$ netstat -tuplen

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 0.0.0.0:9090            0.0.0.0:*               LISTEN      0          200315     -
tcp        0      0 127.0.0.1:55113         0.0.0.0:*               LISTEN      1000       119886     -
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      0          200280     -
tcp        0      0 127.0.0.1:22221         0.0.0.0:*               LISTEN      1001       197452     -
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      0          14121      -
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      0          201081     -
tcp        0      0 127.0.0.1:56113         0.0.0.0:*               LISTEN      1000       119890     -
tcp        0      0 127.0.0.1:38581         0.0.0.0:*               LISTEN      0          20325      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          18585      -
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      0          201164     -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      0          16235      -
tcp6       0      0 ::1:55113               :::*                    LISTEN      1000       119885     -
tcp6       0      0 :::111                  :::*                    LISTEN      0          14124      -
tcp6       0      0 ::1:56113               :::*                    LISTEN      1000       119889     -
tcp6       0      0 :::22                   :::*                    LISTEN      0          18594      -
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          15762      -
udp        0      0 0.0.0.0:111             0.0.0.0:*                           0          14119      -
udp        0      0 127.0.0.1:323           0.0.0.0:*                           0          14990      -
udp        0      0 0.0.0.0:979             0.0.0.0:*                           0          14120      -
udp6       0      0 fe80::ed:19ff:fe84::546 :::*                                0          16539      -
udp6       0      0 :::111                  :::*                                0          14122      -
udp6       0      0 ::1:323                 :::*                                0          14991      -
udp6       0      0 :::979                  :::*                                0          14123      -

共有1个答案

祁嘉言
2023-03-14

我是这个领域的新手。

您的日志显示您的端口正在监听localhost(127.0.0.1:56113)而不是所有IP(例如0.0.0.0:8080)。

在我的情况下,主机上的端口转发规则必须修改为-L0。0.0.0:

 类似资料:
  • 问题内容: 我正在尝试学习RMI编码,当我运行RMI的服务器端时,连接被拒绝。这是我服务器的主要方法 我相信实现代码无关紧要,因为它只是运行代码的已实现接口。我得到的例外是这个 我究竟做错了什么?客户端和服务器端都将在我的笔记本电脑上运行,因为这只是一个练习。我是否缺少代码或代码有问题?除了给我答案外,请解释为什么会这样,因为我不仅想让它起作用,而是在尝试学习。 **编辑我发现了为什么我的代码无法

  • 我试图在PHP中对本地主机执行一个cURL请求,但出现以下错误: CURL错误(7):连接到8000localhost端口失败:连接被拒绝 我试图用谷歌搜索这条信息,也在StackOverflow上找到了类似的问题,但似乎没有任何效果。 卷曲php: test.php: 如果删除“CURLOPT_IPRESOLVE”值,请求将永远不会解析。我还尝试将“CURLOPT_SSL_VERIFYPEER”

  • 我已经设置了Flurl在我的Xamarin PCL中运行,并且我正在调用我在MVC应用程序中运行的Web Api。 似乎 Flurl 可以毫无问题地击中我部署的 API,但由于某种原因我无法在本地测试更改。 我现在做的是: 我也尝试过一个简单的GetAsync(),但再次失败。 任何帮助都将不胜感激。 编辑: 为了了解更多信息,该项目是Ionic移动应用程序的重新开发。我已经在本地运行了ionic

  • 问题内容: 我正在尝试通过代码访问Redis服务器,但未连接。但是,如果我猛击redis容器,我可以访问redis-cli。 docker-compose.yml看起来像这样 Dockerfile_redis 当我尝试使用此代码连接到Redis服务器时 它发出此警告 有谁知道如何将Redis容器连接到PHP容器? 问题答案: 你的问题 Docker Compose 为不同的服务创建了单独的dock

  • 我试图让一个本地kubernetes集群与Minikube和Istio一起运行。我遵循了istio文档中的说明:https://istio.io/docs/tasks/installing-istio.html 然后,我按照以下步骤在此处安装示例BookInfo示例:https://istio.io/docs/samples/bookinfo.html 然而,当我尝试卷曲网关URL时,我得到了一个

  • 问题内容: 我在使用Java rmi时遇到问题: 当我尝试运行服务器时,出现了connectException(请参见下文)。 执行rebind方法时发生异常: 当改用rmi:// localhost:2020 / RemoteDataPointHandler时,它也不起作用。另外,使用默认端口不起作用。我也尝试使用127.0.0.1 ip地址,但效果相同。 我的运行时参数: 问题答案: 当我更换