Docker 이미지를 관리해 주는 DockerHub의 AWS버전인 ECR(Elastic Container Registry)을 생성해 보자
1. ECR 생성하기
1-1. ECR생성페이지 이동
- ECR 리포지토리를 생성하기 위해서 AWS의 ECR 페이지로 이동 (웹 검색으로 들어와도 된다.)
1-2. ECR 리포지토리 생성버튼 클릭
- 프라이빗으로 선택하고 간단하게 리포지토리 이름을 작성해 준다.
1-3. 리포지토리 생성하기
- 다 작성하고 하단의 "리포지토리 생성" 버튼을 클릭한다.
1-4. ECR 생성완료
2. ECR에 이미지 push하기 (dockerfile 이용, ARM(애플 M1) 아키텍처 제외버전)
2-1. 우측 상단에 “푸시 명령 보기” 버튼을 클릭한다.
2-2. 아래와 같이 푸시 명령 정보가 나온다.
2-3. 우선 명령어들을 입력하기 위해 AWS의 CLI를 설치한다.
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- 위의 링크로 들어가서 아래의 가이드를 보면서 설치하면 된다. (금방 된다)
- 설치를 했다면 아래의 두 명령어를 입력해서 확인한다.
which aws
aws --version
2-4. 이제 이미지 build를 위해 미리 작성한 dockerfile경로로 이동한다.
- 스프링 부트 프로젝트를 기준으로 dockerfile은 root경로에 만들어 두었다.
- dockerfile의 내용은 다음과 같다. ECR은 AWS의 서비스이므로 jdk도 Amazon에서 만든 corretto를 사용했다.
# Use Amazon Corretto 17 as the base image
FROM amazoncorretto:17-al2-jdk
# Make port 8081 available to the world outside this container
EXPOSE 8081
# Specify the built JAR file path and add it to the container as member-api.jar
ARG JAR_FILE=build/libs/member-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} member-api.jar
# Run the JAR file
ENTRYPOINT ["java", "-jar", "/member-api.jar"]
2-5. docker 설치하기 (docker가 설치되어있어야 빌드가 가능하다.)
- 빌드하기 전에 macOS라면 docker desktop을 설치한 후 실행하도록 하자
- window도 docker desktop을 설치하면 된다. Linux 환경은 명령어로 설치하도록 하자
2-6. AWS CLI명령어 사용(위에 있던 푸시 명령을 차례차례 입력한다.)
- 첫 번째 명령어를 입력한다. (AWS CLI명령어로 ECR에 로그인을 하는 과정)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 473709498430.dkr.ecr.ap-northeast-2.amazonaws.com
- 여기서 아래와 같은 오류가 발생했다. 인증이 안된다는 것이다. 에러코드는 다음과 같다.
Unable to locate credentials. You can configure credentials by running "aws configure".
Error: Cannot perform an interactive login from a non TTY device
2-7. 해결방법
- AWS CLI에서 aws configure 명령을 실행하면, 이러한 자격 증명을 설정 파일에 저장할 수 있다. 이후에 AWS CLI를 사용하여 서비스에 요청을 보낼 때 이 설정 파일의 정보를 사용한다. 이 정보들은 일반적으로 ~/.aws/credentials 파일에 저장된다.
- 아래와 같이 aws configure를 명령어로 입력하면 AWS의 credentials 입력정보가 나오니 본인의 정보를 입력하면 된다.
# AWS CLI에서 자격 증명을 설정하는 예시
$ aws configure
AWS Access Key ID [None]: (여기에 Access Key ID 입력)
AWS Secret Access Key [None]: (여기에 Secret Access Key 입력)
Default region name [None]: (기본 리전 설정, 예: us-east-1)
Default output format [None]: (출력 형식 설정, 예: json)
- 간단히 말하면, AWS Access Key ID는 고유한 사용자 ID와 같은 것이고, Secret Access Key는 그 ID의 패스워드와 같다. 두 개가 항상 함께 사용되어야 한다.
2-8. 내용 입력하기
- 위에서 알려준대로 aws configure 명령어를 입력하고 내 IAM계정의 ID, Key 그리고 Region코드와 format인 json을 입력했다.
- region을 적을때는 웬만하면 직접 타이핑해서 적어주도록 하자 복사했더니 다음 format 설정을 할 때 계속 오류가 발생했다.
2-9. 명령어 다시 입력하기
- 다시 첫번째 명령어를 입력했더니 이번에는 성공했다. (로그인 성공)
2-10. 두 번째 명령을 사용하여 도커 이미지를 빌드한다.
- 도커 파일을 처음부터 새로 빌드하는 방법에 대한 자세한 내용은 여기 지침을 참조해라. 이미지를 이미 빌드한 경우에는 이 단계를 건너뛸 수 있다.
docker build -t recipia-repository .
- 아래와 같은 오류가 발생할 수도 있는데 이 오류는 docker-desktop을 실행시키지 않고 명령어를 입력해서 그렇다. (도커설치 필수)
- docker desktop을 실행한 후 다시 명령어를 쳤더니 이번에는 Dockerfile에서 에러가 발생함 (jdk 설치에러)
- 이 오류는 위의 내용을 그대로 따라왔다면 발생하지 않을 것이다. jdk17을 alpine버전으로 적어줬는데 없는 버전이라고 나와서 amazoncoretto로 변경했다. (혹시 없는 jdk를 잘못 적어서 오류가 발생하면 이렇게 나올 것이다.)
=> ERROR [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine 2.4s
------
> [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine:
------
Dockerfile:2
--------------------
1 | # Use OpenJDK 17 as the base image
2 | >>> FROM openjdk:17-jdk-alpine
3 |
4 | # Make port 8081 available to the world outside this container
--------------------
ERROR: failed to solve: openjdk:17-jdk-alpine: no match for platform in manifest sha256:4b6abae565492dbe9e7a894137c966a7485154238902f2f25e9dbd9784383d81: not found
2-11. JDK를 AWS의 amazon corretto 17로 변경해서 해결했다.
# Use Amazon Corretto 17 as the base image
FROM amazoncorretto:17-al2-jdk
2-12. 드디어 빌드에 성공했다. 아래와 같이 나왔다.
=> [2/2] ADD build/libs/member-0.0.1-SNAPSHOT.jar member-api.jar 0.4s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:73fa77654cbf3390f31726f2a5be64b6d38d8c64a39d5e44e17b0588eba21f9b 0.0s
=> => naming to docker.io/library/recipia-repository
2-13. 이제 docker image가 잘 생성되었는지 확인하는 작업을 한다.
2-14. 세 번째 명령어를 입력한다. (완성된 이미지에 "이미지 태그"를 지정해서 ECR에 푸시)
- 여기서 ECR에 이미지를 푸시할 때 내가 구분하길 원하는 태그를 이 명령어에 지정해서 푸시하면 ecr에도 "이미지 태그"가 생긴다.
- 이 명령어는 "푸시 명령어"에 작성된 걸 복사해서 적절히 수정해 주면 된다.
docker tag recipia-repository:latest {내 ecr 리포지토리 URI}:{ecr 리포지토리 tag}
- ECR에 이미지 push를 성공하면 아래와 같이 나온다.
- 이제 ECR 리포지토리에 들어오면 아래와 같이 올라온 이미지가 있다.
지금까지 ECS를 사용하기 위해 ECR을 만드는 과정을 알아봤다.
ECR은 DockerHub와 같은 역할을 하는 저장소인데 AWS에는 생각보다 편리한 기능을 많이 제공하는 것 같다.
특히 ECR, ECS는 같은 아마존의 시스템이라 서로 잘 호환되다 보니 AWS의 CodePipe를 활용해서 CI/CD를 구축할 생각이라면 DockerHub를 사용하는 것보다 ECR을 사용하는 것이 더 효율적이고 편리한 것 같다.
2023.10.27 - [AWS] - Amazon Linux - EC2 인스턴스 요약에서 연결 버튼으로 접속할때 오류
2023.10.27 - [AWS] - AWS ECS를 위한 ALB세팅: 실전 예제와 함께
'AWS > ECS, ECR' 카테고리의 다른 글
AWS ECS와 ALB: 동적 포트 vs 명시적 포트 설정의 EC2 DNS 접속 이슈 (1) | 2023.10.31 |
---|---|
AWS - ALB를 적용시킨 ECS의 동적 포트 할당관계 동작원리 (1) | 2023.10.30 |
AWS - ALB(로드 밸런서)없이 ECS 생성하기 (1) | 2023.10.28 |
AWS EC2를 사용하는 ECS 클러스터 생성 및 사용 (1) | 2023.10.28 |
AWS ECS를 위한 ALB세팅: 실전 예제와 함께 (0) | 2023.10.27 |