使用 EBS 部署多容器 docker 环境(flask 和 nginx)

Posted

技术标签:

【中文标题】使用 EBS 部署多容器 docker 环境(flask 和 nginx)【英文标题】:Deploying multicontainer docker environment (flask & nginx) with EBS 【发布时间】:2017-03-23 14:56:39 【问题描述】:

以下代码在使用 docker-compose 在本地运行时有效。但是,当我将 Flask 和 nginx 容器推送到 ECS 并尝试从 Elastic Beanstalk 启动此应用程序时,引用我的 Dockerrun.aws.json 文件中的容器,如下所示,我无法无错误地启动我的应用程序。有谁知道如何格式化 Dockerrun.aws.json 文件?或者,问题出在其他地方吗?谢谢!

nginx/default.conf

server 

    listen 80;
    server_name example.org;
    charset utf-8;

    location /static 
        alias /usr/src/app/static;
    

    location / 
        proxy_pass http://web:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    

nginx/Dockerfile

FROM nginx

RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.old
COPY default.conf /etc/nginx/conf.d/default.conf

web/app.py

from flask import Flask


app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

网络/Dockerfile

FROM python:3.5-onbuild

RUN apt-get update
RUN apt-get -y install python3
RUN apt-get -y install python3-pip
RUN apt-get -y install python3-dev
RUN pip3 install flask

Dockerrun.aws.json


    "AWSEBDockerrunVersion": 2,
    "volumes": [
        
            "name": "UsrSrcAppStatic",
            "host": 
                "sourcePath": "/usr/src/app/static"
            
        ,
        
            "name": "WwwStatic",
            "host": 
                "sourcePath": "/www/static"
            
        
    ],
    "containerDefinitions": [
        
            "name": "web",
            "image": "############.dkr.ecr.us-east-1.amazonaws.com/app_web",
            "essential": true,
            "memory": 4096,
            "command": [
                "/usr/local/bin/gunicorn",
                "-w",
                "2",
                "-b",
                ":8000",
                "app:app"
            ],
            "mountPoints": [
                
                    "containerPath": "/usr/src/app/static",
                    "sourceVolume": "UsrSrcAppStatic"
                
            ]
        ,
        
            "name": "nginx",
            "image": "############.dkr.ecr.us-east-1.amazonaws.com/app_nginx",
            "essential": true,
            "portMappings": [
                
                    "hostPort": 80,
                    "containerPort": 80
                
            ],
            "links": [
                "web"
            ],
            "mountPoints": [
                
                    "sourceVolume": "WwwStatic",
                    "containerPath": "/www/static"
                
            ],
            "memory": 128,
            "volumesFrom": [
                
                    "sourceContainer": "web"
                
            ]
        
    ]

我还关注了 nginx/php 多容器 example AWS 已发布没有问题。

【问题讨论】:

你解决了吗?我可以使用 ECS 和自我管理的集群运行我的堆栈,但希望将其移植到 EBS。他们不支持使用docker-compose 编排容器,所以我需要按照您的描述进行操作,即将我的撰写设置“翻译”成他们的 json 格式。 【参考方案1】:

我知道这是一篇旧帖子,但如果原始海报能提供后续说明,说明发生了什么,这对其他人会非常有帮助。例如,我通过做 XYZ 解决了这个问题,或者我放弃并转向 ABC 或......等等。

原始海报也没有提供有关他们遇到的错误的详细信息。

为了其他人的利益,我可以看到此人可能遇到的至少一个问题。从 nginx 容器引用烧瓶应用程序“web”容器时,您可以使用此“http://web:8000”,但对于 Amazon 容器,您必须改用“http://localhost:8000”。

【讨论】:

【参考方案2】:

Web 容器缺少属性 portMappings

"portMappings": [
    
        "hostPort": 8080,
        "containerPort": 8080
     
]

【讨论】:

以上是关于使用 EBS 部署多容器 docker 环境(flask 和 nginx)的主要内容,如果未能解决你的问题,请参考以下文章

Docker多容器部署LNMP环境

如何配置github操作将docker容器部署到aws elasticbeanstalk多容器环境

Elastic Beanstalk 多容器 Docker 环境变量

在 Elasticbeanstalk for Scala Apps 中为 Docker 多容器环境部署和托管工件的最佳实践是啥?

k8s集群容器监控

Elastic Beanstalk 上的 Docker => 使用环境配置运行终端