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:<lport>:<ip>:<rport>
。
【讨论】:
以上是关于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 上的烧瓶应用程序中不起作用