프레임워크/AWS

AWS ECR로 개인 repository에 도커 이미지 관리하기

Julie825 2024. 12. 23. 16:00

Docker는 컨테이너를 만들어내는 이미지라는 틀을 가지고 있다.

그리고 모든 이미지는 Docker hub에 'docker push' 명령어로 올려서 모두와 공유할 수 있다.

하지만 이미지를 우리 팀만 써야하는 경우라면 Github에서처럼 private repository가 필요해진다.

도커에 돈을내고 private repository를 만들수도 있지만, 프리티어가 적용되는 AWS ECR이라는 대안도 있다.

ECR에 이미지를 올리고, 또 다운받는 과정을 정리해보았다.

 

1. 개발 컴퓨터에서 이미지 빌드하기

docker build --platform linux/amd64 -t 이미지이름:태그 실행위치

먼저 위 명령어로 이미지를 생성한다. 각 옵션과 아규먼트를 자세히 설명하면 아래와 같다.

 

-t : 이미지의 이름과 태그를 지정하기 위한 옵션이다. 인증모듈에 대한 이미지를 배포해야하는데 이름이 vigorous_faraday 이런식으로 붙어있다면 알아보기 힘들것이다. 보통 태그는 latest를 많이하는 것 같다.

--platform : 배포 환경의 운영체제와 CPU 아키텍처를 지정하기 위한 옵션이다. 이 옵션이 없다면 개발환경의 운영체제와 CPU에 맞는 이미지로 만드는데, 컨테이너도 결국 호스트 머신의 OS를 사용하기 때문에 예상치 못한 운영체제에서 실행된다면 제대로 작동할 수 없다.

따라서 해당 옵션을 활용해서 어떤 환경에서 돌아가야하는 이미지인지 미리 알려줘야한다.

실행위치 : 도커가 COPY 등 호스트 머신의 자원에 영향을 미치는 동작을 할 때 기준이 되는 디렉토리를 설정하면 된다.

통상 Dockerfile이 있는 디렉토리로 한다. 그럼 -f로 도커파일 위치를 지정하지 않아도 되서 편하다.

 

2. AWS 인증하기

먼저 이미지를 올릴 Repository를 하나 만들어줘야한다.

ECR 콘솔로 들어가서 Region을 잘 확인하고 레포지토리를 생성해준다.

서버가 서울에 있는데 지역을 버지니아 북부로 해놓으면 푸시 / 풀에 상당한 시간이 걸리게 된다.

 

레포지토리는 이미지 하나에 대한 버전을 관리하는 역할을 한다. 따라서 이미지 3개를 올리고싶다면 리포지토리를 3개 만들자.

 

 

 

생성한 리포지토리를 클릭하면, 푸시 명령 버튼이 나온다. 여길 누르면 친절하게 모든 커맨드를 알려준다.

우리가 해야할 것은 이 커맨드를 실행하기 전에 IAM 사용자를 만들고 액세스키로 인증을 받는 것이다. 근데 이게 좀 복잡하다.

 

 

IAM 콘솔로 들어가서 ECR에 접근할만한 자격증명이 있는지 확인해보자.

없으면 하나 만들어야한다. 사용자 생성을 클릭한다.

 

 

이름을 잘 정해준다.

 

이제 정책을 설정해줘야하는데, 내가 모든걸 하는 경우라면 AdministratorAccess를 사용하면 되지만, Repository 하나에 대한 액세스만 주고싶다면 정책을 새로 만들어야한다.

 

 

우측에 보이는 정책 생성에서 아래와 같이 JSON을 입력해서 새 정책을 만든다.

더보기

AWS 가이드에서 추천하는 권한 목록을 참고해서 JSON을 작성하면 된다.

 

ARN 넣다가 오류가 자주 나는데, 레포지토리 > 요약 탭에서 ARN을 복사할 수 있다.

 

