![](/img/trans.png)
[英]Embedded Tomcat won't listen to port 80 in AWS Elastic Beanstalk
[英]Port forwarding in when running a Tomcat Docker in an AWS Elastic Beanstalk application
我在AWS Elastic Beanstalk (EB)的docker容器内运行了Tomcat 7.0 webapp(我在此处遵循了教程)。
当我浏览到我的EB网址myapplication.elasticbeanstalk.com时 ,我得到了nginx提供的502 Bad Gateway
。 因此,很明显我的端口80没有转发到我的容器。 当我浏览至myapplication.elasticbeanstalk.com:8888 (我在Dockerfile中公开的另一个端口)时,连接被拒绝( ERR_CONNECTION_REFUSED
)。 因此,我通过SSH进入AWS实例并检查了docker日志,这表明我的Tomcat服务器已成功启动,但显然未处理任何请求。
有人知道我的端口8888似乎没有转发到我的容器吗?
执行命令(在AWS实例上):
sudo docker ps -a
得到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c353e236da7a aws_beanstalk/current-app:latest "catalina.sh run" 28 minutes ago Up 13 minutes 80/tcp, 8080/tcp, 8888/tcp sharp_leakey
其中显示端口80、8080和8888在docker容器上处于打开状态。
我的Dockerfile非常简单:
FROM tomcat:7.0
EXPOSE 8080
EXPOSE 8888
EXPOSE 80
而我的Dockerrun.aws.json文件是:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "myusername/mycontainer-repo"
},
"Authentication": {
"Bucket": "mybucket",
"Key": "docker/.dockercfg"
},
"Ports": [
{
"ContainerPort": "8888"
}
]
}
有人看到我可能会出问题的地方吗? 我什至不知道在哪里看。
另外,我的实例的AWS安全组在端口80、8080和8888上打开。任何建议将不胜感激! 我在这里茫然。
更新1:
小更新,尽管我仍然遇到麻烦。 SSH进入我的AWS EB实例后,我检查了Docker容器以获取该容器的IP:
sudo docker inspect c353e236da7a
这给了我IP为172.17.0.6
。
然后,再次从AWS实例运行一个curl
命令:
curl 172.17.0.6:8080/homepage
哪个有效,并返回首页的HTML! 但是, curl 172.17.0.6:8888/homepage
无法正常工作(因此,我不确定Dockerrun.aws.json
文件中的"ContainerPort" : "8888"
含义)。
但是,我仍然有一个问题,为什么我的:8080
请求没有转发到容器Tomcat Web服务器? 如上所述, myapplication.elasticbeanstalk.com : ERR_CONNECTION_REFUSED
仍然收到连接被拒绝( ERR_CONNECTION_REFUSED
)。
myapplication.elasticbeanstalk.com
是负载平衡器,而不是您的实例。 Elastic beantalk将启动负载平衡器以自动扩展实例。 因此,当您连接到myapplication.elasticbeanstalk.com:8888
您实际上是在连接仅打开端口80的实例。 然后,负载平衡器将流量转发到侦听端口8080的实例。
您应该只使用不带端口的URL即可访问您的Web应用程序: myapplication.elasticbeanstalk.com
这样做不起作用的原因是因为您告诉docker容器使用端口8080,但告诉Beanstalk转发到端口8888。当然,所有端口都是开放的,但是tomcat仅在端口8080上运行。
dockerrun.aws.json
的ports部分不会告诉您的应用程序要在哪个端口上运行,而是告诉负载均衡器将哪个端口转发至该端口。
端口–(在指定Image键时需要)列出要在Docker容器上公开的端口。 AWS Elastic Beanstalk使用ContainerPort值将Docker容器连接到主机上运行的反向代理。
您可以指定多个容器端口,但是AWS Elastic Beanstalk仅使用第一个将容器连接到主机的反向代理并路由来自公共互联网的请求。
如这里所见。
或者,换句话说,您告诉beantalk转发到的8888正常运行,但是您的应用程序实际上在端口8080上运行。您应该更改dockerrun.aws.json来使用端口8080
。
我是通过修复nginx的监听端口来完成的。 因此,您必须将.ebextensions目录添加到应用程序的根目录中,并将配置文件放在此处(在我的示例中为00-bypass-nginx-proxy.config):
files:
"/tmp/change_nginx_port.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/sh
# change listen port from 80 to 8761
sed -i '7s/.*/ listen 8761;/' /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf
# restart nginx
service nginx restart
container_commands:
00setup-nginx:
command: "/tmp/change_nginx_port.sh"
您的服务现在将在端口8761上可用。请注意脚本的sed
部分,其中存在硬编码的行号,该行号可能会因环境而异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.