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 설치
-
Amazon Linux 2 AMI 인스턴스를 시작합니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서의 인스턴스 실행을 참조하세요.
-
인스턴스에 연결합니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 Linux 인스턴스에 연결을 참조하세요.
-
인스턴스에 설치한 패키지 및 패키지 캐시를 업데이트합니다.
sudo yum update -y
-
최신 Docker Community Edition 패키지를 설치합니다.
sudo amazon-linux-extras install docker
-
Docker 서비스를 시작합니다.
sudo service docker start
-
sudo
를 사용하지 않고도 Docker 명령을 실행할 수 있도록docker
그룹에ec2-user
를 추가합니다.sudo usermod -a -G docker ec2-user
-
로그아웃하고 다시 로그인해서 새
docker
그룹 권한을 선택합니다. 이를 위해 현재 SSH 터미널 창을 닫고 새 창에서 인스턴스를 다시 연결할 수 있습니다. 새 SSH 세션은 해당되는docker
그룹 권한을 갖게 됩니다. -
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 이미지를 생성하려면
-
Dockerfile
이라는 파일을 생성합니다. Dockerfile은 Docker 이미지에 사용할 기본 이미지 및 이를 설치하고 실행할 항목을 설명하는 매니페스트입니다. Dockerfile에 대한 자세한 내용은 Dockerfile 참조를 참조하세요. touch Dockerfile
-
방금 만든
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
지침은 웹 서버를 시작합니다. -
Dockerfile에서 Docker 이미지를 빌드합니다.
참고 아래의 명령에서 Docker의 일부 버전에서는 아래 보이는 상대 경로 대신에 Dockerfile의 전체 경로가 필요할 수 있습니다.
docker build -t hello-world .
-
docker images를 실행하여 이미지가 올바로 생성되었는지 확인합니다.
docker images --filter reference=hello-world
결과:
REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
-
새로 빌드된 이미지를 실행합니다.
-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
" 메시지는 무시해도 됩니다. -
브라우저를 열고 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!" 문이 있는 웹 페이지가 표시됩니다.
-
-
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
.dkr.ecr.aws_account_id
region
.amazonaws.com -
Get-ECRLoginCommand(AWS Tools for Windows PowerShell)
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin
.dkr.ecr.aws_account_id
region
.amazonaws.com
3단계: 리포지토리 생성
Amazon ECR에 푸시할 이미지가 준비되었으면 이를 보유할 리포지토리를 생성해야 합니다. 이 예에서는 hello-world
라는 리포지토리를 생성합니다. 나중에 이 리포지토리에 hello-world:latest
이미지를 푸시하게 됩니다. 리포지토리를 생성하려면 다음 명령을 실행합니다.
aws ecr create-repository \ --repository-name
hello-world
\ --image-scanning-configuration scanOnPush=true
\ --regionregion
4단계: Amazon ECR에 이미지 푸시
이제 이전 섹션에서 생성한 Amazon ECR 리포지토리에 이미지를 푸시할 수 있습니다. docker CLI를 사용하여 이미지를 푸시할 수 있지만, 이 작업이 제대로 작동하려면 몇 가지 사전 조건을 만족해야 합니다.
-
docker의 최소 버전 1.7이 설치되어 있습니다.
-
Amazon ECR 권한 부여 토큰이 docker login를 통해 구성되었습니다.
-
Amazon ECR 리포지토리가 있으며 사용자에게 리포지토리를 푸시할 수 있는 액세스 권한이 있습니다.
이러한 사전 조건이 만족되면, 계정의 기본 레지스트리에 있는 새롭게 생성된 리포지토리에 이미지를 푸시할 수 있습니다.
이미지에 태그를 지정하고 Amazon ECR에 푸시하려면
-
태그를 지정하고 푸시할 이미지를 식별할 수 있도록 로컬에 저장한 이미지를 나열합니다.
docker images
결과:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
-
리포지토리에 푸시할 이미지에 태그를 지정합니다.
docker tag hello-world:latest
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-world:latest -
이미지를 푸시합니다.
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 foraws_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