나는 이미지 관리와 EC2 인스턴스로의 배포를 한 사람이 했으면 좋겠어서 EC2 권한도 넣었다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"ecr:CompleteLayerUpload",
				"ecr:UploadLayerPart",
				"ecr:InitiateLayerUpload",
				"ecr:BatchCheckLayerAvailability",
				"ecr:PutImage",
				"ecr:BatchGetImage",
				"ec2:*"
			],
			"Resource": "아까 복사한 레포지토리 ARN"
		},
		{
			"Effect": "Allow",
			"Action": [
				"ecr:GetAuthorizationToken",
				"ec2:*"
			],
			"Resource": "*"
		}
	]
}

 

이제 정책 생성 후 이름을 검색해보면 나온다.

직접만든 ecr_upload 정책이 검색되는 모습

 

이제 다왔다. 만든 사용자로부터 액세스키와 시크릿키를 따내면 끝이다. 액세스키 만들기를 눌러준다.

 

우린 aws-cli에서 쓸거니까 cli를 선택해주면

 

이렇게 액세스키와 시크릿키가 나온다. 이걸 잘 저장해두자.

 

 

3. 개발 컴퓨터에서 이미지 푸시하기

긴 스텝이 끝났다. 이제 다시 repository > 푸시 명령 으로 이동해서 시키는대로 커맨드를 입력하자.

% brew install aws-cli

# AWS 로그인
% aws configure
AWS access key 입력 : 
AWS secrey key 입력 : 
...

# AWS ECR 로그인
% aws ecr get-login-password ... | docker login --username AWS ...
...

Login Succeeded

# 이미지 푸시
% docker tag 로컬이미지네임:로컬태그 AWS_URI:태그
% docker push AWS_URI:태그

 

나는 hello-world 라는 이미지를 도커허브에서 받은 다음, 내 AWS ECR로 옮겨보았다.

# 이제 내 컴퓨터에 hello-world 라는 이미지가 있다.
% docker pull hello-world

# hello-world 이미지의 이름을 바꾼다.
% docker tag hello-world:latest 내계정.dkr.ecr.ap-northeast-2.amazonaws.com/myservice/image1:latest

# ECR repository로 올린다.
% docker push 내계정.dkr.ecr.ap-northeast-2.amazonaws.com/myservice/image1:latest

The push refers to repository [600627317688.dkr.ecr.ap-northeast-2.amazonaws.com/myservice/image1]
12660636fe55: Pushed
latest: digest: sha256:a8ea96bb64d60208d6a56712042d1cf58aa4a7d3751b897b9320b0813c81cbb4 size: 524

 

이미지가 잘 올라간 것을 확인할 수 있다.

 

CLI로도 확인 가능하다.

aws ecr describe-repositories
aws ecr describe-images --repository-name 레포지토리이름

 

4. 배포 컴퓨터에서 AWS 인증하고 풀 받기

아까 만든 액세스키와 시크릿키로 이제 배포할 컴퓨터에서 이미지를 사용해보자.

나는 ubuntu 머신에 이미지를 띄울거라 아래 두 링크를 참고했다.

- linux에 Docker 다운로드

- linux에 aws-cli 다운로드

 

sudo aws --version
sudo docker --version

 

위 두 명령어가 모두 잘 작동한다면 ECR에서 이미지를 받아올 준비가 된 것이다.

 

아까 푸시할 때 사용했던 인증 커맨드를 다시 실행하고, 엑세스키와 시크릿키를 입력해준다.

sudo aws configure
sudo aws ecr get-login-password --region ap-northeast-2 \
| sudo docker login --username AWS \
--password-stdin 계정일련번호.dkr.ecr.ap-northeast-2.amazonaws.com

 

이제 이미지를 받아온다.

docker pull 이미지URI

 

이미지가 제대로 받아졌는지 확인한다.

docker images

 

 

관련 링크

- 다중 플랫폼 | Docker 문서