QuickStart: 将 Docker Compose 应用程序部署到 Elastic Beanstalk - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

QuickStart: 将 Docker Compose 应用程序部署到 Elastic Beanstalk

本 QuickStart 教程将引导您完成创建多容器 Docker Compose 应用程序并将其部署到环境的过程。 Amazon Elastic Beanstalk 你将创建一个带有 nginx 反向代理的 Flask Web 应用程序,以演示 Docker Compose 如何简化多个容器的编排。

注意

教程示例仅用于演示。请勿将该应用程序用于生产流量。

你的 Amazon 账户

如果您还不是 Amazon 客户,则需要创建一个 Amazon 帐户。注册后,您就可以访问 Elastic Beanstalk Amazon 和其他所需的服务。

如果您已经有一个 Amazon 帐户,则可以继续前进先决条件

注册获取 Amazon Web Services 账户

如果您没有 Amazon Web Services 账户,请完成以下步骤来创建一个。

报名参加 Amazon Web Services 账户
  1. 打开https://portal.aws.amazon.com/billing/注册。

  2. 按照屏幕上的说明操作。

    在注册时,将接到电话或收到短信,要求使用电话键盘输入一个验证码。

    当您注册时 Amazon Web Services 账户,就会创建Amazon Web Services 账户根用户一个。根用户有权访问该账户中的所有 Amazon Web Services 服务 和资源。作为最佳安全实践,请为用户分配管理访问权限,并且只使用根用户来执行需要根用户访问权限的任务

Amazon 注册过程完成后会向您发送一封确认电子邮件。您可以随时前往 https://aws.amazon.com/并选择 “我的账户”,查看您当前的账户活动并管理您的账户

保护 IAM 用户

注册后 Amazon Web Services 账户,请开启多重身份验证 (MFA),保护您的管理用户。有关说明,请参阅《IAM 用户指南》中的 为 IAM 用户启用虚拟 MFA 设备(控制台)

要允许其他用户访问您的 Amazon Web Services 账户 资源,请创建 IAM 用户。为了保护您的 IAM 用户,请启用 MFA 并仅向 IAM 用户授予执行任务所需的权限。

有关创建和保护 IAM 用户的更多信息,请参阅《IAM 用户指南》中的以下主题:

先决条件

为了遵循本指南中的步骤,您需要命令行终端或 Shell,以便运行命令。命令显示在列表中,以提示符($)和当前目录名称(如果有)开头。

~/eb-project$ this is a command this is output

在 Linux 和 macOS 中,您可使用您首选的 Shell 和程序包管理器。在 Windows 上,您可以安装适用于 Linux 的 Windows 子系统,以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

EB CLI

本教程使用 Elastic Beanstalk 命令行界面 (EB CLI)。有关安装和配置 EB CLI 的详细信息,请参阅 使用安装脚本安装 EB CLI(推荐)配置 EB CLI

Docker 和 Docker Compose

要学习本教程,你需要在本地安装 Docker 和 Docker Compose 的正常运行。有关更多信息,请参阅 Docker 文档网站上的 “获取 Docker” 和 “安装 Docker Compose”。

运行以下命令,验证 Docker 和 Docker Compose 是否已安装并正在运行。

~$ docker info ~$ docker compose version

步骤 1:创建 Docker Compose 应用程序

在此示例中,我们使用 Docker Compose 创建了一个多容器应用程序,该应用程序由一个 Flask Web 应用程序和一个 nginx 反向代理组成。这演示了 Docker Compose 如何简化协同工作的多个容器的编排。

该应用程序包括运行状况监控配置,允许 Elastic Beanstalk 从你的 nginx 代理收集详细的应用程序指标。

该应用程序由以下结构组成:

~/eb-docker-compose-flask/ |-- docker-compose.yml |-- web/ | |-- Dockerfile | |-- app.py | `-- requirements.txt |-- proxy/ | |-- Dockerfile | `-- nginx.conf `-- .platform/ `-- hooks/ `-- postdeploy/ `-- 01_setup_healthd_permissions.sh

创建目录结构并添加以下文件:

首先,创建定义服务及其关系的主docker-compose.yml文件。

