오늘은 ASC 2주차 세션에서 배운 ECR 핸즈온 실습 내용을 정리해보려고 한다.
실습을 들어가기에 앞서 ECR이 무엇인지 알아보자!
📌 Elastic Container Registry란?
Amazon ECR은 AWS 관리형 Container image registry service로,
도커 이미지, Open Container Initiative(OCI) 이미지 및 호환 아티팩트를 push, pull 및 관리할 수 있는 서비스이다.
AWS IAM을 사용해 리소스 기반 권한으로 프라이빗 컨테이너 이미지 레포지토리를 지원하므로 지정된 사용자 또는 Amazon EC2 인스턴스가 컨테이너 레포지토리 및 이미지에 액세스할 수 있다.
비용은 글 작성 시점 기준으로 프리티어는 월 500MB까지 무료이고, 프리티어 한도를 초과하는 경우에는 GB/월당 0.10 USD라고 한다.
Amazon ECR 신규 고객은 AWS 프리 티어의 일부로 프라이빗 리포지토리에 대한 월 500MB의 스토리지를 1년간 받습니다.
신규 및 기존 고객은 모두 퍼블릭 리포지토리에 대한 월 50GB의 항상 무료 스토리지를 받습니다. 매월 퍼블릭 리포지토리에서(AWS 계정을 사용하지 않고) 익명으로 500GB의 데이터를 인터넷으로 전송할 수 있습니다. AWS 계정에 가입하거나 기존 AWS 계정으로 Amazon ECR에 인증하는 경우 매월 5TB의 데이터를 퍼블릭 리포지토리에서 인터넷으로 무료로 전송할 수 있습니다. 또한, 퍼블릭 리포지토리에서 모든 AWS 리전의 AWS 컴퓨팅 리소스로 데이터를 전송할 때는 무제한 대역폭을 무료로 사용할 수 있습니다.
📌 ECR 사용해보기
1. IAM 생성
aws ECR에 접근하기 위해 IAM을 생성해준다.
나는 root라서 AdministratorAccess 권한을 주었지만,
ECR만 사용하는 유저라면 AmazonEC2ContainerRegistryFullAccess 권한만 주면 된다.
사용자를 만들고 보안자격증명 탭에 들어가서 액세스 키 발급을 해준다.
2. aws configure 설정
위에서 발급한 액세스키, secret 키를 가지고 aws configure 설정을 해준다.
나는 프로필을 만들고 해당 프로필로 전환했지만, 프로필을 사용하지 않는다면 그냥 aws configure만 쳐서 설정해주면 된다.
# 인증정보 설정 (프로필 사용 X, default 인증정보 설정)
>> aws configure
# profile 등록
>> aws configure --profile <PROFILE_NAME>
# profile 리스트 확인
>> aws configure list
# 해당 프로필로 전환
>> export AWS_PROFILE="<PROFILE_NAME>"
# 프로필 전환 확인
>> aws sts get-caller-identity
아래 사진처럼 인증정보를 입력해주면 된다.
3. ECR 생성
Elastic Container Registry에 들어가서 리포지토리 생성을 해준다.
이름만 설정해주고 나머지는 기본값으로 두면 된다.
4. Docker Image 빌드
cmd창에서 빌드할 프로젝트 위치로 이동한 다음 Docker Image를 빌드해준다.
ECR 레포지토리를 선택한 후 푸시 명령 보기를 누르면 복사할 수 있는 명령어가 나오니 이걸 사용하면 된다.
먼저 빌드하기 전에 Docker 클라이언트 인증을 해준다. (푸시명령보기 - 1번)
>> aws ecr get-login-password --region <REGION> | docker login --username <USER> --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com
그다음 도커 이미지를 빌드해준다. (푸시명령보기 - 2번)
>> docker build -t <IMAGE_NAME> .
아래 명령어를 쳐서 이미지가 만들어졌는지 확인할 수 있다. (아니면 도커 데스크탑으로 확인해도 된다)
>> docker images
5. Docker Container 실행
나같은 경우에는 프로젝트가 5000번 포트를 사용하고 있기 때문에 -p 명령을 사용해주었고
컨테이너 이름도 설정해주었다.
# 기본 포맷
>> docker run (<옵션>) <이미지 식별자> (<명령어>) (<인자>)
# -p 옵션
>> docker run --name <CONTAINER_NAME> -p <HOST_PORT>:<CONTAINER_PORT> <IMAGE_NAME>
프로젝트가 잘 돌아가는 걸 확인할 수 있다!
❗️ 참고 ❗️
맥북에서는 5000번 포트를 AirPlay가 사용하고 있으므로, 5000번 포트를 사용하고 싶다면 설정에서 General > AirDrop & Handoff > AirPlay Receiver를 꺼주면 된다. 나는 잠깐 실습만 하는거라서 끄고 진행해주었다.
6. Docker Tag 설정
ECR에 푸시하기 위해 도커 이미지 이름을 변경해준다. (푸시명령보기 - 3번)
엄밀히 말하면 이름을 변경한 것이 아니라, 이미지를 복사하면서 이름을 새로 설정해준 것이다.
>> docker tag <IMAGE_NAME>:<TAG> <NEW_IMAGE_NAME>:<NEW_TAG>
여기서 <NEW_IMAGE_NAME>은
<AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<IMAGE_NAME> 형식이어야 한다.
(도커 허브에 이미지를 푸시할 때 <도커 아이디>/<이미지명>의 형식을 지켜야하는 것처럼!)
7. Docker Image Push
위에서 바꾼 이미지 이름으로 ECR에 이미지를 푸시한다. (푸시명령보기 - 4번)
>> docker push <IMAGE_NAME>:<TAG>
ECR 레포에 가보면 이렇게 이미지가 올라간 걸 확인할 수 있다.
8. Docker Image Pull
먼저 기존에 push할 때 썼던 image들을 지워준다.
# 이미지 목록 확인
>> docker images
# 사용 중인 컨테이너 확인
>> docker ps -a --filter ancestor=<IMAGE_NAME>:<TAG>
# 삭제할 이미지를 사용하는 컨테이너 삭제
>> docker rm <CONTAINER_ID>
# or
>> docker rm -f $(docker ps -aq --filter ancestor=<IMAGE_NAME>:<TAG>)
# 이미지 삭제
>> docker rmi <IMAGE_NAME>
그다음 pull을 받아본다.
image uri는 ECR에서 image를 누르면 확인할 수 있다.
>> docker pull <IMAGE_URI>
이제 docker images 명령으로 확인해보면 image가 잘 받아와진 것을 확인할 수 있다.