

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

# Elastic Beanstalk에 배포하도록 Docker 이미지 준비
<a name="single-container-docker-configuration"></a>

이 섹션에서는 *AL2 또는 AL2023 플랫폼 브랜치를 실행하는 Docker*를 사용하여 Elastic Beanstalk에 배포하도록 Docker 이미지를 준비하는 방법을 설명합니다. 필요한 구성 파일은 이미지가 로컬인지, 원격인지 아니면 Docker Compose를 사용하는지 여부에 따라 달라집니다.

**참고**  
 Docker 환경을 시작하는 절차의 예제는 [Docker에 대한 QuickStart](docker-quickstart.md) 주제를 참조하세요.

**Topics**
+ [Elastic Beanstalk에서 Docker Compose로 이미지 관리](#single-container-docker-configuration-dc)
+ [Elastic Beanstalk에서 Docker Compose 없이 이미지 관리](#single-container-docker-configuration.no-compose)
+ [도커파일을 사용하여 사용자 지정 이미지 빌드](#single-container-docker-configuration.dockerfile)

## Elastic Beanstalk에서 Docker Compose로 이미지 관리
<a name="single-container-docker-configuration-dc"></a>

Docker Compose를 사용하여 하나의 YAML 파일에서 다양한 서비스를 관리하도록 선택할 수 있습니다. Docker Compose에 대한 자세한 내용은 Docker 웹 사이트에서 [Why use Compose?](https://docs.docker.com/compose/intro/features-uses/)를 참조하세요.
+ `docker-compose.yml`를 만듭니다. 이 파일은 Docker Compose를 사용하여 Elastic Beanstalk로 애플리케이션을 관리하는 경우에 필요합니다. 모든 배포를 퍼블릭 리포지토리의 이미지에서 가져온 경우 다른 구성 파일은 필요하지 않습니다. 배포의 소스 이미지가 프라이빗 리포지토리에 있는 경우 몇 가지 추가 구성을 해야 합니다. 자세한 내용은 [프라이빗 리포지토리의 이미지 사용](docker-configuration.remote-repo.md)을 참조하세요. `docker-compose.yml` 파일에 대한 자세한 내용은 도커 웹 사이트에서 [구성 파일 참조](https://docs.docker.com/compose/compose-file/)를 확인하십시오.
+  `Dockerfile`은 선택 사항입니다. 로컬 사용자 지정 이미지를 빌드하고 실행하는 데 Elastic Beanstalk가 필요한 경우 파일을 하나 생성합니다. `Dockerfile`에 대한 자세한 내용은 도커 웹 사이트의 [도커파일 참조](https://docs.docker.com/engine/reference/builder/)를 확인하십시오.
+  `.zip` 파일을 생성해야 할 수 있습니다. `Dockerfile` 파일만 사용하여 애플리케이션을 배포할 경우에는 이 파일을 생성할 필요가 없습니다. 추가 구성 파일을 사용하는 경우 .zip 파일에는 `Dockerfile`, `docker-compose.yml` 파일, 애플리케이션 파일 및 모든 애플리케이션 파일 종속성이 포함되어야 합니다. `Dockerfile` 및 `docker-compose.yml`은 루트에 있거나, .zip 아카이브의 최상위에 있어야 합니다. EB CLI를 사용하여 애플리케이션을 배포하면 .zip 파일이 생성됩니다.

도커 구성에 대한 자세한 내용과 설치 방법은 도커 사이트에서 [도커 구성 개요](https://docs.docker.com/compose/) 및 [도커 구성 설치](https://docs.docker.com/compose/install/)를 참조하십시오.

## Elastic Beanstalk에서 Docker Compose 없이 이미지 관리
<a name="single-container-docker-configuration.no-compose"></a>

Docker Compose를 사용하여 Docker 이미지를 관리하지 않는 경우 `Dockerfile`, `Dockerrun.aws.json` 파일 또는 둘 다를 구성해야 합니다.
+ `Dockerfile`을 생성하여 Elastic Beanstalk를 빌드하고 사용자 지정 이미지를 로컬에서 실행합니다.
+ 호스팅되는 리포지토리에서 Elastic Beanstalk로 Docker 이미지를 배포하도록 `Dockerrun.aws.json v1` 파일을 생성합니다.
+ `.zip` 파일을 생성해야 할 수 있습니다. 파일, `Dockerfile` 또는 `Dockerrun.aws.json` 중 **하나만 사용하는 경우 .zip 파일을 생성할 필요가 없습니다. 두 파일을 모두 사용하는 경우 .zip 파일이 필요합니다. .zip 파일에는 애플리케이션 파일과 애플리케이션 파일 종속성이 포함된 파일과 함께 `Dockerfile` 및 `Dockerrun.aws.json`이 모두 포함되어야 합니다. EB CLI를 사용하여 애플리케이션을 배포하면 `.zip` 파일이 생성됩니다.

### `Dockerrun.aws.json` v1 구성 파일
<a name="single-container-docker-configuration.dockerrun"></a>

`Dockerrun.aws.json` 파일은 원격 도커 이미지를 Elastic Beanstalk 애플리케이션으로서 배포하는 방법을 설명합니다. 이 JSON 파일은 Elastic Beanstalk에 고유합니다. 애플리케이션이 호스팅되는 리포지토리에서 사용할 수 있는 이미지에서 실행되는 경우 `Dockerrun.aws.json v1` 파일에 해당 이미지를 지정하여 `Dockerfile`을 생략할 수 있습니다.

**`Dockerrun.aws.json` 버전**  
 `AWSEBDockerrunVersion` 파라미터는 `Dockerrun.aws.json` 파일의 버전을 나타냅니다.  
Docker AL2 및 AL2023 플랫폼은 다음과 같은 버전의 파일을 사용합니다.  
`Dockerrun.aws.json v3` - Docker Compose를 사용하는 환경.
`Dockerrun.aws.json v1` - Docker Compose를 사용하지 않는 환경.
*Amazon Linux 2에서 실행되는 ECS* 및 *AL2023에서 실행되는 ECS*는 `Dockerrun.aws.json v2` 파일을 사용합니다. 사용 중지된 플랫폼인 **ECS-다중 컨테이너 Docker Amazon Linux AMI(AL1)도 동일한 버전을 사용했습니다.



#### Dockerrun.aws.json v1
<a name="single-container-docker-configuration.dockerrun.awsjson"></a>

`Dockerrun.aws.json v1` 파일에 유효한 키 및 값에는 다음 연산이 포함됩니다.

**AWSEBDockerrunVersion**  
(필수) Docker Compose를 사용하여 이미지를 관리하지 않는 경우 버전 번호 `1`을 지정합니다.

**Authentication**  
(프라이빗 리포지토리의 경우에만 필수) `.dockercfg` 파일을 저장하는 Amazon S3 객체를 지정합니다.  
이 장의 뒷부분에서 *프라이빗 리포지토리의 이미지 사용* 단원의 [이미지 리포지토리로 인증사용 AWS Secrets Manager](docker-configuration.remote-repo.md#docker-configuration.remote-repo.dockerrun-aws) 섹션을 참조하세요.

**이미지**  
기존 도커 리포지토리에서 도커 컨테이너를 구축할 도커 기본 이미지를 지정합니다. **Name** 키의 값을 도커 허브의 이미지의 경우에는 *<organization>/<image name>* 형식으로, 다른 사이트의 경우에는 *<site>/<organization name>/<image name>* 형식으로 지정합니다.  
`Dockerrun.aws.json` 파일에서 이미지를 지정하면 Elastic Beanstalk 환경의 각 인스턴스가 `docker pull`을 실행하여 이미지를 실행합니다. 경우에 따라 **Update** 키를 포함합니다. 기본값은 `true`로, Elastic Beanstalk에 리포지토리를 확인하고 이미지에 대한 모든 업데이트를 가져와 캐시된 이미지를 덮어쓰도록 지시합니다.  
`Dockerfile`을 사용하는 경우에는 `Dockerrun.aws.json` 파일에서 **Image** 키를 지정하지 마십시오. Elastic Beanstalk는 `Dockerfile`이 있는 경우 이 파일에 명시된 이미지를 빌드하여 사용합니다.

**포트**  
(**Image** 키를 지정하는 경우 필수) 도커 컨테이너에서 노출할 포트를 나열합니다. Elastic Beanstalk에서는 **ContainerPort** 값을 사용하여 호스트에서 실행 중인 역방향 프록시에 도커 컨테이너를 연결합니다.  
컨테이너 포트를 여러 개 지정할 수 있지만 Elastic Beanstalk는 첫 번째 포트만 사용합니다. 이 포트를 사용하여 컨테이너를 호스트의 역방향 프록시에 연결하고 퍼블릭 인터넷에서 요청을 라우팅합니다. `Dockerfile`을 사용할 경우, 첫 번째 **ContainerPort** 값은 `Dockerfile`의 **EXPOSE** 목록 내 첫 번째 항목과 일치해야 합니다.  
경우에 따라서는 **HostPort** 내 포트 목록 지정도 가능합니다. **HostPort** 항목은 **ContainerPort** 값이 매핑되는 호스트 포트를 지정합니다. **HostPort** 값을 지정하지 않으면 **ContainerPort** 값으로 기본 지정됩니다.  

```
{
  "Image": {
    "Name": "image-name"
  },
  "Ports": [
    {
      "ContainerPort": 8080,
      "HostPort": 8000
    }
  ]
}
```

****볼륨****  
EC2 인스턴스의 볼륨을 도커 컨테이너로 매핑합니다. 매핑할 볼륨 어레이를 하나 이상 지정합니다.  

```
{
  "Volumes": [
    {
      "HostDirectory": "/path/inside/host",
      "ContainerDirectory": "/path/inside/container"
    }
  ]
...
```

****로그****  
컨테이너에 애플리케이션에서 로그를 쓸 디렉터리를 지정합니다. 테일 또는 번들 로그를 요청하면 Elastic Beanstalk에서는 이 디렉터리의 로그를 Amazon S3에 업로드합니다. 로그를 이 디렉터리 내의 `rotated` 폴더로 교체하는 경우 영구 저장을 위해 교체된 로그를 Amazon S3로 업로드하도록 Elastic Beanstalk를 구성할 수도 있습니다. 자세한 내용은 [Elastic Beanstalk 환경에서 Amazon EC2 인스턴스 로그 보기](using-features.logging.md) 섹션을 참조하세요.

**Command**  
컨테이너에서 실행할 명령을 지정합니다. **진입점**을 지정하고 나면 **명령**이 **진입점**에 대한 인수로서 추가됩니다. 자세한 내용은 도커 설명서의 [CMD](https://docs.docker.com/engine/reference/run/#cmd-default-command-or-options)를 참조하십시오.

**진입점**  
컨테이너 시작 시 실행할 기본 명령을 지정합니다. 자세한 내용은 도커 설명서의 [ENTRYPOINT](https://docs.docker.com/engine/reference/run/#cmd-default-command-or-options)을 참조하십시오.

다음 코드 조각은 단일 컨테이너에 대한 `Dockerrun.aws.json` 파일의 구문을 보여 주는 예입니다.

```
{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "janedoe/image",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "1234"
    }
  ],
  "Volumes": [
    {
      "HostDirectory": "/var/app/mydb",
      "ContainerDirectory": "/etc/mysql"
    }
  ],
  "Logging": "/var/log/nginx",
  "Entrypoint": "/app/bin/myapp",
  "Command": "--argument"
}>
```

Elastic Beanstalk에 `Dockerrun.aws.json` 파일만 제공하거나, `.zip` 파일과 `Dockerrun.aws.json` 파일을 모두 포함하는 `Dockerfile` 아카이브를 제공할 수 있습니다. 이 섹션의 뒷부분에서 설명하는 것처럼 두 파일을 모두 제공하는 경우 `Dockerfile`은 도커 이미지를 명시하고, `Dockerrun.aws.json` 파일은 배포에 대한 추가 정보를 제공합니다.

**참고**  
두 파일은 루트에 있거나, `.zip` 아카이브의 최상위에 있어야 합니다. 파일을 포함하는 디렉터리에서 아카이브를 빌드하지 마십시오. 해당 디렉터리로 이동한 후 아카이브를 빌드하십시오.  
두 파일을 모두 제공하는 경우 `Dockerrun.aws.json` 파일에 이미지를 지정하지 마십시오. Elastic Beanstalk는 `Dockerfile`에 명시된 이미지를 빌드하여 사용하고 `Dockerrun.aws.json` 파일에 지정된 이미지는 무시합니다.

## 도커파일을 사용하여 사용자 지정 이미지 빌드
<a name="single-container-docker-configuration.dockerfile"></a>

리포지토리에서 호스팅되는 기존 이미지가 아직 없는 경우 `Dockerfile`을 생성해야 합니다.

다음은 코드 조각은 `Dockerfile`의 예입니다. [Docker에 대한 QuickStart](docker-quickstart.md)의 지침을 따르는 경우 이 `Dockerfile`을 덮어쓰도록 업로드할 수 있습니다. 이 `Dockerfile`을 사용하는 경우 Elastic Beanstalk에서는 게임 2048을 실행합니다.

`Dockerfile`에 포함시킬 수 있는 명령에 대한 자세한 내용은 도커 웹 사이트의 [도커파일 참조](https://docs.docker.com/engine/reference/builder)를 참조하십시오.

```
FROM ubuntu:12.04

RUN apt-get update
RUN apt-get install -y nginx zip curl

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN curl -o /usr/share/nginx/www/master.zip -L https://codeload.github.com/gabrielecirulli/2048/zip/master
RUN cd /usr/share/nginx/www/ && unzip master.zip && mv 2048-master/* . && rm -rf 2048-master master.zip

EXPOSE 80

CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]
```

**참고**  
단일 도커 파일에서 다단계 빌드를 실행하여 복잡성을 크게 줄이면서 작은 크기의 이미지를 생성할 수 있습니다. 자세한 내용은 도커 문서 웹 사이트에서 [다단계 빌드 사용](https://docs.docker.com/develop/develop-images/multistage-build/)을 참조하세요.