~/eb-docker-compose-flask/docker-compose.yml
services: web: build: ./web expose: - "5000" nginx-proxy: build: ./proxy ports: - "80:80" volumes: - "/var/log/nginx:/var/log/nginx" depends_on: - web

web目录中创建 Flask Web 应用程序。将以下内容添加到您的 app.py 文件。

~/eb-docker-compose-flask/web/app.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello Elastic Beanstalk! This is a Docker Compose application'

将以下内容添加到您的 Web 服务Dockerfile

~/eb-docker-compose-flask/web/Dockerfile
FROM public.ecr.aws/docker/library/python:3.12 COPY . /app WORKDIR /app RUN pip install Flask==3.1.1 EXPOSE 5000 CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

在目录中创建 nginx 反向代理。proxy将以下内容添加到您的 nginx.conf 文件。

此配置包括运行状况监控设置,允许 Elastic Beanstalk 收集详细的应用程序指标。有关自定义运行状况监控日志格式的更多信息,请参阅增强型运行状况日志格式

~/eb-docker-compose-flask/proxy/nginx.conf
events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; map $http_upgrade $connection_upgrade { default "upgrade"; } # Health monitoring log format for Elastic Beanstalk log_format healthd '$msec"$uri"$status"$request_time"$upstream_response_time"$http_x_forwarded_for'; upstream flask_app { server web:5000; } server { listen 80 default_server; root /usr/share/nginx/html; # Standard access log access_log /var/log/nginx/access.log; # Health monitoring log for Elastic Beanstalk if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") { set $year $1; set $month $2; set $day $3; set $hour $4; } access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd; location / { proxy_pass http://flask_app; proxy_http_version 1.1; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }

将以下内容添加到您的代理服务中Dockerfile

~/eb-docker-compose-flask/proxy/Dockerfile
FROM public.ecr.aws/nginx/nginx:alpine COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80

最后,创建平台挂钩脚本来设置运行状况监控所需的日志目录和权限。平台挂钩允许您在部署过程中运行自定义脚本。有关平台挂钩的更多信息,请参阅平台挂钩

~/eb-docker-compose-flask/.platform/hooks/postdeploy/01_setup_healthd_permissions.sh
#!/bin/bash set -ex NGINX_CONTAINER=$(docker ps --filter "name=nginx-proxy" -q) if [ -z "$NGINX_CONTAINER" ]; then echo "Error: No nginx-proxy container found running" exit 1 fi NGINX_UID=$(docker exec ${NGINX_CONTAINER} id -u nginx) NGINX_GID=$(docker exec ${NGINX_CONTAINER} id -g nginx) mkdir -p /var/log/nginx/healthd chown -R ${NGINX_UID}:${NGINX_GID} /var/log/nginx

步骤 2:在本地运行应用程序

使用 docker compose up 命令在本地构建和运行您的多容器应用程序。Docker Compose 将生成两个容器镜像并启动文件docker-compose.yml中定义的服务。

~/eb-docker-compose-flask$ docker compose up --build

--build选项可确保 Docker Compose 在启动服务之前构建容器镜像。您应该会看到显示 Web 服务和 nginx-proxy 服务正在启动的输出。

http://localhost在浏览器中导航至。您应该会看到文本“Hello Elastic Beanstalk! 这是一个 Docker Compose 应用程序”。nginx 代理在端口 80 上接收你的请求,然后将其转发给在端口 5000 上运行的 Flask 应用程序。

完成测试后,通过在终端Ctrl+C中按下来停止应用程序,或者在单独的终端中运行以下命令:

~/eb-docker-compose-flask$ docker compose down

第 3 步:使用 EB CLI 部署 Docker Compose 应用程序

运行以下命令为此应用程序创建 Elastic Beanstalk 环境。

