본문 바로가기
개발/Cloud

[AWS] ECR, Docker Image Push & Pull 하기

by baau 2023. 7. 9.

SWM 프로젝트를 개발하고 이후에 배포하는 과정에 있어서, AWS와 Docker를 사용하려고 계획 중입니다. Docker 컨테이너 이미지 저장소로 Docker Hub와 ECR 중 선택하는 과정에 있어서, 비용적인 측면과 AWS 기반 인프라적인 측면에서 Docker Hub 보다는 ECR이 좀 더 적합 다는 생각이 들었습니다.

 

  • AWS 클라우드 비용을 SWM에서 지원해 준다.
  • Docker Hub의 경우 Public Repository는 무료이지만, Private Repository는 유료 구독을 해야 한다.
  • EC2, S3, RDS 등 AWS 서비스로 인프로를 구축할 예정으로, ECR 사용 시 나머지 AWS 서비스와 원활하고 강력한 통합을 예상한다.
  • 이미지 액세스에 대해서 엄격한 IAM을 구성하여 보안 측면을 강화할 수 있을 것이라 예상한다.

따라서 이번 포스트에서는 ECR의 Private Repository에 Docker Container Image를 Push 하고, Pull 하는 명령어를 정리하고자 한다.

 

 

ECR

ECR은 "Elastic Container Registry"의 약자로, AWS에서 제공하는 완전관리형 Docker 컨테이너 이미지 저장소이다.

  • ECR은 Docker 컨테이너 이미지를 쉽게 저장, 관리, 배포할 수 있도록 도와준다.
  • IAM을 사용하여 이미지에 대한 접근 권한을 관리한다.
  • ECR은 AWS 내 다른 서비스와의 통합이 원활합니다. 예를 들어, ECS 또는 Kubernetes를 사용하여 컨테이너 이미지를 실행하는데 쉽게 통합한다.
  • Private Repository와 Public Repository 두 가지 유형의 저장소를 제공한다.

https://aws.amazon.com/ko/ecr/

 

EC2에 도커 세팅 및 테스트

(EC2를 생성하는 과정 생략)

 

EC2 터미널에서 아래 명령어 실행

 

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

 

Dockerfile 작성 (아래는 예시)

 

vi Dockerfile

---------------------- Dockerfile 작성 ---------------------------
FROM ubuntu:22.04

RUN apt-get update && \
apt-get -y install apache2

RUN echo 'Welcome To Flower World!' > /var/www/html/index.html

RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \
echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \
chmod 755 /root/run_apache.sh

EXPOSE 80

CMD /root/run_apache.sh
------------------------------------- End of Dockerfile -------------------------

 

도커 이미지 생성 (Build, Dockerfile이 위치하는 디렉터리에서 명령어 실행)   

 

sudo docker build -t hello-web .

 

이미지 생성 확인

 

sudo docker images

 

실행

 

sudo docker run -it -d -p 80:80 --name hello-web hello-web

 

  • -d : 컨테이너 백그라운에서 실행
  • -it :컨테이너가 종료되지 않은 상태에서 터미널의 입력을 컨테이너로 전달

 

사전 준비

아래 3가지 권한을 가진 IAM 사용자 생성

  • AmazonEC2ContainerRegistryFullAccess 
  • AmazonECS_FullAccess 
  • AmazonElasticContainerRegistryPublicFullAccess

 

(IAM은 AWS 계정의 보안을 강화하는 데에 중요한 역할을 한다. 적절한 IAM 권한 관리를 통해 권한 부여, 권한 제거, 롤 분리 등을 수행하여 사용자와 리소스 간의 적절한 액세스 제어를 제공할 수 있으며, 각 IAM 사용자 또는 역할에 필요한 최소한의 권한만 부여하여, 필요하지 않은 권한으로 인한 보안 위험을 최소화할 수 있습니다.)

 

 

EC2 CLI 등록

 

sudo apt-get install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" (Linux-x86-64bit)
unzip awscliv2.zip
sudo ./aws/install
aws configure

aws configure 진행 시, 위에서 생성한 IAM 계정키를 설정한다.

 

(AWS CLI를 EC2 인스턴스에 설치하면 명령줄에서 AWS 리소스를 관리할 수 있다. CLI를 통해 ECR Private Repository를 생성하고, 이미지를 Push 및 Pull 하기 때문에 EC2에 AWS CLI를 설치해야 한다.)

 

ECR - Private Repository 생성

CLI로 private repository 생성

 

aws ecr create-repository --repository-name bauu-repository --region ap-northeast-2

 

  • --name : private repository 이름 지정
  • --region : 리전 지정
  • 위의 명령을 통해 'bauu-repository'라는 이름의 ECR 저장소를 'ap-northeast-2' 리전에 생성할 수 있다.

 

이미지 태깅 (도커 이미지에 특정 이름과 저장소 정보를 태그 하는 데 사용)

 

sudo docker tag hello-web 111111111111.dkr.ecr.ap-northeast-2.amazonaws.com/bauu-repository

 

  • sudo docker tag {태그 할 도커 이미지의 현재 이름} {ECR 저장소 주소}
  • ECR 저장소 주소
    • [account-id].dkr.ecr.[region].amazonaws.com/[repository-name]
    • ECR > Repositories > Private Repository에서 확인가능

 

ECR 로그인

 

sudo docker login -u AWS -p $(aws ecr get-login-password --region ap-northeast-2) \
111111111111.dkr.ecr.ap-northeast-2.amazonaws.com

 

  • Private Repository에 이미지를 Push & Pull 하기 위해서는 Private Repository에 로그인 과정이 필요하다.

 

도커 이미지 푸시

 

sudo docker push 111111111111.dkr.ecr.ap-northeast-2.amazonaws.com/bauu-repository:latest

 

  • 위에서 빌드하고 태깅한 도커 이미지를 ECR에 latest 태그로 푸시하는 명령어

 

도커 이미지 가져오기

 

sudo docker pull 111111111111.dkr.ecr.ap-northeast-2.amazonaws.com/bauu-repository:latest

 

  • Private Repository에서 이미지를 Pull 하는 것이기 때문에 로그인이 되어 있어야 한다.

 

마무리

ECR Private Repository를 사용하여 배포 환경, CI/CD, auto-scailing을 활용할 때, 이미지 빌드, 저장소 관리, 서비스 통합, 구성 관리 및 모니터링 등의 단계를 조합하여 원하는 환경을 구성할 수 있고, 이를 컨테이너화된 애플리케이션을 효율적으로 배포하고 관리할 수 있으며, 스케일링과 유연성을 확보할 수 있다고 많은 기대를 품고 있지만 아직 공부할게 산더미인 것 같다.. 열심히 공부하고 또 공부해야겠다🔥