Smtp 在弹性Beanstalk Docker容器上运行非www内容

Smtp 在弹性Beanstalk Docker容器上运行非www内容,smtp,docker,amazon-elastic-beanstalk,Smtp,Docker,Amazon Elastic Beanstalk,我想在Elastic Beanstalk中的Docker容器上运行SMTP服务器,因此在我的Dockerfile中我公开了端口25(没有其他端口) 我还编辑了beanstalk负载平衡器(使用EC2 web admin)并向其添加了端口25: | LB Protocol | LB Port | Instance Protocol | Instance Port | SSL | | TCP | 25 | TCP | 25

我想在Elastic Beanstalk中的Docker容器上运行SMTP服务器,因此在我的Dockerfile中我公开了端口25(没有其他端口)

我还编辑了beanstalk负载平衡器(使用EC2 web admin)并向其添加了端口25:

| LB Protocol | LB Port | Instance Protocol | Instance Port | SSL |
|    TCP      |   25    |        TCP        |        25     | N/A |
....
并编辑实例的安全组,以允许端口25的入站TCP流量(允许所有位置能够直接连接到实例)

但似乎不起作用。如果我在Virtualbox中使用相同的Dockerfile(使用选项
-p 25:25
),我可以通过主机连接到端口25,SMTP服务器正在侦听。如果使用前面提到的配置在Elastic Beanstalk中运行容器,则既不能使用负载平衡器也不能直接使用EC2实例连接到端口25


知道我做错了什么吗?

建议您使用elasticbeanstalk eExtensions来编辑负载平衡器配置,而不是直接从EC2 web admin编辑负载平衡器配置,因为即使自动缩放组中的EC2实例被替换,这些更改也会持续存在于您的环境中

你能试试下面的吗? 在应用程序源中名为
.ebextensions
的文件夹中创建一个文件“01 elb.config”,包含以下内容:

option_settings:
    - namespace: aws:cloudformation:template:parameter
      option_name: InstancePort
      value: 25

Resources:
    AWSEBLoadBalancer:
        Type: AWS::ElasticLoadBalancing::LoadBalancer
        Properties:
            Listeners:
                - InstancePort: 25
                  LoadBalancerPort: 80
                  Protocol: TCP
                - InstancePort: 25
                  LoadBalancerPort: 25
                  Protocol: TCP
            AvailabilityZones:
                - us-west-2a
                  us-west-2b
                  us-west-2c
            HealthCheck:
                Timeout: 5
                Target: TCP:25
                Interval: 30
                HealthyThreshold: 3
                UnhealthyThreshold: 5
该文件为YAML格式,因此缩进非常重要。 选项设置('aws:cloudformation:template:parameter','InstancePort')将实例端口设置为25,并修改安全组以确保负载平衡器可以访问端口25

此文件正在覆盖由Elastic Beanstalk创建的默认负载平衡器资源,其中两个侦听器的实例端口都设置为25。希望有帮助

阅读有关使用eExtensions自定义环境的更多信息。
能否尝试使用appsource目录中的
.ebextensions/01 elb.config
文件中的上述文件创建新环境?如果您遇到任何问题,请告诉我。

即使配置让我更进一步,并且应用程序现在正在运行(我将实例端口更改为2555,但似乎25已被sendmail占用),端口似乎处理无效。如果我登录到该实例,我可以看到我的docker容器正在运行,但它可以从看似随机的端口(0.0.0.0:12472->2555/tcp)访问,我甚至可以从外部连接到这个12472(如果我修改安全组)但不是2555。重新启动应用程序或上载新版本会将实例端口从12472更改为其他端口。Docker前面的Nginx似乎知道此端口,但出于某种原因将其视为HTTP,而不是。问题似乎是Nginx作为Docker前面的反向代理,只能代理HTTP:S
option_settings:
    - namespace: aws:cloudformation:template:parameter
      option_name: InstancePort
      value: 25

Resources:
    AWSEBLoadBalancer:
        Type: AWS::ElasticLoadBalancing::LoadBalancer
        Properties:
            Listeners:
                - InstancePort: 25
                  LoadBalancerPort: 80
                  Protocol: TCP
                - InstancePort: 25
                  LoadBalancerPort: 25
                  Protocol: TCP
            AvailabilityZones:
                - us-west-2a
                  us-west-2b
                  us-west-2c
            HealthCheck:
                Timeout: 5
                Target: TCP:25
                Interval: 30
                HealthyThreshold: 3
                UnhealthyThreshold: 5