繁体   English   中英

在AWS Elastic Beanstalk应用程序中运行Tomcat Docker时进行端口转发

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM