簡體   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