ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Elastic Container Registry (ECR) 로 도커 이미지 관리하기
    인프라/aws 2024. 3. 16. 21:04

     

    프로젝트를 진행하면서 게시글 서비스를 github action과 docker hub를 사용해서 ci/cd를 구축해서 사용하고 있었습니다.

    이번에 유저 서비스를 새로 만들면서 인프라 툴을 여러 곳에 분산해서 사용하는 것보다 한 곳으로 모으는 것에 이점이 있을 것 같아서  이미지 관리와 CI/CD 방법을 변경하면서 작성하는 글입니다.

     

    여러 차례 막히는 구간이 생겨서 하루 종일 고생하다가 정리해두는 것이 좋을 것 같아 오랜만에 글로 남깁니다.

     

    [관련 포스팅]

    1. Elastic Container Registry (ECR) 로 도커 이미지 관리하기

    2. CodeBuild로 ECR 갱신하기

    3. CodeDeploy로 EC2에 배포하기

    4. CodePipeline으로 CI/CD 구축하기

     


     

    글은 크게 4가지 항목으로 진행됩니다.

     

    1. 로컬에서 도커 이미지 파일 작동 확인

    2. ECR 설정하기

    3. Image Push 하기

    4. 정상 작동 확인하기

     

     

     

    1. 로컬에서 도커 이미지 파일 작동 확인

    기본적은 사용 방법은 도커 허브와 크게 다르지 않을 것이라고 생각합니다. 단지 이미지를 관리하는 주체가 docker hub에서 ecr로 변경되는 것일 뿐이니까요.

    우선 로컬에서 빌드와 실행이 잘 되는지 확인해보겠습니다.

    Dockerfile을 프로젝트 루트 경로에 작성하였습니다.

    FROM eclipse-temurin:17-jdk
    
    WORKDIR /workspace/app
    
    COPY ./gradlew /workspace/app
    COPY ./settings.gradle /workspace/app
    COPY ./gradle   /workspace/app/gradle/
    COPY ./build.gradle /workspace/app
    COPY ./src /workspace/app/src/
    
    RUN ./gradlew build -x test
    RUN mv ./build/libs/user_spring-0.0.1-SNAPSHOT.jar /workspace/app/app.jar
    
    FROM eclipse-temurin:17-jre
    
    WORKDIR /workspace/spring
    
    COPY --from=0 /workspace/app/app.jar /workspace/spring/app.jar
    
    ENTRYPOINT ["java", "-jar", "app.jar"]

     

     

    그리고 저는 arm 아키텍쳐를 기반으로 M1 맥북을 사용하고 있습니다. 생성된 도커 이미지가 이후에는 amd 아키텍쳐에서 실행되어야 하기 때문에 --platform 태그를 추가하여 위의 도커 파일을 빌드하고 실행해보겠습니다.

    $ docker buildx build --platform linux/amd64 -t user_service . --load
    $ docker run -it -p 8082:8082 --name app user_service

     

     

    컨트롤러에 아래와 같이 작성해두었기 때문에 8082 포트에 /로 요청을 하면 Hi를 반환하는 것을 확인할 수 있습니다.

      @GetMapping("/")
      public String getCheck() {
        log.info("Request arrived");
        return "Hi";
      }

     

     

    2. ECR 설정하기

    ECR을 사용하기 위해서 레포지토리도 만들고 인증을 위해서 access key를 사용하기 때문에 여러가지로 해야하는 과정이 많습니다.

    순서대로 잘 살펴봐주세요.

     

    2-1. Repository 생성하기

    ECR을 사용하는 장점은 다른 aws 툴과 호환성이 좋다는 것과 보안 키 관리를 aws 내부에서 해결 가능하기 때문에 더 안전하다는 것 같습니다. 간단하게 레포지토리 이름만 설정해주면 생성이 가능합니다.

     

     

    2-2. Access key 및 권한 설정하기

    IAM에가서 유저를 생성하고 해당 유저가 사용할 수 있는 Access Key를 발급해주어야합니다.

    생성된 유저를 클릭해서 상세화면으로 가면 상단 우측에 Access Key 생성 버튼이 있습니다. 저는 csv로 받아서 보관하였습니다.

     

    그리고 이 유저가 Elastic Container Registry에 대한 권한을 행사할 수 있도록 Permission policies를 추가해줍니다.

    권한은 필요한 만큼, 작게 걸어줄 수록 좋습니다. (프라이빗 레포에 접근하기 위해서는 AmazonEC2ContainerRegistryPowerUser)

     

     

     

    3. Image Push 하기

    ECR에서 안내해주는 명령어를 사용하기 위해서는 aws cli를 사용해야합니다.

     

    3-1. AWS-CLI 설치하기

    간단하게 brew로 설치하고 버전을 확인해줍니다.

    $ brew install awscli
    $ aws --version  // aws-cli/2.15.29 Python/3.11.8 Darwin/23.2.0 source/arm64 prompt/off

     

    cli 설치가 되었다면 configure 명령어를 통해서 access key를 설정해줍니다.

    $ aws configure

     

     

    3-1. Image Push 하기

    aws 웹사이트에서 생성한 repository를 선택하면 우측에 View push commands 라고 친절하게 어떻게 push 하는지 알려줍니다.

    따라 해보겠습니다.

     

     

    빌드 > 태그 > push 순으로 진행됩니다.

    $ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <ECR주소>
    $ docker build -t <tag 이름>
    $ docker tag <tag 이름>:latest <ECR주소>/<repo이름>:<태그>
    $ docker push <ECR주소>/<repo이름>:<태그>

     

     

    문제 없이 push 가 완료되었습니다.

     

     

    4. 정상 작동 확인하기

    push 해서 올라간 이미지가 제대로 작동하는지 pull을 받아서 확인해보겠습니다.

    push에 사용한 주소 그대로 pull 을 요청합니다.

    $ docker pull <ECR주소>/<repo주소>:<태그>
    $ docker run -it -p 8082:8082 --name app <docker image ID>

     

    포스트맨 요청을 통해서 pull 받은 이미지가 정상적으로 작동하는 것을 확인하였습니다.

     

     

     

     

     


    대표 이미지 참고

    https://github.com/cncf/filterable-landscape/issues/67

     

     

     

     

     

     

Designed by Tistory.