

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Elastic Beanstalk 콘솔로 ECS 관리형 Docker 환경 생성
<a name="create_deploy_docker_ecstutorial"></a>

이 자습서에는 컨테이너 구성과, 컨테이너 두 개를 사용하는 ECS 관리형 Docker 환경의 소스 코드 준비에 대한 내용이 나와 있습니다.

컨테이너(PHP 애플리케이션 및 nginx 프록시)는 Elastic Beanstalk 환경의 각 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 나란히 실행됩니다. 환경을 생성하고 애플리케이션이 실행되는지 확인한 후에는 컨테이너 인스턴스에 연결하여 함께 정상적으로 작동되는지 살펴봅니다.

**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에 업로드하고 환경에 배포할 내용을 포함하고 있습니다.

**참고**  
이 자습서의 모든 코드는 GitHub의 awslabs 리포지토리([https://github.com/awslabs/eb-docker-nginx-proxy](https://github.com/awslabs/eb-docker-nginx-proxy))에서 제공됩니다.

Elastic Beanstalk가 Amazon EC2 인스턴스에 컨테이너를 구성하는 데 사용하는 파일은 JSON 형식의 텍스트 파일로 이름은 `Dockerrun.aws.json` v2입니다. 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 Hub의 공식 리포지토리에서 호스팅하는 이미지로 만듭니다. 그 결과, 다음과 같은 환경이 됩니다.

![\[Elastic Beanstalk environment with load balancer, auto scaling group, and two instances running Nginx and PHP-FPM.\]](http://docs.aws.amazon.com/ko_kr/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 explorer에 아카이브를 만들려면 프로젝트 폴더의 내용을 선택하고 마우스 오른쪽 버튼을 클릭한 후 **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?applicationName=tutorials&environmentType=LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. **플랫폼**에서 애플리케이션에 사용되는 언어와 일치하는 플랫폼 및 플랫폼 브랜치를 선택하거나 컨테이너 기반 애플리케이션을 위한 Docker 플랫폼을 선택합니다.

1. [**애플리케이션 코드**]에서 [**코드 업로드**]를 선택합니다.

1. [**로컬 파일**], [**파일 선택**]을 차례로 선택한 다음 소스 번들을 엽니다.

1. **검토 및 시작**을 선택합니다.

1. 사용 가능한 설정을 검토한 후 **앱 생성**을 선택합니다.

그러면 Elastic Beanstalk 콘솔에서 새로운 환경의 관리 대시보드로 리디렉션됩니다. 이 화면에는 환경의 상태와 Elastic Beanstalk 서비스에 의한 이벤트 출력이 표시되어 있습니다. 상태가 녹색이면 환경 이름 옆의 URL을 클릭하여 새 웹 사이트를 확인합니다.

## 컨테이너 인스턴스에 연결
<a name="create_deploy_docker_ecstutorial_connect"></a>

이제 Elastic Beanstalk 환경의 Amazon 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를 살펴보고 `docker ps`로 실행 중인 컨테이너를 확인할 수도 있습니다.

```
[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 환경의 Amazon EC2 인스턴스는 Docker 컨테이너에 에이전트 프로세스를 실행합니다. 이 에이전트는 Amazon ECS 서비스에 연결되어 컨테이너 배포를 조정합니다. 이러한 배포는 Amazon ECS에서 작업으로 실행되며, 이 작업은 작업 정의 파일에 구성되어 있습니다. Elastic Beanstalk는 소스 번들에 업로드하는 `Dockerrun.aws.json`을 기준으로 이러한 작업 정의 파일을 만듭니다.

`http://localhost:51678/v1/metadata`에 대한 HTTP get 요청으로 컨테이너 에이전트의 상태를 확인합니다.

```
[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 EC2 인스턴스)의 ARN([Amazon 리소스 이름](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)) 및 Amazon ECS 클러스터의 이름을 나타냅니다.

자세한 내용을 보려면 `http://localhost:51678/v1/tasks`에 HTTP get 요청을 수행하십시오.

```
[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` 상태는 컨테이너가 여전히 활성화되어 있다는 것을 나타냅니다.
+ **패밀리** – Elastic Beanstalk가 `Dockerrun.aws.json`에서 생성한 작업 정의 이름입니다.
+ **버전** – 작업 정의 버전입니다. 작업 정의 파일이 업데이트될 때마다 버전이 증가합니다.
+ **컨테이너** – 인스턴스에서 실행 중인 컨테이너에 대한 정보입니다.

더 자세한 내용은 Amazon ECS 서비스에서 확인할 수 있으며, 를 사용하여 호출할 수 있습니다 AWS Command Line Interface Amazon ECS AWS CLI 에서를 사용하는 방법에 대한 지침과 Amazon ECS에 대한 일반적인 정보는 [ Amazon ECS 사용 설명서를](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_GetStarted.html) 참조하세요.