我正在尝试在 AWS Elastic Beanstalk 上部署一个监听端口 25565 的 Dockerized 服务器(实际上是 Minecraft/Forge 服务器)。我想要使用的配置是一个简单的单容器 docker 配置。
我在我的桌面上本地测试了 Docker 镜像并且它可以按预期运行(Minecraft 客户端可以连接到它)。
我可以看到 AWS EB 环境已正确启动(绿色),并且我的服务器日志表明它已正确启动。启动环境时,我看到为其创建了一个新的安全组。我去编辑它以打开 25565 TCP 和 UDP 端口,允许从任何地方进行连接。
但是,无论我做什么,从互联网到分配的弹性 IP 的所有连接都会被拒绝 - 从 minecract 客户端和愚蠢的 netcat 命令行进行了测试。
我尝试使用和不使用代理重新部署环境,结果相同。
我错过了什么?
答案1
已修复。自己回答,以供将来参考。
存在两个基本问题:
- EB 真的 (真的吗!) 希望从公共互联网获取端口 80 上的连接。在部署时,它会为环境创建一个新的安全组,该组会打开端口 80。由于问题 #2,编辑该组以打开更多端口无济于事。
- 单实例 docker 环境的默认配置将使用 nginx 作为反向代理进行部署,将实例的端口 80 映射到 Dockerrun.aws.json 中配置为 HostPort 的任何端口(如果未定义 HostPort,则映射到 ContainerPort)。这对于 Minecraft 客户端/服务器连接来说是一个问题,因为 nginx 本质上是一个 Web 服务器,而客户端发送的数据包不是有效的 HTTP 请求。
因此,解决方案是:
- 让客户端连接到端口 80,并将其指定为IP地址:80
- 从配置中删除 nginx。最简单的方法是通过 Web UI:启动 EB 环境后,单击“配置”链接,然后单击“软件”部分中的“修改”按钮;从顶部的“代理服务器”下拉菜单中选择“无”,然后单击“应用配置”按钮。环境将重新部署,但端口 80 通过 iptables 直接映射到 docker 容器,中间没有反向代理。