如何将具有多个 Docker 容器的应用程序部署到 AWS Elastic Beanstalk?

Posted

技术标签:

【中文标题】如何将具有多个 Docker 容器的应用程序部署到 AWS Elastic Beanstalk?【英文标题】:How to deploy an app with multiple Docker containers to AWS Elastic Beanstalk? 【发布时间】:2020-09-19 23:35:28 【问题描述】:

我有一个 Django 应用程序,其 docker 镜像的 Dockerfile 如下:

FROM python:3.7

ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/

RUN pip3 install -r requirements.txt
COPY . /code/

ENV PORT=8000
EXPOSE 8000

然后,我有一个docker-compose.yml 文件,用于为我的 Django 应用程序定义其他容器映像和依赖项,如下所示:

version: '3'

services:
  web: &django_app
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - "80:8000"
    depends_on:
      - rabbitmq
  rabbitmq:
    image: rabbitmq:latest
  celery_worker:
    <<: *django_app
    command: celery -A DJingApp worker --loglevel=info
    ports: []
    depends_on:
      - rabbitmq

正如您在上面看到的,我必须在任何时间点运行 3 个容器(webrabbitmqcelery_worker)才能让我的 Django 应用程序正常工作。

那么,如何将这个项目的 Docker 映像部署到 AWS Elastic Beanstalk 并在那里运行它们?我必须对我的Dockerfiledocker-compose.yml 进行任何更改吗?如果是,它们是什么?

【问题讨论】:

如果您尝试使用 docker-compose 和 docker 容器,我不确定 Beanstalk 是否是您想要使用的。如果您想在 AWS 中部署基于 docker 的堆栈,请使用 ECS 或 EKS。 @2ps AWS 文档说有一种方法可以将多容器 docker 映像部署到 Beanstalk,但是当我尝试时,我遇到了很多错误,我想我正在做它错了。所以,我想知道我的情况的正确分步程序。如果你明白了,请告诉我,因为我只是 AWS 的初学者 【参考方案1】:

将多容器应用程序部署到 Elastic Beanstalk 非常具有挑战性。您需要一个 Dockerrun.aws.json 版本 2 配置文件,它是一个 Elastic Beanstalk 特定的 JSON 文件,描述如何将一组 Docker 容器部署为 Elastic Beanstalk 应用程序。

如果您不知道如何创建配置文件,我建议您查看official page。

您还可以使用container transform 实用程序将您的docker-compose 文件转换为Dockerrun.aws.json 配置文件,我觉得这很有帮助。您可能需要对自动生成的文件进行一些更改。

还要自定义您的环境,您需要使用.ebextensions。比如定义你的Django设置路径、WSGI路径、Web服务器配置、部署前执行Django管理命令等等。

详细日志,建议使用环境日志:

Elastic Beanstalk - 环境 - 'your-environment-name' - 日志

注意:我建议使用eb deploy 来成功部署,因为您需要以.zip 文件格式部署源代码。

【讨论】:

Elastic Beanstalk 现在使用 docker-compose 而不是 Dockerrun.aws.json

以上是关于如何将具有多个 Docker 容器的应用程序部署到 AWS Elastic Beanstalk?的主要内容,如果未能解决你的问题,请参考以下文章

docker多个容器连接 将 Rails 程序部署到 Docker 容器中

将多个 docker 容器部署到 AWS ECS

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

将 Docker 容器部署到 swarm 集群中的多个节点

设置 GitLab CI/CD 以将多个存储库部署到 DigitalOcean Droplet 上的 Docker 容器

如何将多个服务部署到 AWS ECS?