AWS CLI에서 Amazon ECR 사용 - Amazon ECR

AWS CLI에서 Amazon ECR 사용

다음 단계는 Docker CLI 및 AWS CLI을(를) 사용하여 컨테이너 이미지를 처음으로 프라이빗 Amazon ECR 리포지토리에 푸시하는 데 필요한 단계를 안내합니다.

다양한 AWS SDK, IDE 도구 키트 및 Windows PowerShell 명령줄 도구를 비롯하여 AWS 리소스를 관리하는 데 사용할 수 있는 다른 도구에 대한 자세한 내용은 http://aws.amazon.com/tools/를 참조하십시오.

Prerequisites

시작하기 전에 먼저 Amazon ECR을 사용하여 설정의 단계를 완료해야 합니다.

최신 AWS CLI 및 Docker가 설치되어 있지 않고 사용할 준비가 되어 있는 경우, 다음 단계를 사용하여 이러한 도구를 모두 설치하십시오.

AWS CLI 설치

AWS 명령줄 도구를 사용하여 시스템 명령줄에서 명령을 실행하여 Amazon ECR 및 기타 AWS 작업을 수행할 수 있습니다. 명령줄을 사용하는 것이 콘솔을 사용하는 것보다 더 빠르고 편리할 수 있습니다. 명령줄 도구는 AWS 작업을 수행하는 스크립트를 작성할 때도 유용합니다.

Amazon ECR에 AWS CLI을(를) 사용하려면 최신 AWS CLI 버전을 설치하십시오(기능은 1.9.15 버전으로 시작하는 AWS CLI에서 사용 가능). AWS CLI 버전은 aws --version 명령을 통해 확인할 수 있습니다. AWS CLI 설치 또는 최신 버전으로의 업그레이드 방법에 대한 내용은 AWS Command Line Interface사용 설명서설치AWS Command Line Interface를 참조하십시오.

Docker 설치

Docker는 최신 Linux 배포 버전(Ubuntu 등)을 비롯하여 MacOS 및 Windows 등 다양한 운영 체제에서 사용할 수 있습니다. 특정 운영 체제에 Docker를 설치하는 방법에 대한 자세한 내용은 Docker 설치 안내서를 참조하십시오.

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

이미 Docker가 설치되어 있으면 1단계: 도커 이미지 생성 단계로 건너뜁니다.

Amazon EC2 인스턴스에 Docker 설치

  1. Amazon Linux 2 AMI 인스턴스를 시작합니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서인스턴스 실행을 참조하세요.

  2. 인스턴스에 연결합니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 Linux 인스턴스에 연결을 참조하세요.

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

    sudo yum update -y
  4. 최신 Docker Community Edition 패키지를 설치합니다.

    sudo amazon-linux-extras install docker
  5. Docker 서비스를 시작합니다.

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

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

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

    docker info
    참고

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

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

1단계: 도커 이미지 생성

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

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

  1. Dockerfile이라는 파일을 생성합니다. Dockerfile은 Docker 이미지에 사용할 기본 이미지 및 이를 설치하고 실행할 항목을 설명하는 매니페스트입니다. Dockerfile에 대한 자세한 내용은 Dockerfile 참조를 참조하세요.

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

    FROM ubuntu:18.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

    이 Dockerfile은 Ubuntu 18.04 이미지를 사용합니다. RUN 지침은 패키지 캐시를 업데이트하고, 웹 서버의 일부 소프트웨어 패키지를 설치하고, "Hello World!" 내용을 웹 서버의 문서 루트에 씁니다. EXPOSE 지침은 컨테이너에 포트 80을 노출하고 CMD 지침은 웹 서버를 시작합니다.

  3. Dockerfile에서 Docker 이미지를 빌드합니다.

    참고

    아래의 명령에서 Docker의 일부 버전에서는 아래 보이는 상대 경로 대신에 Dockerfile의 전체 경로가 필요할 수 있습니다.

    docker build -t hello-world .
  4. docker images를 실행하여 이미지가 올바로 생성되었는지 확인합니다.

    docker images --filter reference=hello-world

    결과:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
  5. 새로 빌드된 이미지를 실행합니다. -p 80:80 옵션은 컨테이너에 있는 노출된 포트 80을 호스트 시스템에 있는 포트 80에 매핑합니다. docker run에 대한 자세한 내용을 보려면 Docker 실행 참조를 참조하세요.

    docker run -t -i -p 80:80 hello-world
    참고

    Apache 웹 서버로부터의 출력이 터미널 창에 표시됩니다. "Could not reliably determine the server's fully qualified domain name" 메시지는 무시해도 됩니다.

  6. 브라우저를 열고 Docker를 실행하고 컨테이너를 호스팅하고 있는 서버를 가리킵니다.

    • EC2 인스턴스를 사용하고 있는 경우 서버의 Public DNS 값이며, 이는 SSH로 인스턴스에 연결할 때 사용하는 주소와 동일합니다. 인스턴스의 보안 그룹에서 포트 80에 인바운드 트래픽을 허용해야 합니다.

    • Docker를 로컬에서 실행하고 있는 경우, 브라우저에서 http://localhost/를 가리킵니다.

    • Windows 또는 macOS 컴퓨터에서 docker-machine을(를) 사용하는 경우, docker-machine ip 명령을 사용하여 Docker를 호스트하고 있는 VirtualBox VM의 IP 주소를 찾고, 사용하고 있는 Docker 머신의 이름으로 machine-name을 바꿉니다.

      docker-machine ip machine-name

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

  7. Ctrl + c를 입력하여 Docker 컨테이너를 중지합니다.

