개요
- 도커 이미지를 ECR에 푸시하고 접근하는 방법을 정리한다.
- 쿠버네티스에서의 ECR 사용방법도 정리한다.
ECR에 이미지 푸시하기
전제조건
aws-cli와 Docker가 설치되어 있어야 한다.
$ aws --version
aws-cli/2.3.0 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
$ docker --version
Docker version 20.10.23, build 7155243
AWS Web 콘솔에서 ECR 리포지토리 생성
딱히 정리하지 않아도 화면을 보면 간단하게 할 수 있다. 이미지를 생성하고 나면 화면 우측 상단에 View push commands 버튼이 보인다. 이 버튼을 클릭하면 어떤 명령어를 실행하면 푸시할 수 있는지 보여준다. 매우 편리하다!
대략적인 흐름은 다음과 같다.
- 인증 토큰을 취득하고 ECR 리포지터리에 대해 Docker 클라이언트를 인증한다 (aws ecr 명령)
- 도커 이미지를 빌드 (docker build 명령)
- 이미지에 태그를 지정 (docker tag 명령)
- 이미지를 새로 생성한 ECR 리포지터리로 푸시 (docker push 명령)
ECR로부터 이미지 pull하기
로그인
- 먼저 ecr에 로그인이 필요하다.
- AWS_ACCOUNT, AWS_REGION을 적절히 변경한다.
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com
이미지 pull
docker pull ${ECR_URI}
쿠버네티스에서 ECR 사용하기
- Docker Desktop등 로컬환경의 클러스터에서 ECR 리포지터리를 사용하는 방법이다.
- EKS의 경우에는 IAM으로 접근제한을 설정할 수 있으므로 쿠버네티스 매니페스트 파일에 imagePullSecrets를 설정하는 과정등은 필요없을 것이다.
매니페스트 파일에서 도커 컨테이너 URI변경
쿠버네티스 매니페스트 파일(yaml파일)의 image 키의 값을 ECR 리포지터리의 URI로 설정하면 된다. URI는 AWS 웹 콘솔의 ECR 서비스에서 해당 이미지를 선택한 후 COPY URI버튼을 누르면 복사할 수 있다. 아래의 ECR-IMAGE-URI 부분을 이 URI로 변경한다.
spec:
containers:
- name: my-container
image: {ECR-IMAGE-URI}
ECR용 시크릿 생성
다음 명령으로 ECR용 시크릿을 생성한다.
kubectl create secret docker-registry ecr-secret --docker-server=${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com --docker-username=AWS --docker-password=$(aws ecr get-login-password --region=${AWS_REGION})
- AWS_ACCOUNT, AWS_REGION을 적절히 변경한다.
- docker-password는 윈도우즈 커맨드에서 실행할 경우 확장이 안되므로 두 단계로 나눠서 실행한다.
aws ecr get-login-password
로 생성한 패스워드는 유효기간이 있다. 12시간이다. 따라서 하루에 한번정도씩은 새롭게 시크릿을 만들어야 한다.aws ecr get-login-password
실행시 리전설정이 중요하다. ECR 리전과 리전이 다르면 다음과 같이 토큰이 유효하지 않다는 메세지가 출력된다.
repository does not exist or may require 'docker login': denied: Your Authorization Token is invalid.
매니페스트 파일에서 imagePullSecrets 변경
imagePullSecrets의 name값을 위에서 생성한 ECR용 시크릿으로 지정한다.
imagePullSecrets:
- name: ecr-secret
참고 링크
- https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/docker-push-ecr-image.html
- https://sotoiwa.hatenablog.com/entry/2021/01/02/024715
- https://skryvets.com/blog/2021/03/15/kubernetes-pull-image-from-private-ecr-registry/