

 AWS Cloud9 는 더 이상 신규 고객이 사용할 수 없습니다. AWS Cloud9 의 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. [자세히 알아보기](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

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

# 에서 Amazon ECR 서비스 작업 AWS Cloud9
<a name="ecr-working"></a>

 AWS Cloud9 IDE의 AWS 탐색기에서 직접 Amazon Elastic Container Registry(Amazon ECR) 서비스에 액세스할 수 있습니다. Amazon ECR을 사용하여 Amazon ECR 리포지토리에 프로그램 이미지를 푸시할 수 있습니다. 시작하려면 다음 단계를 따릅니다.

1. 이미지를 빌드하는 데 필요한 정보가 포함된 Dockerfile을 생성합니다.

1. 해당 Dockerfile에서 이미지를 빌드하고 처리할 이미지에 태그를 지정합니다.

1. Amazon ECR 인스턴스 내부에 리포지토리를 생성합니다.

1. 리포지토리에 태그가 지정된 이미지를 푸시합니다.

**Topics**
+ [사전 조건](#prereqs-vscode-ecr)
+ [1. Dockerfile 생성](#dockerfile-ecr-cloud9toolkit)
+ [2. Dockerfile에서 이미지 빌드](#build-docker-image)
+ [3. 새 리포지토리 생성](#create-repository)
+ [4. 이미지 푸시, 가져오기, 삭제](#push-image)

## 사전 조건
<a name="prereqs-vscode-ecr"></a>

 AWS 도구 키트의 Amazon ECR 기능을 사용하려면 먼저 이러한 사전 조건을 AWS Cloud9충족해야 합니다. [사전 조건](ecr.md#prereqs-awstoolkit-vscode-ecr) 이러한 사전 조건은 AWS Cloud9 IDE for AWS Cloud9 Amazon EC2 환경에 사전 설치되어 있으며 Amazon ECR에 액세스하는 데 필요합니다.

## 1. Dockerfile 생성
<a name="dockerfile-ecr-cloud9toolkit"></a>

Docker는 Dockerfile이라는 파일을 사용하여 원격 리포지토리에 푸시하고 저장할 수 있는 이미지를 정의합니다. 이미지를 ECR 리포지토리에 업로드하려면 먼저 Dockerfile을 생성한 다음 해당 Dockerfile에서 이미지를 빌드해야 합니다.

**Dockerfile 생성**

1. Dockerfile을 저장할 디렉터리로 이동하려면 AWS Cloud9 IDE의 왼쪽 탐색 표시줄에서 **Toggle Tree**(트리 전환) 옵션을 선택합니다.

1. **Dockerfile**이라는 새 파일을 생성합니다.
**참고**  
AWS Cloud9 IDE에서 파일 유형 또는 파일 확장명을 선택하라는 메시지가 표시될 수 있습니다. 이 경우 **plaintext**. AWS Cloud9 IDE에는 "dockerfile" 확장자가 있습니다를 선택합니다. 그러나 사용하지 않는 것이 좋습니다. 이 확장자가 특정 버전의 Docker 또는 기타 관련 애플리케이션과 충돌을 일으킬 수 있기 때문입니다.

**AWS Cloud9 IDE를 사용하여 Dockerfile 편집**

Dockerfile에 파일 확장자가 있는 경우 파일에 대한 컨텍스트(마우스 오른쪽 버튼 클릭) 메뉴를 열고 해당 파일 확장자를 제거합니다. 확장자가 있는 Dockerfile은 특정 버전의 Docker 또는 기타 관련 애플리케이션과 충돌을 일으킬 수 있기 때문입니다.

Dockerfile에서 파일 확장자를 제거한 후 다음을 수행합니다.

1.  AWS Cloud9 IDE에서 빈 Dockerfile을 직접 엽니다.

1. 다음 예제의 내용을 Dockerfile에 복사합니다.  
**Example Dockerfile 이미지 템플릿**  

   ```
   FROM ubuntu:22.04
   
   # Install dependencies
   RUN apt-get update && \
    apt-get -y install apache2
   
   # Install apache and write hello world message
   RUN echo 'Hello World!' > /var/www/html/index.html
   
   # Configure apache
   RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
    echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
    echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
    echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
    chmod 755 /root/run_apache.sh
   
   EXPOSE 80
   
   CMD /root/run_apache.sh
   ```

   이것은 Ubuntu 22.04 이미지를 사용하는 Dockerfile입니다. **RUN** 명령은 패키지 캐시를 업데이트합니다. 웹 서버용 소프트웨어 패키지를 설치하고 'Hello World\!'를 웹 서버의 문서 루트에 작성합니다. **EXPOSE** 명령은 컨테이너에 포트 80을 노출하고 **CMD** 명령은 웹 서버를 시작합니다.

1. Dockerfile을 저장합니다.

## 2. Dockerfile에서 이미지 빌드
<a name="build-docker-image"></a>

생성한 Dockerfile에는 프로그램의 이미지를 빌드하는 데 필요한 정보가 포함되어 있습니다. 해당 이미지를 Amazon ECR 인스턴스로 푸시하려면 먼저 이미지를 빌드해야 합니다.

**Dockerfile에서 이미지 빌드**

1. Dockerfile이 포함된 디렉터리로 이동하려면 Docker CLI 또는 Docker 인스턴스와 통합된 CLI를 사용합니다.

1. Dockerfile에 정의된 이미지를 빌드하려면 Dockerfile과 동일한 디렉터리에서 **Docker build** 명령을 실행합니다.

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

1. 이미지가 올바르게 생성되었는지 확인하려면 **Docker images** 명령을 실행합니다.

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

   출력값은 다음과 같습니다.

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

1. Ubuntu 22.04를 기반으로 새로 빌드된 이미지를 실행하려면 **echo** 명령을 사용합니다.
**참고**  
이 단계는 이미지를 생성하거나 푸시하는 데 필요하지 않습니다. 그러나 프로그램 이미지가 실행되면 어떻게 작동하는지 확인할 수 있습니다.

   ```
   FROM ubuntu:22.04
   CMD ["echo", "Hello from Docker in Cloud9"]
   ```

   그런 다음 Dockerfile을 실행하고 빌드합니다. Dockerfile과 동일한 디렉터리에서 이 명령을 실행해야 합니다.

   ```
   docker build -t hello-world .
   docker run --rm hello-world
   ```  
**Example**  

   출력값은 다음과 같습니다.

   ```
   Hello from Docker in Cloud9
   ```

   **Docker run** 명령에 대한 자세한 내용은 Docker 웹 사이트에서 [Docker run reference](https://docs.docker.com/engine/reference/run/)(Docker 실행 참조)를 참조하세요.

## 3. 새 리포지토리 생성
<a name="create-repository"></a>

이미지를 Amazon ECR 인스턴스에 업로드하려면 이미지를 저장할 수 있는 새 리포지토리를 생성합니다.

**새 Amazon ECT 리포지토리 생성**

1.  AWS Cloud9 IDE 탐색 모음에서 **AWS 도구 키트 아이콘을** 선택합니다.

1.  AWS Explorer 메뉴를 확장합니다.

1. 와 연결된 기본 AWS 리전 값을 찾습니다 AWS 계정. 그런 다음 AWS Cloud9 IDE를 통해 제공되는 서비스 목록을 보려면 선택합니다.

1. **ECR** 옵션의 컨텍스트(마우스 오른쪽 버튼 클릭) 메뉴를 열고 **Create new repository**(새 리포지토리 생성) 프로세스를 시작합니다. 그런 다음 **Create Repository**(리포지토리 생성)를 선택합니다.

1. 프롬프트의 메시지를 따라 프로세스를 완료합니다.

1. 프로세스가 완료되면 AWS 탐색기 메뉴의 **ECR** 섹션에서 새 리포지토리에 액세스할 수 있습니다.

## 4. 이미지 푸시, 가져오기, 삭제
<a name="push-image"></a>

Dockerfile에서 이미지를 빌드하고 리포지토리를 생성한 후에는 Amazon ECR 리포지토리로 이미지를 푸시할 수 있습니다. 또한 Docker 및 AWS CLI와 함께 AWS Explorer를 사용하여 다음을 수행할 수 있습니다.
+ 리포지토리에서 이미지를 가져옵니다.
+ 리포지토리에 저장된 이미지를 삭제합니다.
+ 리포지토리를 삭제합니다.

**기본 레지스트리에 대해 Docker 인증**

Amazon ECR과 Docker 인스턴스 간에 데이터를 교환하려면 인증이 필요합니다. 레지스트리에 대해 Docker를 인증하려면 다음을 수행합니다.

1.  AWS Cloud9 IDE 내에서 터미널을 엽니다.

1. **get-login-password** 메서드를 사용하여 프라이빗 ECR 레지스트리에 인증하고 리전과 AWS 계정 ID를 입력합니다.

   ```
   aws ecr get-login-password \
       --region <region> \
   | docker login \
       --username AWS \
       --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
   ```
**중요**  
앞의 명령에서 **region** 및 **AWS\_account\_id**를 AWS 계정과 관련된 정보로 바꿉니다. 유효한 **region** 값은 *us-east-1*입니다.

**이미지 태그 지정 및 리포지토리에 푸시**

의 인스턴스로 Docker를 인증한 후 이미지를 리포지토리에 AWS푸시합니다.

1. **docker images** 명령을 사용하여 로컬에 저장한 이미지를 보고 태그를 지정할 이미지를 식별합니다. 

   ```
   docker images
   ```  
**Example**  

   출력값은 다음과 같습니다.

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

1. **Docker tag** 명령을 사용하여 이미지에 태그를 지정합니다.

   ```
   docker tag hello-world:latest AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
   ```

1. **Docker push** 명령을 사용하여 태그가 지정된 이미지를 리포지토리에 푸시합니다.
**중요**  
로컬 리포지토리의 이름이 AWS Amazon EC2 리포지토리와 동일한지 확인합니다. 이 예에서는 두 리포지토리의 이름이 모두 `hello-world`여야 합니다. Docker를 사용하여 이미지를 푸시하는 방법에 대한 자세한 내용은 [도커 이미지 푸시](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)를 참조하세요.

   ```
   docker push AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
   ```  
**Example**  

   출력값은 다음과 같습니다.

   ```
   The push refers to a repository [AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world] (len: 1)
   e9ae3c220b23: Pushed
   a6785352b25c: Pushed
   0998bf8fb9e9: Pushed
   0a85502c06c9: Pushed
   latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b size: 6774
   ```

태그가 지정된 이미지가 리포지토리에 성공적으로 업로드되면 탐색기 탭에서 AWS 탐색기 새로 고침을 선택하여 AWS 도구 키트를 새로 고칩니다. **** 그러면 AWS Cloud9 IDE의 AWS 탐색기 메뉴에 표시됩니다.

**Amazon ECR에서 이미지 가져오기**
+ **Docker tag** 명령의 로컬 인스턴스로 이미지를 가져올 수 있습니다.

  ```
  docker pull AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
  ```  
**Example**  

  출력값은 다음과 같습니다.

  ```
  azonaws.com/hello-world:latest
  latest: Pulling from hello-world
  Digest: sha256:e02c521fd65eae4ef1acb746883df48de85d55fc85a4172a09a124b11b339f5e
  Status: Image is up to date for 922327013870.dkr.ecr.us-west-2.amazonaws.com/hello-world.latest
  ```

**Amazon ECR 리포지토리에서 이미지 삭제**

 AWS Cloud9 IDE에서 이미지를 삭제하는 방법에는 두 가지가 있습니다. 첫 번째 방법은 AWS 탐색기를 사용하는 것입니다.

1.  AWS 탐색기에서 **ECR** 메뉴를 확장합니다.

1. 이미지를 삭제할 리포지토리를 확장합니다.

1. 삭제할 이미지와 연결된 이미지 태그의 컨텍스트(마우스 오른쪽 버튼 클릭) 메뉴를 엽니다.

1. 해당 태그와 연결된 저장된 이미지를 모두 삭제하려면 **Delete Tag...**(태그 삭제)를 선택합니다.

**AWS CLI를 사용하여 이미지 삭제**
+ **AWS ecr batch-delete-image** 명령을 사용하여 리포지토리에서 이미지를 삭제할 수도 있습니다.

  ```
  aws ecr batch-delete-image \
        --repository-name hello-world \
        --image-ids imageTag=latest
  ```  
**Example**  

  출력값은 다음과 같습니다.

  ```
  {
      "failures": [],
      "imageIds": [
          {
              "imageTag": "latest",
              "imageDigest": "sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b"
          }
      ]
  }
  ```

**Amazon ECR 인스턴스에서 리포지토리 삭제**

IDE에서 AWS Cloud9 리포지토리를 삭제하는 방법에는 두 가지가 있습니다. 첫 번째 방법은 AWS 탐색기를 사용하는 것입니다.

1.  AWS 탐색기에서 **ECR** 메뉴를 확장합니다.

1. 삭제할 리포지토리에 대한 컨텍스트(마우스 오른쪽 버튼 클릭) 메뉴를 엽니다.

1. **Delete Repository...**(리포지토리 삭제...)를 선택합니다.

**AWS CLI에서 Amazon ECR 리포지토리 삭제**
+ **AWS ecr delete-repository** 명령을 사용하여 리포지토리를 삭제할 수 있습니다.
**참고**  
일반적으로 리포지토리에 포함된 이미지를 먼저 삭제하지 않으면 리포지토리를 삭제할 수 없습니다. 하지만 **--force** 플래그를 추가하면 리포지토리와 모든 해당 이미지를 한 번에 삭제할 수 있습니다.

  ```
          aws ecr delete-repository \
        --repository-name hello-world \
        --force
  ```  
**Example**  

  출력값은 다음과 같습니다.

  ```
  --repository-name hello-world --force
  {
      "repository": {
          "repositoryUri": "922327013870.dkr.ecr.us-west-2.amazonaws.com/hello-world", 
          "registryId": "922327013870", 
          "imageTagMutability": "MUTABLE", 
          "repositoryArn": "arn:aws:ecr:us-west-2:922327013870:repository/hello-world", 
          "repositoryName": "hello-world", 
          "createdAt": 1664469874.0
      }
  }
  ```