2단계: 기본 레지스트리에 대해 인증

AWS CLI를 설치 및 구성했으면, 기본 레지스트리에 대해 Docker CLI를 인증합니다. 이렇게 하면 docker 명령이 Amazon ECR을 사용하여 이미지를 푸시하고 가져올 수 있습니다. AWS CLI는 인증 절차를 간소화하는 get-login-password 명령을 제공합니다.

get-login-password는 AWS CLI을(를) 사용 시 Amazon ECR 프라이빗 레지스트리에 인증하는 데 선호되는 방법입니다. AWS와 상호 작용하기 위해 AWS CLI을(를) 구성했는지 확인합니다. 자세한 내용은 AWS Command Line Interface사용 설명서AWS CLI구성 기초 섹션을 참조하세요.

Amazon ECR 인증 토큰을 docker login 명령에 전달할 때 사용자 이름으로 AWS 값을 사용하고, 인증하려는 Amazon ECR 레지스트리 URI를 지정합니다. 여러 레지스트리에 대해 인증하는 경우 각 레지스트리에 대해 명령을 반복해야 합니다.

중요

오류가 발생하면 최신 버전의 AWS CLI를 설치하거나 업그레이드합니다. 자세한 내용은 AWS Command Line Interface 사용 설명서에서 AWS Command Line Interface 설치를 참조하세요.

  • get-login-password(AWS CLI)

    aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  • Get-ECRLoginCommand(AWS Tools for Windows PowerShell)

    (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

3단계: 리포지토리 생성

Amazon ECR에 푸시할 이미지가 준비되었으면 이를 보유할 리포지토리를 생성해야 합니다. 이 예에서는 hello-world라는 리포지토리를 생성합니다. 나중에 이 리포지토리에 hello-world:latest 이미지를 푸시하게 됩니다. 리포지토리를 생성하려면 다음 명령을 실행합니다.

aws ecr create-repository \ --repository-name hello-world \ --image-scanning-configuration scanOnPush=true \ --region region

4단계: Amazon ECR에 이미지 푸시

이제 이전 섹션에서 생성한 Amazon ECR 리포지토리에 이미지를 푸시할 수 있습니다. docker CLI를 사용하여 이미지를 푸시할 수 있지만, 이 작업이 제대로 작동하려면 몇 가지 사전 조건을 만족해야 합니다.

  • docker의 최소 버전 1.7이 설치되어 있습니다.

  • Amazon ECR 권한 부여 토큰이 docker login를 통해 구성되었습니다.

  • Amazon ECR 리포지토리가 있으며 사용자에게 리포지토리를 푸시할 수 있는 액세스 권한이 있습니다.

이러한 사전 조건이 만족되면, 계정의 기본 레지스트리에 있는 새롭게 생성된 리포지토리에 이미지를 푸시할 수 있습니다.

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

  1. 태그를 지정하고 푸시할 이미지를 식별할 수 있도록 로컬에 저장한 이미지를 나열합니다.

    docker images

    결과:

    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
  2. 리포지토리에 푸시할 이미지에 태그를 지정합니다.

    docker tag hello-world:latest aws_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
  3. 이미지를 푸시합니다.

    docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest

    결과:

    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

5단계: Amazon ECR에서 이미지 가져오기

이미지를 Amazon ECR 리포지토리에 푸시한 후 이를 다른 위치에서 가져올 수 있습니다. docker CLI를 사용하여 이미지를 가져오려고 하는데, 이 작업이 제대로 작동하려면 몇 가지 사전 조건을 만족해야 합니다.

  • docker의 최소 버전 1.7이 설치되어 있습니다.

  • Amazon ECR 권한 부여 토큰이 docker login을(를) 통해 구성되었습니다.

  • Amazon ECR 리포지토리가 있어야 하며 사용자에게 리포지토리로부터 가져올 수 있는 액세스 권한이 있어야 합니다.

이러한 사전 조건이 만족되면 이미지를 가져올 수 있습니다. Amazon ECR에서 예제 이미지를 가져오려면, 다음 명령을 실행합니다.

docker pull aws_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest

결과:

latest: Pulling from hello-world
0a85502c06c9: Pull complete
0998bf8fb9e9: Pull complete
a6785352b25c: Pull complete
e9ae3c220b23: Pull complete
Digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b
Status: Downloaded newer image for aws_account_id.dkr.region.amazonaws.com/hello-world:latest

6단계: 이미지 삭제

리포지토리 중 하나에 있는 이미지가 더 이상 필요하지 않거나 저장해 두기 싫은 경우 batch-delete-image 명령을 사용하여 이를 삭제할 수 있습니다. 이미지를 삭제하려면 이미지가 들어 있는 리포지토리 및 이미지의 imageTag 또는 imageDigest 값을 지정해야 합니다. 다음은 이미지 태그 hello-world를 사용하여 latest 리포지토리에 있는 이미지를 삭제하는 예제입니다.

aws ecr batch-delete-image \ --repository-name hello-world \ --image-ids imageTag=latest \ --region region

결과:

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

7단계: 리포지토리 삭제

이미지의 전체 리포지토리가 더 이상 필요하지 않거나 저장해 두고 싶지 않으면 리포지토리를 삭제하면 됩니다. 기본적으로, 이미지가 들어 있는 리포지토리는 삭제할 수 없지만, --force 플래그를 사용하면 가능합니다. 이미지가 들어 있는 리포지토리(및 리포지토리 안에 있는 모든 이미지)를 삭제하려면 다음 명령을 실행합니다.

aws ecr delete-repository \ --repository-name hello-world \ --force \ --region region