创建环境并部署 Docker Compose 应用程序
  1. 使用 eb init 命令,初始化 EB CLI 存储库。

    ~/eb-docker-compose-flask$ eb init -p docker docker-compose-tutorial --region us-east-2 Application docker-compose-tutorial has been created.

    此命令将创建名为 docker-compose-tutorial 的应用程序,并配置本地存储库,以创建具有最新 Docker 平台版本的环境。

  2. (可选)eb init再次运行以配置默认密钥对,以便您可以使用 SSH 连接到运行应用程序的 EC2 实例。

    ~/eb-docker-compose-flask$ eb init Do you want to set up SSH for your instances? (y/n): y Select a keypair. 1) my-keypair 2) [ Create new KeyPair ]

    如果您已有密钥对,请选择一个,或按提示创建一个。如果您没有看到提示或需要以后更改设置,请运行 eb init -i

  3. 创建环境并使用 eb create 将应用程序部署到此环境中。Elastic Beanstalk 会自动docker-compose.yml检测您的文件并部署您的多容器应用程序。

    ~/eb-docker-compose-flask$ eb create docker-compose-tutorial

    Elastic Beanstalk 需要大约五分钟的时间来创建您的环境并部署您的多容器应用程序。

第 4 步:在 Elastic Beanstalk 上测试你的应用程序

当创建环境的过程完成后,使用 eb open 打开您的网站。

~/eb-docker-compose-flask$ eb open

太棒了!你已经使用 Elastic Beanstalk 部署了一个多容器 Docker Compose 应用程序!这将使用为应用程序创建的域名打开一个浏览器窗口。你应该会看到来自你的 Flask 应用程序的消息,该消息是通过 nginx 反向代理提供的。

第 5 步:清理

应用程序使用完毕时,您可以终止您的环境。Elastic Beanstalk Amazon 会终止与您的环境关联的所有资源。

要使用 EB CLI 终止您的 Elastic Beanstalk 环境,请运行以下命令。

~/eb-docker-compose-flask$ eb terminate

Amazon 您的应用程序的资源

您刚刚创建了一个运行多个容器的单个实例应用程序。它是一个简单的示例应用程序,只有一个 EC2 实例,因此不需要负载平衡或 auto Scaling。对于单实例应用程序,Elastic Beanstalk 会创建以下资源: Amazon

  • EC2 实例 — 配置为在您选择的平台上运行 Web 应用程序的 Amazon EC2 虚拟机。

    各平台运行一组不同的软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 nginx 作为在 Web 应用程序前处理 Web 流量的反向代理,向其转发请求、提供静态资产以及生成访问和错误日志。

  • 实例安全组 — 配置为允许端口 80 上的传入流量的 Amazon EC2 安全组。此资源允许来自负载均衡器的 HTTP 流量到达运行您的 Web 应用程序的 EC2 实例。默认情况下,其他端口不允许流量进入。

  • Amazon S3 存储桶 – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。

  • Amazon CloudWatch CloudWatch 警报 — 两个警报,用于监控您环境中实例的负载,并在负载过高或过低时触发。警报触发后,您的 Auto Scaling 组会扩展或收缩以进行响应。

  • Amazon CloudFormation 堆栈 — Elastic Amazon CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 Amazon CloudFormation 控制台查看的模板中定义。

  • 域名-以表单形式路由到您的 Web 应用程序的域名subdomainregion.eb.amazonaws.com.cn。

Elastic Beanstalk 管理所有这些资源。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。你的 Docker Compose 应用程序在单个 EC2 实例上运行多个容器,Elastic Beanstalk 会自动处理编排。

后续步骤

有了运行应用程序的环境以后,您随时可以部署新的应用程序版本或不同的应用程序。部署新应用程序版本的速度非常快,因为它不需要预置或重启 EC2 实例。您还可以使用 Elastic Beanstalk 控制台探索新环境。有关详细步骤,请参阅本指南入门一章中的探索您的环境

部署一两个示例应用程序并准备好开始在本地开发和运行 Docker Compose 应用程序之后,请参阅。准备 Docker 映像以部署到 Elastic Beanstalk

使用 Elastic Beanstalk 控制台进行部署

你也可以使用 Elastic Beanstalk 控制台启动 Docker Compose 应用程序。创建包含您的文件和所有关联目录和docker-compose.yml文件的 ZIP 文件,然后在创建新应用程序时将其上传。有关详细步骤,请参阅本指南入门一章中的创建示例应用程序