

# Amazon ECS에서 사용할 컨테이너 이미지 생성
<a name="create-container-image"></a>

Amazon ECS는 작업 정의에 Docker 이미지를 사용하여 컨테이너를 시작합니다. Docker는 사용자가 컨테이너에서 분산 애플리케이션을 구축, 실행, 테스트 및 배포할 수 있는 도구를 제공합니다.

Amazon ECS는 컨테이너식 애플리케이션을 컨테이너 인스턴스 또는 AWS Fargate에 예약합니다. 컨테이너식 애플리케이션은 컨테이너 이미지로 패키징됩니다. 이 예제에서는 웹 서버의 컨테이너 이미지를 생성합니다.

첫 번째 Docker 이미지를 생성하고 해당 이미지를 Amazon ECS 태스크 정의에 사용하기 위해 컨테이너 레지스트리인 Amazon ECR에 푸시할 수 있습니다. 이 과정에서는 여러분이 Docker가 무엇인지 및 작동 방식에 대해 기본적인 이해를 하고 있다고 가정합니다. Docker에 대한 자세한 내용은 [Docker란 무엇입니까?](https://aws.amazon.com/docker/)와 [Docker 설명서](https://docs.docker.com/get-started/docker-overview/)를 참조하세요.

## 사전 조건
<a name="create-container-image-prerequisites"></a>

시작하기 전에 다음 사전 요구 사항을 충족하는지 확인합니다.
+ Amazon ECR 설정 단계를 완료했는지 확인합니다.. 자세한 내용은 *Amazon Elastic Container Registry 사용 설명서*의 [Amazon ECR에서의 수명주기를 따라 이미지 이동하기](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)를 참조하세요.
+ 사용자에게 Amazon ECR 서비스에 액세스하고 사용하는 데 필요한 IAM 권한이 있습니다. 자세한 내용은 [Amazon ECR 관리형 정책](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security-iam-awsmanpol.html)을 참조하세요.
+ 도커가 설치되어 있습니다. Amazon Linux 2023의 Docker 설치 단계에 대한 자세한 내용은 [AL2023에 Docker 설치](#create-container-image-install-docker) 섹션을 참조하세요. 다른 모든 운영 체제의 경우 [Docker Desktop 개요](https://docs.docker.com/desktop/)에서 Docker 설명서를 참조하세요.
+ AWS CLI를 설치하고 구성합니다. 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS CLI 최신 버전의 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

로컬 개발 환경이 없거나 필요하지 않고 Amazon EC2 인스턴스를 사용하여 Docker를 사용하려는 경우 다음 단계를 수행하여 Amazon Linux 2023을 사용하는 Amazon EC2 인스턴스를 시작하고 Docker Engine과 Docker CLI를 설치합니다.

### AL2023에 Docker 설치
<a name="create-container-image-install-docker"></a>

Docker는 최신 Linux 배포 버전(Ubuntu 등)을 비롯하여 MacOS 및 Windows 등 다양한 운영 체제에서 사용할 수 있습니다. 특정 운영 체제에 Docker를 설치하는 방법에 대한 자세한 내용은 [Docker 설치 안내서](https://docs.docker.com/engine/installation/#installation)를 참조하세요.

Docker를 사용하기 위해 로컬 개발 시스템이 필요하지 않습니다. Amazon EC2를 이미 사용 중인 경우 Amazon Linux 2023 인스턴스를 시작하고 Docker를 설치하여 시작할 수 있습니다.

이미 Docker가 설치되어 있으면 [Docker 이미지 생성](#create-container-image-create-image) 단계로 건너뜁니다.

**Amazon Linux 2023 AMI를 사용하는 Amazon EC2 인스턴스에 Docker를 설치하려면**

1. 최신 Amazon Linux 2023 AMI에서 인스턴스를 시작합니다. 자세한 내용은 *Amazon EC2 사용 설명서*의 [콘솔에서 인스턴스 시작 마법사를 사용하여 EC2 인스턴스 시작](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)을 참조하세요.

1. 인스턴스에 연결합니다. 자세한 내용은 *Amazon EC2 사용 설명서*의 [EC2 인스턴스에 연결](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect.html)을 참조하세요.

1. 인스턴스에 설치한 패키지 및 패키지 캐시를 업데이트합니다.

   ```
   sudo yum update -y
   ```

1. 최신 Docker Community Edition 패키지를 설치합니다.

   ```
   sudo yum install docker
   ```

1. Docker 서비스를 시작합니다.

   ```
   sudo service docker start
   ```

1. `sudo`를 사용하지 않고도 Docker 명령을 실행할 수 있도록 `docker` 그룹에 `ec2-user`를 추가합니다.

   ```
   sudo usermod -a -G docker ec2-user
   ```

1. 로그아웃하고 다시 로그인해서 새 `docker` 그룹 권한을 선택합니다. 이를 위해 현재 SSH 터미널 창을 닫고 새 창에서 인스턴스를 다시 연결할 수 있습니다. 새 SSH 세션은 해당되는 `docker` 그룹 권한을 갖게 됩니다.

1. `sudo` 없이도 `ec2-user`가 Docker 명령을 실행할 수 있는지 확인합니다.

   ```
   docker info
   ```
**참고**  
경우에 따라서는 `ec2-user`가 Docker 대몬에 액세스할 수 있는 권한을 제공하기 위해 인스턴스를 재부팅해야 할 수도 있습니다. 다음 오류가 표시될 경우 인스턴스를 재부팅합니다.  

   ```
   Cannot connect to the Docker daemon. Is the docker daemon running on this host?
   ```

## Docker 이미지 생성
<a name="create-container-image-create-image"></a>

Amazon ECS 태스크 정의는 컨테이너 이미지를 사용하여 클러스터의 컨테이너 인스턴스에서 컨테이너를 시작합니다. 이 섹션에서는 간단한 웹 애플리케이션의 Docker 이미지를 생성하여 이를 로컬 시스템이나 Amazon EC2 인스턴스에서 테스트한 다음, Amazon ECR 컨테이너 레지스트리에 푸시하여 Amazon ECS 작업 정의에서 사용할 수 있도록 합니다.

**간단한 웹 애플리케이션의 Docker 이미지를 생성하려면**

1. `Dockerfile`이라는 파일을 생성합니다. Dockerfile은 Docker 이미지에 사용할 기본 이미지 및 이를 설치하고 실행할 항목을 설명하는 매니페스트입니다. Dockerfile에 대한 자세한 내용은 [Dockerfile 참조](https://docs.docker.com/reference/dockerfile/)를 참조하세요.

   ```
   touch Dockerfile
   ```

1. 방금 만든 `Dockerfile`을 수정하고 다음 내용을 추가합니다.

   ```
   FROM public.ecr.aws/amazonlinux/amazonlinux:latest
   
   # Update installed packages and install Apache
   RUN yum update -y && \
    yum install -y httpd
   
   # Write hello world message
   RUN echo 'Hello World!' > /var/www/html/index.html
   
   # Configure Apache
   RUN echo 'mkdir -p /var/run/httpd' >> /root/run_apache.sh && \
    echo 'mkdir -p /var/lock/httpd' >> /root/run_apache.sh && \
    echo '/usr/sbin/httpd -D FOREGROUND' >> /root/run_apache.sh && \
    chmod 755 /root/run_apache.sh
   
   EXPOSE 80
   
   CMD /root/run_apache.sh
   ```

   이 Dockerfile은 Amazon ECR 퍼블릭에서 호스팅되는 퍼블릭 Amazon Linux 2023 이미지를 사용합니다. `RUN` 지침은 패키지 캐시를 업데이트하고, 웹 서버의 일부 소프트웨어 패키지를 설치하고, 'Hello World\$1'를 작성합니다. 콘텐츠를 웹 서버 문서 루트에 작성합니다. `EXPOSE` 명령은 컨테이너의 포트 80에서 수신 대기 중임을 나타내며, `CMD` 명령은 웹 서버를 시작합니다.

1. <a name="sample-docker-build-step"></a>Dockerfile에서 Docker 이미지를 빌드합니다.
**참고**  
아래의 명령에서 Docker의 일부 버전에서는 아래 보이는 상대 경로 대신에 Dockerfile의 전체 경로가 필요할 수 있습니다.  
[Apple Silicon](https://support.apple.com/en-gb/116943)과 같은 ARM 기반 시스템에서 명령을 실행하는 경우 --platform 옵션인 ‘--platform linux/amd64’를 사용하세요.

   ```
   docker build -t hello-world .
   ```

1. 컨테이너 이미지를 나열합니다.

   ```
   docker images --filter reference=hello-world
   ```

   출력:

   ```
   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
   hello-world         latest              e9ffedc8c286        4 minutes ago       194MB
   ```

1. 새로 빌드된 이미지를 실행합니다. `-p 80:80` 옵션은 컨테이너에 있는 노출된 포트 80을 호스트 시스템에 있는 포트 80에 매핑합니다.

   ```
   docker run -t -i -p 80:80 hello-world
   ```
**참고**  
Apache 웹 서버로부터의 출력이 터미널 창에 표시됩니다. "`Could not reliably determine the fully qualified domain name`" 메시지는 무시해도 됩니다.

1. 브라우저를 열고 Docker를 실행하고 컨테이너를 호스팅하고 있는 서버를 가리킵니다.
   + EC2 인스턴스를 사용하고 있는 경우 서버의 **Public DNS** 값이며, 이는 SSH로 인스턴스에 연결할 때 사용하는 주소와 동일합니다. 인스턴스의 보안 그룹에서 포트 80에 인바운드 트래픽을 허용해야 합니다.
   + Docker를 로컬에서 실행하고 있는 경우, 브라우저에서 [http://localhost/](http://localhost/)를 가리킵니다.

   "Hello, World\$1" 문이 있는 웹 페이지가 표시됩니다.

1. **Ctrl \$1 c**를 입력하여 Docker 컨테이너를 중지합니다.

## Amazon Elastic 컨테이너 레지스트리에 이미지 푸시
<a name="create-container-image-push-ecr"></a>

Amazon ECR은 AWS 관리형 이미지 레지스트리 서비스입니다. Docker CLI를 사용하여 Amazon ECR 리포지토리에서 이미지를 푸시, 풀링 및 관리할 수 있습니다. Amazon ECR 제품 세부 정보, 주요 고객 사례 연구 및 FAQ에 대해서는 [Amazon Elastic 컨테이너 레지스트리 제품 세부 정보 페이지](https://aws.amazon.com/ecr)를 참조하세요.

**이미지에 태그를 지정하고 Amazon ECR에 푸시하려면**

1. `hello-world` 이미지를 저장할 Amazon ECR 리포지토리를 생성합니다. 출력의 `repositoryUri`를 참고합니다.

   `region`을 AWS 리전(예: `us-east-1`)으로 바꿉니다.

   ```
   aws ecr create-repository --repository-name hello-repository --region region
   ```

   출력:

   ```
   {
       "repository": {
           "registryId": "aws_account_id",
           "repositoryName": "hello-repository",
           "repositoryArn": "arn:aws:ecr:region:aws_account_id:repository/hello-repository",
           "createdAt": 1505337806.0,
           "repositoryUri": "aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository"
       }
   }
   ```

1. `hello-world` 이미지를 이전 단계의 `repositoryUri` 값으로 태그 지정합니다.

   ```
   docker tag hello-world aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
   ```

1. **aws ecr get-login-password** 명령을 실행합니다. 인증할 레지스트리 URI를 지정합니다. 자세한 내용은 *Amazon Elastic Container Registry 사용 설명서*의 [레지스트리 권한](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)을 참조하세요.

   ```
   aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
   ```

   출력:

   ```
   Login Succeeded
   ```
**중요**  
오류가 발생하면 최신 버전의 AWS CLI를 설치하거나 업그레이드합니다. 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS CLI 최신 버전의 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

1. 이전 단계의 `repositoryUri` 값을 사용하여 Amazon ECR로 이미지를 푸시합니다.

   ```
   docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
   ```

## 정리
<a name="create-container-image-cleanup"></a>

Amazon ECS 작업 정의를 생성하고 컨테이너 이미지로 작업을 시작하려면 [다음 단계](#create-container-image-next-steps)(으)로 넘어가세요. Amazon ECR 이미지 실험이 끝나면 이미지 저장 비용을 물지 않도록 리포지토리를 삭제할 수 있습니다.

```
aws ecr delete-repository --repository-name hello-repository --region region --force
```

## 다음 단계
<a name="create-container-image-next-steps"></a>

작업 정의에는 작업 실행 역할이 필요합니다. 자세한 내용은 [Amazon ECS 태스크 실행 IAM 역할](task_execution_IAM_role.md) 섹션을 참조하세요.

컨테이너 이미지를 생성하고 Amazon ECR로 푸시한 후 작업 정의에서 해당 이미지를 사용할 수 있습니다. 자세한 내용은 다음 중 하나를 참조하세요.
+ [Fargate에 대한 Amazon ECS Linux 태스크를 생성하는 방법에 대해 알아보기](getting-started-fargate.md)
+ [Fargate에 대한 Amazon ECS Windows 태스크를 생성하는 방법에 대해 알아보기](Windows_fargate-getting_started.md)
+ [AWS CLI를 사용하여 Fargate에 대한 Amazon ECS Linux 태스크 생성](ECS_AWSCLI_Fargate.md)