Amazon ECR에서 이미지 수명 주기 살펴보기
Amazon ECR에서 이미지 수명 주기 살펴보기
Amazon ECR을 처음 사용한다면 다음 단계에 따라 Docker CLI와 AWS CLI를 사용해 샘플 이미지를 만들고, 기본 레지스트리에 인증하고, 프라이빗 리포지토리를 생성하세요. 그런 다음 프라이빗 리포지토리로 이미지를 push하고 pull합니다. 샘플 이미지 사용을 마치면 샘플 이미지와 리포지토리를 삭제합니다. AWS CLI 대신 AWS Management Console을 사용하려면 Creating an Amazon ECR private repository to store images를 참조하세요. 다양한 AWS SDK, IDE 툴킷, Windows PowerShell 명령줄 도구를 포함해 AWS 리소스를 관리하는 데 사용할 수 있는 다른 도구에 대한 자세한 내용은 http://aws.amazon.com/tools/ 를 참조하세요.
출처: 문서
본문
사전 요구 사항 (Prerequisites)
최신 AWS CLI와 Docker가 설치되어 사용할 준비가 되지 않았다면 다음 단계를 사용해 두 도구를 모두 설치하세요.
AWS CLI 설치
Amazon ECR과 함께 AWS CLI를 사용하려면 최신 AWS CLI 버전을 설치하세요. 자세한 내용은 AWS Command Line Interface User Guide의 Installing the AWS Command Line Interface를 참조하세요.
Docker 설치
Docker는 Ubuntu 같은 대부분의 최신 Linux 배포판은 물론 macOS와 Windows를 포함한 다양한 운영 체제에서 사용할 수 있습니다. 특정 운영 체제에 Docker를 설치하는 방법에 대한 자세한 내용은 Docker 설치 가이드를 참조하세요.
Docker를 사용하기 위해 로컬 개발 시스템이 필요하지는 않습니다. 이미 Amazon EC2를 사용 중이라면 Amazon Linux 2023 인스턴스를 시작하고 Docker를 설치해 시작할 수 있습니다.
이미 Docker가 설치되어 있다면 Step 1: Create a Docker image로 건너뛰세요.
Amazon Linux 2023 AMI를 사용한 Amazon EC2 인스턴스에 Docker 설치
- 최신 Amazon Linux 2023 AMI로 인스턴스를 시작합니다. 자세한 내용은 Amazon EC2 User Guide의 Launching an instance를 참조하세요.
- 인스턴스에 연결합니다. 자세한 내용은 Amazon EC2 User Guide의 Connect to Your Linux Instance를 참조하세요.
- 인스턴스에 설치된 패키지와 패키지 캐시를 업데이트합니다.
sudo yum update -y
- 최신 Docker Community Edition 패키지를 설치합니다.
sudo yum install docker
- Docker 서비스를 시작합니다.
sudo service docker start
- sudo 없이 Docker 명령을 실행할 수 있도록 ec2-user를 docker 그룹에 추가합니다.
sudo usermod -a -G docker ec2-user
- 새 docker 그룹 권한을 적용하려면 로그아웃했다가 다시 로그인합니다. 현재 SSH 터미널 창을 닫고 새 창에서 인스턴스에 다시 연결하면 됩니다. 새 SSH 세션에는 적절한 docker 그룹 권한이 있습니다.
- ec2-user가 sudo 없이 Docker 명령을 실행할 수 있는지 확인합니다.
docker info
참고
경우에 따라 ec2-user가 Docker 데몬에 접근할 권한을 제공하려면 인스턴스를 재부팅해야 할 수 있습니다. 다음 오류가 보이면 인스턴스를 재부팅해 보세요.
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
Step 1: Docker 이미지 생성
이 단계에서는 간단한 웹 애플리케이션의 Docker 이미지를 만들고 로컬 시스템이나 Amazon EC2 인스턴스에서 테스트합니다.
간단한 웹 애플리케이션의 Docker 이미지 생성
- Dockerfile 이라는 파일을 만듭니다. Dockerfile은 Docker 이미지에 사용할 기본 이미지와 이미지에 설치하고 실행할 내용을 설명하는 매니페스트입니다. Dockerfile에 대한 자세한 내용은 Dockerfile Reference를 참조하세요.
touch Dockerfile
- 방금 만든 Dockerfile을 편집하고 다음 내용을 추가합니다.
FROM public.ecr.aws/amazonlinux/amazonlinux:latest
# Install dependencies
RUN yum update -y && \
yum install -y httpd
# Install apache and 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 Public에 호스팅된 퍼블릭 Amazon Linux 2 이미지를 사용합니다. RUN 명령은 패키지 캐시를 업데이트하고 웹 서버용 소프트웨어 패키지 몇 개를 설치한 다음 "Hello World!" 내용을 웹 서버의 문서 루트에 씁니다. EXPOSE 명령은 컨테이너에서 포트 80을 노출하고, CMD 명령은 웹 서버를 시작합니다.
- Dockerfile에서 Docker 이미지를 빌드합니다.
참고
일부 Docker 버전은 아래에 표시된 상대 경로 대신 다음 명령에서 Dockerfile의 전체 경로를 요구할 수 있습니다.
docker build -t hello-world .
- 컨테이너 이미지를 나열합니다.
docker images --filter reference=hello-world
출력:
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest e9ffedc8c286 4 minutes ago 194MB
- 새로 빌드한 이미지를 실행합니다. -p 80:80 옵션은 컨테이너에서 노출된 포트 80을 호스트 시스템의 포트 80에 매핑합니다. docker run에 대한 자세한 내용은 Docker run 참조 문서를 참조하세요.
docker run -t -i -p 80:80 hello-world
참고
Apache 웹 서버의 출력이 터미널 창에 표시됩니다. "Could not reliably determine the fully qualified domain name" 메시지는 무시해도 됩니다.
- 브라우저를 열고 Docker가 실행 중이고 컨테이너를 호스팅하고 있는 서버를 가리킵니다.
- EC2 인스턴스를 사용 중이라면 이는 서버의 Public DNS 값으로, SSH로 인스턴스에 연결할 때 사용하는 것과 같은 주소입니다. 인스턴스의 보안 그룹이 포트 80에서 인바운드 트래픽을 허용하는지 확인하세요.
- Docker를 로컬에서 실행 중이라면 브라우저를 http://localhost/ 로 가리킵니다.
- Windows 또는 Mac 컴퓨터에서 docker-machine을 사용 중이라면 docker-machine ip 명령으로 Docker를 호스팅하는 VirtualBox VM의 IP 주소를 찾고, machine-name을 사용 중인 docker machine의 이름으로 대체합니다.
docker-machine ip machine-name
- "Hello World!" 문구가 있는 웹 페이지가 보여야 합니다.
- Ctrl + c 를 입력해 Docker 컨테이너를 중지합니다.
Step 2: 리포지토리 생성
이제 Amazon ECR로 push할 이미지가 있으므로 이미지를 담을 리포지토리를 생성해야 합니다. 이 예에서는 hello-repository라는 리포지토리를 만들고 나중에 hello-world:latest 이미지를 push합니다. 리포지토리를 생성하려면 다음 명령을 실행합니다.
aws ecr create-repository \
--repository-name hello-repository \
--region region
Step 3: 기본 레지스트리에 인증
AWS CLI를 설치하고 구성한 후에는 Docker CLI를 기본 레지스트리에 인증합니다. 이렇게 하면 docker 명령이 Amazon ECR로 이미지를 push하고 pull할 수 있습니다. AWS CLI는 인증 과정을 간소화하는 get-login-password 명령을 제공합니다.
참고
IAM 보안 주체는 레지스트리에 인증하려면 ecr:GetAuthorizationToken 권한이 있어야 합니다. 자세한 내용은 AWS managed policies for Amazon Elastic Container Registry를 참조하세요.
get-login-password로 Docker를 Amazon ECR 레지스트리에 인증하려면 aws ecr get-login-password 명령을 실행합니다. 인증 토큰을 docker login 명령에 전달할 때 사용자 이름에 AWS 값을 사용하고 인증하려는 Amazon ECR 레지스트리 URI를 지정합니다. 여러 레지스트리에 인증하려면 각 레지스트리에 대해 명령을 반복해야 합니다.
중요
오류가 발생하면 최신 버전의 AWS CLI를 설치하거나 업그레이드하세요. 자세한 내용은 AWS Command Line Interface User Guide의 Installing the 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
Step 4: 이미지를 Amazon ECR로 push
이제 이전 섹션에서 생성한 Amazon ECR 리포지토리로 이미지를 push할 수 있습니다. 다음 사전 요구 사항이 충족된 후 docker CLI를 사용해 이미지를 push합니다.
- 최소 docker 버전 1.7이 설치되어 있어야 합니다.
- Amazon ECR 권한 부여 토큰이 docker login으로 구성되어 있어야 합니다.
- Amazon ECR 리포지토리가 존재하고 사용자가 리포지토리로 push할 수 있는 접근 권한이 있어야 합니다.
해당 사전 요구 사항이 충족되면 계정의 기본 레지스트리에 있는 새로 만든 리포지토리로 이미지를 push할 수 있습니다.
이미지를 Amazon ECR로 태그 지정하고 push하려면
- 로컬에 저장된 이미지를 나열해 태그를 지정하고 push할 이미지를 식별합니다.
docker images
출력:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
hello-world latest e9ffedc8c286 4 minutes ago 241MB
- 리포지토리로 push할 이미지에 태그를 지정합니다.
docker tag hello-world:latest aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
- 이미지를 push합니다.
docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository:latest
출력:
The push refers to a repository [aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository] (len: 1)
e9ae3c220b23: Pushed
a6785352b25c: Pushed
0998bf8fb9e9: Pushed
0a85502c06c9: Pushed
latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE size: 6774
Step 5: Amazon ECR에서 이미지 pull
이미지를 Amazon ECR 리포지토리로 push한 후에는 다른 위치에서 pull할 수 있습니다. 다음 사전 요구 사항이 충족된 후 docker CLI를 사용해 이미지를 pull합니다.
- 최소 docker 버전 1.7이 설치되어 있어야 합니다.
- Amazon ECR 권한 부여 토큰이 docker login으로 구성되어 있어야 합니다.
- Amazon ECR 리포지토리가 존재하고 사용자가 리포지토리에서 pull할 수 있는 접근 권한이 있어야 합니다.
해당 사전 요구 사항이 충족되면 이미지를 pull할 수 있습니다. Amazon ECR에서 예제 이미지를 pull하려면 다음 명령을 실행합니다.
docker pull aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository:latest
출력:
latest: Pulling from hello-repository
0a85502c06c9: Pull complete
0998bf8fb9e9: Pull complete
a6785352b25c: Pull complete
e9ae3c220b23: Pull complete
Digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE
Status: Downloaded newer image for aws_account_id.dkr.region.amazonaws.com/hello-repository:latest
Step 6: 이미지 삭제
리포지토리의 이미지가 더 이상 필요하지 않다면 이미지를 삭제할 수 있습니다. 이미지를 삭제하려면 이미지가 있는 리포지토리를 지정하고 이미지의 imageTag 또는 imageDigest 값 중 하나를 지정합니다. 다음 예는 hello-repository 리포지토리에서 image tag latest인 이미지를 삭제합니다. 리포지토리에서 예제 이미지를 삭제하려면 다음 명령을 실행합니다.
aws ecr batch-delete-image \
--repository-name hello-repository \
--image-ids imageTag=latest \
--region region
Step 7: 리포지토리 삭제
이미지 리포지토리 전체가 더 이상 필요하지 않다면 리포지토리를 삭제할 수 있습니다. 다음 예는 --force 플래그를 사용해 이미지가 포함된 리포지토리를 삭제합니다. 이미지가 포함된 리포지토리(및 그 안의 모든 이미지)를 삭제하려면 다음 명령을 실행합니다.
aws ecr delete-repository \
--repository-name hello-repository \
--force \
--region region
더 알아보기 (Learn more)
- Amazon ECR 프라이빗 리포지토리 생성
- Amazon ECR 프라이빗 리포지토리
- AWS CLI 설치