

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

# 使用 Elastic Beanstalk 控制台创建 ECS 托管 Docker 环境
<a name="create_deploy_docker_ecstutorial"></a>

本教程详细介绍了使用两个容器的 ECS 托管 Docker 环境的容器配置和源代码准备。

容器、PHP 应用程序和 nginx 代理，在 Elastic Beanstalk 环境中的每个亚马逊弹性计算云 (A EC2 mazon) 实例上并排运行。创建环境并验证应用程序正在运行后，您将连接到一个容器实例以了解其配合使用情况。

**Topics**
+ [定义 ECS 托管式 Docker 容器](#create_deploy_docker_ecstutorial_config)
+ [添加内容](#create_deploy_docker_ecstutorial_code)
+ [部署到 Elastic Beanstalk](#create_deploy_docker_ecstutorial_deploy)
+ [连接到容器实例](#create_deploy_docker_ecstutorial_connect)
+ [检查 Amazon ECS 容器代理](#create_deploy_docker_ecstutorial_connect_inspect)

## 定义 ECS 托管式 Docker 容器
<a name="create_deploy_docker_ecstutorial_config"></a>

创建新的 Docker 环境的第一步是为您的应用程序数据创建目录。此文件夹可以位于您的本地计算机上的任何位置，并且可以具有您选择的任何名称。除了容器配置文件外，此文件夹还包含您将上传到 Elastic Beanstalk 并部署到环境的内容。

**注意**  
本教程的所有代码都可在 awslabs 存储库中找到，网址为。 GitHub [https://github.com/awslabs/eb-docker-nginx-proxy](https://github.com/awslabs/eb-docker-nginx-proxy)

Elastic Beanstalk 用来在 EC2 亚马逊实例上配置容器的文件是一个名为 v2 的 JSON 格式的文本文件。`Dockerrun.aws.json`ECS 托管 Docker 平台版本使用此文件的版本 2 格式。此格式仅可用于 ECS 托管 Docker 平台，因为它与支持非 ECS 管理的 Docker 平台分支的其他配置文件版本有很大不同。

请使用此名称在应用程序的根目录下创建一个 `Dockerrun.aws.json` v2 文本文件添加以下文本：

```
{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "php-app",
      "host": {
        "sourcePath": "/var/app/current/php-app"
      }
    },
    {
      "name": "nginx-proxy-conf",
      "host": {
        "sourcePath": "/var/app/current/proxy/conf.d"
      }
    }  
  ],
  "containerDefinitions": [
    {
      "name": "php-app",
      "image": "php:fpm",
      "essential": true,
      "memory": 128,
      "mountPoints": [
        {
          "sourceVolume": "php-app",
          "containerPath": "/var/www/html",
          "readOnly": true
        }
      ]
    },
    {
      "name": "nginx-proxy",
      "image": "nginx",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "links": [
        "php-app"
      ],
      "mountPoints": [
        {
          "sourceVolume": "php-app",
          "containerPath": "/var/www/html",
          "readOnly": true
        },
        {
          "sourceVolume": "nginx-proxy-conf",
          "containerPath": "/etc/nginx/conf.d",
          "readOnly": true
        },
        {
          "sourceVolume": "awseb-logs-nginx-proxy",
          "containerPath": "/var/log/nginx"
        }
      ]
    }
  ]
}
```

本示例配置定义了两个容器：一个 PHP 网站以及一个位于它前面的 nginx 代理。这两个容器将在 Elastic Beanstalk 环境中每个实例上的 Docker 容器中并排运行，并从主机实例上的卷（也在此文件中定义）访问共享内容（网站的内容）。这两个容器自身从托管于 Docker 中心上的正式存储库中的映像创建。得到的环境与下面类似：

![\[Elastic Beanstalk environment with load balancer, auto scaling group, and two instances running Nginx and PHP-FPM.\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/aeb-multicontainer-tutorial.png)


在配置中定义的卷与您接下来要创建并作为应用程序源包的一部分上传的内容相对应。这两个容器将通过在容器定义的 `mountPoints` 部分中装载卷来访问主机上的内容。

有关 `Dockerrun.aws.json` v2 的格式及其参数的更多信息，请参阅 [容器定义格式](create_deploy_docker_v2config.md#create_deploy_docker_v2config_dockerrun_format)。

## 添加内容
<a name="create_deploy_docker_ecstutorial_code"></a>

接下来，您将为要向访问者显示的 PHP 站点添加一些内容，并为 nginx 代理添加一个配置文件。

**php-app/index.php**

```
<h1>Hello World!!!</h1>
<h3>PHP Version <pre><?= phpversion()?></pre></h3>
```

**php-app/static.html**

```
<h1>Hello World!</h1>
<h3>This is a static HTML page.</h3>
```

**proxy/conf.d/default.conf**

```
server {
  listen 80;
  server_name localhost;
  root /var/www/html;
 
  index index.php;
 
  location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
      return 404;
    }

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

    fastcgi_pass php-app:9000;
    fastcgi_index index.php;
  }
}
```

## 部署到 Elastic Beanstalk
<a name="create_deploy_docker_ecstutorial_deploy"></a>

您的应用程序文件夹现在包含以下文件：

```
├── Dockerrun.aws.json
├── php-app
│   ├── index.php
│   └── static.html
└── proxy
    └── conf.d
        └── default.conf
```

这就是您创建 Elastic Beanstalk 环境所需的全部内容。创建上述文件和文件夹 (不包括顶级项目文件夹) 的 `.zip` 存档。要在 Windows 资源管理器中创建存档，请选择项目文件夹的内容，右键单击，选择 **Send To (发送到)**，然后单击 **Compressed (zipped) Folder (压缩的文件夹)** 

**注意**  
有关在其他环境中创建存档所需的文件结构和说明的信息，请参阅[创建 Elastic Beanstalk 应用程序源包](applications-sourcebundle.md) 

接下来，将源包上传到 Elastic Beanstalk 并创建您的环境。对于 **Platform (平台)**，选择 **Docker**。对于**平台分支**，选择 **64 位 Amazon Linux 2023 上运行的 ECS**。

**启动环境（控制台）**

1. [使用以下预配置链接打开 Elastic Beanstalk 控制台：console.aws.amazon。 com/elasticbeanstalk/home\$1/newApplication？ 应用程序名称=教程&环境类型= LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. 对于**平台**，请选择与应用程序使用的语言匹配的平台和平台分支，或者为基于容器的应用程序选择 Docker 平台。

1. 对于 **Application code**（应用程序代码），选择 **Upload your code**（上传代码）。

1. 选择 **Local file (本地文件)**，再选择 **Choose file (选择文件)**，然后打开源包。

1. 选择**复查并启动**。

1. 查看可用设置并选择 **Create app (创建应用程序)**。

Elastic Beanstalk 控制台将您重定向到新环境的管理控制面板。此屏幕显示环境的运行状况和由 Elastic Beanstalk 服务输出的事件。当状态为 Green 时，请单击环境名称旁边的 URL 以查看您新的网站。

## 连接到容器实例
<a name="create_deploy_docker_ecstutorial_connect"></a>

接下来，您将连接到 Elastic Beanstalk 环境中的亚马逊 EC2 实例，以查看一些活动部件的运行情况。

要连接到您的环境中的实例，最简单的方法是使用 EB CLI。要使用该工具，请[安装 EB CLI](eb-cli3.md#eb-cli3-install)（如果尚未安装）。您还需要使用 Amazon EC2 SSH 密钥对来配置您的环境。可以使用控制台的[安全配置页面](using-features.managing.security.md)或 EB CLI [eb init](eb3-init.md) 命令执行该操作。要连接到环境实例，请使用 EB CLI [eb ssh](eb3-ssh.md) 命令。

现在，您已连接到托管 docker 容器的 Amazon EC2 实例，您可以看到设置是如何进行的。对 `ls` 运行 `/var/app/current`：

```
[ec2-user@ip-10-0-0-117 ~]$ ls /var/app/current
Dockerrun.aws.json  php-app  proxy
```

此目录包含您在创建环境期间上传到 Elastic Beanstalk 的源包中的文件。

```
[ec2-user@ip-10-0-0-117 ~]$ ls /var/log/containers
nginx-proxy    nginx-proxy-4ba868dbb7f3-stdouterr.log     
php-app        php-app-dcc3b3c8522c-stdouterr.log       rotated
```

这是在容器实例上创建日志并由 Elastic Beanstalk 收集日志的位置。Elastic Beanstalk 在此目录中为每个容器创建一个卷，您将卷挂载到写入日志的容器位置。

您还可以使用 `docker ps` 查看 Docker 以了解正在运行的容器。

```
[ec2-user@ip-10-0-0-117 ~]$ sudo docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS                  PORTS                               NAMES                                                
4ba868dbb7f3   nginx                            "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes            0.0.0.0:80->80/tcp, :::80->80/tcp   ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400        
dcc3b3c8522c   php:fpm                          "docker-php-entrypoi…"   4 minutes ago   Up 4 minutes            9000/tcp                            ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101                             
d9367c0baad6   amazon/amazon-ecs-agent:latest   "/agent"                 5 minutes ago   Up 5 minutes (healthy)                                      ecs-agent
```

这会显示您部署的两个正在运行的容器，以及协调部署的 Amazon ECS 容器代理。

## 检查 Amazon ECS 容器代理
<a name="create_deploy_docker_ecstutorial_connect_inspect"></a>

Elastic Beanstalk 上的 ECS 托管 Docker 环境中的亚马逊 EC2 实例在 Docker 容器中运行代理进程。此代理连接到 Amazon ECS 服务以协调容器部署。这些部署在 Amazon ECS 中作为任务运行，这些任务在任务定义文件中进行配置。Elastic Beanstalk 根据您在源包中上传的 `Dockerrun.aws.json` 创建这些任务定义文件。

利用对 `http://localhost:51678/v1/metadata` 的 HTTP 获取请求查看容器代理的状态：

```
[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/metadata
{
  "Cluster":"awseb-Tutorials-env-dc2aywfjwg",
  "ContainerInstanceArn":"arn:aws:ecs:us-west-2:123456789012:container-instance/awseb-Tutorials-env-dc2aywfjwg/db7be5215cd74658aacfcb292a6b944f",
  "Version":"Amazon ECS Agent - v1.57.1 (089b7b64)"
}
```

此结构显示了 Amazon ECS 集群的[名称和集群实例（您所连接的亚马逊实例）的 ARN（亚马逊 EC2 资源名称](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)）。

有关更多信息，请发出 HTTP 获取请求，地址为 `http://localhost:51678/v1/tasks`：

```
[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/tasks
{
   "Tasks":[
      {
         "Arn":"arn:aws:ecs:us-west-2:123456789012:task/awseb-Tutorials-env-dc2aywfjwg/bbde7ebe1d4e4537ab1336340150a6d6",
         "DesiredStatus":"RUNNING",
         "KnownStatus":"RUNNING",
         "Family":"awseb-Tutorials-env-dc2aywfjwg",
         "Version":"1",
         "Containers":[
            {
               "DockerId":"dcc3b3c8522cb9510b7359689163814c0f1453b36b237204a3fd7a0b445d2ea6",
               "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101",
               "Name":"php-app",
               "Volumes":[
                  {
                     "Source":"/var/app/current/php-app",
                     "Destination":"/var/www/html"
                  }
               ]
            },
            {
               "DockerId":"4ba868dbb7f3fb3328b8afeb2cb6cf03e3cb1cdd5b109e470f767d50b2c3e303",
               "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400",
               "Name":"nginx-proxy",
               "Ports":[
                  {
                     "ContainerPort":80,
                     "Protocol":"tcp",
                     "HostPort":80
                  },
                  {
                     "ContainerPort":80,
                     "Protocol":"tcp",
                     "HostPort":80
                  }
               ],
               "Volumes":[
                  {
                     "Source":"/var/app/current/php-app",
                     "Destination":"/var/www/html"
                  },
                  {
                     "Source":"/var/log/containers/nginx-proxy",
                     "Destination":"/var/log/nginx"
                  },
                  {
                     "Source":"/var/app/current/proxy/conf.d",
                     "Destination":"/etc/nginx/conf.d"
                  }
               ]
            }
         ]
      }
   ]
}
```

此结构描述了为部署本教程的示例项目中的两个 docker 容器而运行的任务。将显示以下信息：
+ **KnownStatus**— `RUNNING` 状态表示容器仍处于活动状态。
+ **Family** – Elastic Beanstalk 从 `Dockerrun.aws.json` 中创建的任务定义的名称。
+ **Version** – 任务定义的版本。每当任务定义文件更新时，版本号都会递增。
+ **Containers** – 有关在实例上运行的容器的信息。

甚至可以从 Amazon ECS 服务本身获取更多信息，您可以使用 调用该服务 AWS Command Line Interface有关在 Amazon ECS 上使用的说明以及有关 Amazon ECS 的一般信息，请参阅 [Amazon ECS 用户指南](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_GetStarted.html)。 AWS CLI 