

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

# QuickStart: 将 Docker Compose 应用程序部署到 Elastic Beanstalk
<a name="docker-compose-quickstart"></a>

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

**不用于生产用途**  
示例仅用于演示。请勿在生产环境中使用示例应用程序。

**Topics**
+ [你的 Amazon 账户](#docker-compose-quickstart-aws-account)
+ [先决条件](#docker-compose-quickstart-prereq)
+ [步骤 1：创建 Docker Compose 应用程序](#docker-compose-quickstart-create-app)
+ [步骤 2：在本地运行应用程序](#docker-compose-quickstart-run-local)
+ [步骤 3：使用 EB CLI 部署 Docker Compose 应用程序](#docker-compose-quickstart-deploy)
+ [步骤 4：在 Elastic Beanstalk 上测试应用程序](#docker-compose-quickstart-run-eb-ap)
+ [第 5 步：清理](#docker-compose-quickstart-cleanup)
+ [Amazon 您的应用程序的资源](#docker-compose-quickstart-eb-resources)
+ [后续步骤](#docker-compose-quickstart-next-steps)
+ [使用 Elastic Beanstalk 控制台进行部署](#docker-compose-quickstart-console)

## 你的 Amazon 账户
<a name="docker-compose-quickstart-aws-account"></a>

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

如果您已经有一个 Amazon 帐户，则可以继续前进[先决条件](#docker-compose-quickstart-prereq)。

### 创建一个 Amazon 账户
<a name="docker-compose-quickstart-aws-account-procedure"></a>

#### 注册获取 Amazon Web Services 账户
<a name="sign-up-for-aws"></a>

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

**要注册 Amazon Web Services 账户**

1. 打开[https://portal.aws.amazon.com/billing/注册。](https://portal.amazonaws.cn/billing/signup)

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

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

   当您注册时 Amazon Web Services 账户，就会创建*Amazon Web Services 账户根用户*一个。根用户有权访问该账户中的所有 Amazon Web Services 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

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

#### 保护 IAM 用户
<a name="secure-an-admin"></a>

注册后 Amazon Web Services 账户，开启多重身份验证 (MFA)，保护您的管理用户。有关说明，请参阅《IAM 用户指南》**中的 [为 IAM 用户启用虚拟 MFA 设备（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#enable-virt-mfa-for-iam-user)。

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

有关创建和保护 IAM 用户的更多信息，请参阅《IAM 用户指南》中的以下主题：**
+ [在你的 IAM 用户中创建 Amazon Web Services 账户](https://docs.amazonaws.cn//IAM/latest/UserGuide/id_users_create.html)
+ [适用于 Amazon 资源的访问权限管理](https://docs.amazonaws.cn/IAM/latest/UserGuide/access.html)
+ [基于 IAM 身份的策略示例](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_examples.html)

## 先决条件
<a name="docker-compose-quickstart-prereq"></a>

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

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

在 Linux 和 macOS 中，您可使用您首选的 Shell 和程序包管理器。在 Windows 上，您可以[安装适用于 Linux 的 Windows 子系统](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

### EB CLI
<a name="docker-compose-quickstart-prereq.ebcli"></a>

本教程使用 Elastic Beanstalk 命令行界面 (EB CLI)。有关安装和配置 EB CLI 的详细信息，请参阅 [使用设置脚本安装 EB CLI（推荐）](eb-cli3.md#eb-cli3-install) 和 [配置 EB CLI](eb-cli3-configuration.md)。

### Docker 和 Docker Compose
<a name="docker-compose-quickstart-prereq.runtime"></a>

要遵循此教程，您需要在本地安装的有效 Docker 和 Docker Compose。有关更多信息，请参阅 Docker 文档网站上的 [Get Docker](https://docs.docker.com/get-docker/) 和 [Install Docker Compose](https://docs.docker.com/compose/install/)。

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

```
~$ docker info
~$ docker compose version
```

## 步骤 1：创建 Docker Compose 应用程序
<a name="docker-compose-quickstart-create-app"></a>

在此示例中，我们会使用 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` 文件。

**Example `~/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` 文件。

**Example `~/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`。

**Example `~/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"]
```

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

此配置包括运行状况监控设置，允许 Elastic Beanstalk 收集详细的应用程序指标。有关自定义运行状况监控日志格式的更多信息，请参阅[增强型运行状况日志格式](health-enhanced-serverlogs.md)。

**Example `~/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`。

**Example `~/eb-docker-compose-flask/proxy/Dockerfile`**  

```
FROM public.ecr.aws/nginx/nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
```

最后，创建平台钩子脚本来设置运行状况监控所需的日志目录和权限。平台钩子允许您在部署过程中运行自定义脚本。有关平台钩子的更多信息，请参阅[平台挂钩](platforms-linux-extend.hooks.md)。

**Example `~/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：在本地运行应用程序
<a name="docker-compose-quickstart-run-local"></a>

使用 [docker compose up](https://docs.docker.com/compose/reference/up/) 命令在本地构建并运行您的多容器应用程序。Docker Compose 将构建两个容器映像并启动 `docker-compose.yml` 文件中定义的服务。

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

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

在您的浏览器中导航到 `http://localhost`。您应该会看到文本“Hello Elastic Beanstalk\! This is a Docker Compose application”。nginx 代理在端口 80 上接收您的请求，然后将其转发给在端口 5000 上运行的 Flask 应用程序。

完成测试后，在终端中按下 **Ctrl\+C** 停止应用程序，或者在单独的终端中运行以下命令：

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

## 步骤 3：使用 EB CLI 部署 Docker Compose 应用程序
<a name="docker-compose-quickstart-deploy"></a>

运行以下命令为此应用程序创建 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 平台版本的环境。

1. （可选）再次运行 **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**。

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

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

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

## 步骤 4：在 Elastic Beanstalk 上测试应用程序
<a name="docker-compose-quickstart-run-eb-ap"></a>

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

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

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

## 第 5 步：清理
<a name="docker-compose-quickstart-cleanup"></a>

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

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

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

## Amazon 您的应用程序的资源
<a name="docker-compose-quickstart-eb-resources"></a>

您刚刚创建了一个运行多个容器的单一实例应用程序。它可用作带有单个 EC2 实例的简单示例应用程序，因此不需要负载平衡或自动扩缩。对于单实例应用程序，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 控制台](https://console.amazonaws.cn/cloudformation)查看的模板中定义。
+  **域名**-以表单形式路由到您的 Web 应用程序的域名*{{subdomain}}。 {{region}}.eb.amazonaws.com.cn。*

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

## 后续步骤
<a name="docker-compose-quickstart-next-steps"></a>

有了运行应用程序的环境以后，您随时可以部署新的应用程序版本或不同的应用程序。部署新应用程序版本非常快，因为不需要配置或重新启动 EC2 实例。您还可以使用 Elastic Beanstalk 控制台探索新环境。有关详细步骤，请参阅本指南*入门*一章中的[探索您的环境](GettingStarted.md#GettingStarted.Explore)。

部署一到两个示例应用程序并准备好开始在本地开发和运行 Docker Compose 应用程序后，请参阅[准备 Docker 映像以部署到 Elastic Beanstalk](single-container-docker-configuration.md)。

## 使用 Elastic Beanstalk 控制台进行部署
<a name="docker-compose-quickstart-console"></a>

您还可以使用 Elastic Beanstalk 控制台来启动 Docker Compose 应用程序。创建包含您 `docker-compose.yml` 文件以及所有关联目录和文件的 ZIP 文件，然后在创建新应用程序时将其上传。有关详细步骤，请参阅本指南*入门*一章中的[创建示例应用程序](GettingStarted.md#GettingStarted.CreateApp)。