AWS ElasticBeanstalk 上的 Docker:“host.docker.internal:host-gateway”:连接被拒绝。 iptables 问题?

Posted

技术标签:

【中文标题】AWS ElasticBeanstalk 上的 Docker:“host.docker.internal:host-gateway”:连接被拒绝。 iptables 问题?【英文标题】:Docker on AWS ElasticBeanstalk: "host.docker.internal: host-gateway": Connection refused. Iptables issue? 【发布时间】:2021-09-18 11:29:02 【问题描述】:

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

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

This is normally possible by just adding extra_hosts: "host.docker.internal:host-gateway" to that container and then using host.docker.internal instead of localhost inside the container,即host.docker.internal:55113。我之前在 Debian 上成功使用过。

但是这在 AWS ElasticBeanstalk 上不起作用,连接被拒绝。

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


AWS ElasticBeanstalk 平台:

Docker running on 64bit Amazon Linux 2/3.4.2

主机的 Docker 和 Docker-Compose 版本:

$ 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      -

【问题讨论】:

目前,我刚刚切换到network_mode: host。我仍然可以访问其他容器(例如localhost:9100)并可以访问主机上运行的进程(例如localhost:55113)。我失去了隔离,但我想这在 ElasticBeanstalk 上并不重要。另外,请注意 network_mode: host doesn't work on mac... 所以我创建了另一个 docker-compose.mac.yml 用于在 dev 中运行项目,它使用经典的桥接网络和 host.docker.internal 与主机通信。 您解决了这个问题吗?我在 ElasticBeanstalk 中使用 -add-host=host.docker.internal:host-gateway 时遇到了类似的问题。我可以使用 network_mode: host like you but that has other questions. @mikethe no 我仍在使用network_mode: host,如上述评论中所述。老实说,我没有深入研究它,因为它适用于我的用例。可能有一个更清洁的解决方案需要修改 iptables,但我没有足够的专业知识。 【参考方案1】:

我是这个领域的新手。

您的日志显示您的端口正在侦听本地主机 (127.0.0.1:56113) 而不是所有 IP (例如 0.0.0.0:8080)。

在我的情况下,主机上的端口转发规则必须修改为-L0.0.0.0:&lt;lport&gt;:&lt;ip&gt;:&lt;rport&gt;

【讨论】:

以上是关于AWS ElasticBeanstalk 上的 Docker:“host.docker.internal:host-gateway”:连接被拒绝。 iptables 问题?的主要内容,如果未能解决你的问题,请参考以下文章

带有 ALB 和 Socket.IO 的 AWS ElasticBeanstalk 上的 HTTP 400 错误

AWS ElasticBeanstalk 上的 Laravel 应用程序未连接到 RDS 数据库

AWS ElasticBeanStalk 上的解析服务器不会将 .mp4 PFFile 流式传输到 AVPlayer?

jac(jinja-assets-compressor)在 AWS elasticbeanstalk 上的烧瓶应用程序中不起作用

强制 https aws elasticbeanstalk

替换 AWS Elastic BeanStalk 上的特定实例?