AWS/Project

[CI/CD] 환경 구성 - ECR(Elastic Container Registry) 구성

jih0ssang 2024. 6. 22. 16:11

k8s 노드들을 배포할 때 사용할 이미지 저장소인 ECR을 생성한다.

생성 후 k8s 노드들과 ecr 연동도 진행한다.

 

ECR 생성

 

프라이빗 레포지토리를 생성한다.

 

 

 

 

ECR에 접근할 IAM 역할 생성

이제 EC2가 ECR에 접근하기 위한 IAM 권한을 생성한다.

AmazonEC2ContainerRegistryFullAccess 정책이 AWS 관리형으로 이미 생성되어있어, 이걸 인스턴스 프로파일에 연결해주었다.

만약 레파지토리를 Public으로 만들었을 경우, AmazonEC2ContainerRegistryPublicFullAccess 으로 추가해야한다!

그럼 aws configure을 설정하지 않아도 ECR에 접근이 된다.

 

 

 

 

 

K8S(EC2)와 ECR 연동

생성한 ECR에 들어가서 푸시 명령 보기를 누른다.

 

 

 

 

 

ECR로 로그인

# docker 로그인 (AWS에 있는 ECR)

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789.dkr.ecr.ap-northeast-2.amazonaws.com

 

 

 

 

 

 

Dockerfile 작성

임의로 컨테이너 이미지를 만들어 ECR로 배포할 것이다.

만들고자하는 컨테이너 이미지는 Dockerfile에 작성한다.

Docker는 Dockerfile을 기반으로 이미지를 생성한다.

 

 

Dockerfile

# base Image
FROM nginx:alpine

# move workdir
WORKDIR /usr/share/nginx

# nginx start command
CMD ["nginx", "-g", "daemon off;"]

 

필자는 nginx의 기본 구성을 그대로 따라갈 것이지만, 커스텀 할 경우

# nginx config file directory path
COPY /svc/engn001/nginx/nginx.conf /etc/nginx/nginx.conf

이런 식으로 추가 작성이 필요하다.

 

 

 

Dockerfile 용어

FROM Base 이미지
WORKDIR 작업 디렉터리 설정. 다음 명령어들을 수행하고자 하는 디렉터리 경로
MAINTAINER 관리자
LABEL 라벨
USER 사용자
COPY 이미지 안에 넣을 파일 복사
EXPOSE 컨테이너가 Listen할 포트 번호
RUN 도커파일로부터 도커 이미지를 빌드한 순간부터 실행되는 명령어
소프트웨어 패키지, 라이브러리 설치할 때 주로 사용
CMD 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행
컨테이너 내 터미널에서 기본 명령 및 매개변수 설정할 때 사용
ENTRYPOINT CMD와 유사

 

 

이미지 빌드

docker build -t test-cicd:v1 .

 

* 현재 디렉터리(.)에 Dockerfile이 존재해야 함!

 

옵션
-f : 도커파일 경로/파일명 지정,   예시)  /nginx/Dockerfile (확장자x)
-t : 도커파일로 빌드한 Docker 이미지에 태그 붙임    예시)  testcicd:v1.0.0

 

이미지 삭제

docker rmi test-cicd:v1

 

레파지토리에 있는 이미지 전체 삭제

aws ecr list-images --repository-name test-cicd --query 'imageIds[*]' --output json > delete.json
aws ecr batch-delete-image --repository-name test-cicd --image-ids file://delete.json

 

 

이미지에 tag 지정 ( ECR은 특정 포맷으로 푸시해야 함)

docker tag test-cicd:v1 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/test-cicd:v1

 

tag 지정 형식
docker tag <리포지토리명>:<Tag> <AWS Account ID>.dkr.ecr.<리전>.amazonaws.com/<ECR 리포지토리명>:<Tag>

 

 

 

이미지 푸시  (ECR 저장소에 Push)

docker push 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/test-cicd:v1

이미 한번 Push한 후여서 Layer already exists가 뜬다. 

 

ECR 콘솔 확인하면 정상적으로 푸시가 되었음을 확인할 수 있다.

 

ECR에서 이미지 이름은 저장소(repository) 이름과 태그(tag)로 구성

  • 이미지 이름: 레파지토리의 이름    (저장소 내 이미지들은 모두 저 이름이다. 동일하게 유지)
  • 태그: v1, latest   (유일한 식별자)