AWS ECR(Amazon Elastic Container Registry)은 컨테이너 이미지를 저장하고 관리하는 AWS 서비스입니다. 쉽게 말해, 이미지를 저장하고 공유하는 Docker Hub와 비슷한 역할을 합니다. AWS ECR을 사용하면 도커 이미지를 안전하게 저장하고 관리할 수 있으며, 이를 필요할 때 EC2, ECS 등 다양한 AWS 리소스와 연동해 실행할 수 있습니다.
최근에는 AWS 클라우드 환경에서 인프라를 구축하는 일이 많아졌습니다. 이런 환경에서 AWS ECR을 사용하는 주된 이유는 다음과 같습니다:
AWS 서비스와의 높은 호환성
AWS ECR은 EC2, ECS, CodePipeline 등 AWS의 다른 서비스와 쉽게 연동됩니다.
관리의 편의성
모든 리소스를 AWS 환경 내에서 관리하기 때문에, 운영의 복잡도가 줄어듭니다. Docker Hub와 같은 외부 서비스 없이 AWS 내부에서 이미지 관리와 배포를 처리할 수 있습니다.
보안
AWS ECR은 AWS IAM을 통해 세분화된 접근 권한을 설정할 수 있습니다. 이를 통해 사용자, 애플리케이션, 서비스별로 제한된 권한만 부여할 수 있어 보안이 강화됩니다.
네트워크 성능 향상
ECR은 AWS 내부 네트워크에서 이미지를 전송하기 때문에 Docker Hub보다 네트워크 성능이 우수합니다. 이미지 다운로드 속도가 더 빠르고, 트래픽 비용도 절약됩니다.
Docker를 사용하지 않는 일반적인 배포 방식은 다음과 같습니다:
코드 기반 배포
문제점
Docker의 가장 큰 장점은 이식성입니다.
AWS ECR을 활용하면, 다음과 같은 방식으로 배포를 간소화할 수 있습니다:
항목 | 기존 배포 방식 | Docker + AWS ECR 기반 배포 방식 |
---|---|---|
배포 준비 | GitHub에서 코드 풀(Pull) 후 실행 준비 | ECR에서 Docker 이미지 다운로드 |
환경 설정 | 런타임(Node, JDK 등) 수동 설치 필요 | 이미 Docker 이미지에 포함됨 |
배포 속도 | 느림 (환경 설정 및 코드 다운로드) | 빠름 (이미지 다운로드 및 실행) |
환경 의존성 문제 | 개발 환경과 서버 환경 불일치 가능성 | 컨테이너로 동일한 환경 제공 |
보안 | GitHub 리포지토리 접근 권한 필요 | AWS IAM으로 세분화된 접근 제어 |
AWS CLI란?
AWS CLI(AWS Command Line Interface)는 명령어를 통해 AWS를 관리할 수 있게 해주는 도구입니다.
쉽게 설명하면:
AWS 관리 콘솔(웹 사이트)에서 클릭으로 설정하고 관리하던 작업을, 터미널에서 명령어로 빠르게 처리할 수 있도록 도와주는 프로그램입니다.
AWS CLI 설치 공식 문서 링크:
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
$ brew install awscli
$ aws --version # 잘 출력된다면 정상적으로 설치된 상태입니다.
$ sudo apt install unzip
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version # 잘 출력된다면 정상적으로 설치된 상태입니다.
AmazonEC2ContainerRegistryFullAccess
를 선택합니다.AWS에서 Elastic Container Registry를 검색 후 리포지토리를 생성합니다. 일반적으로 리포지토리는 프라이빗으로 생성하며, 하나의 리포지토리에는 한 종류의 이미지만 저장하고 관리합니다.
이미지 push
생성한 리포지토리를 선택하여 들어가면, 푸시 명령을 확인할 수 있습니다. 명령어를 순서대로 복사하여 프로젝트 터미널에 붙여넣고 실행합니다.
명령어를 모두 입력 후 ECR에서 새로고침을 해보면 빌드된 이미지가 ECR에 푸시된 것을 확인할 수 있습니다.
이미지 pull
$ docker pull [AWS ECR 주소(=이미지 이름)] # ECR에 있는 이미지를 받아올 수 있습니다.
Spring Boot 프로젝트를 하나 생성한 후 AppController 클래스를 생성합니다.
Dockerfile을 생성합니다.
AWS ECR 푸시 명령 보기를 참조하여 이미지를 빌드 및 푸시합니다.
EC2에서 ECR로부터 이미지를 다운받아 컨테이너를 띄웁니다.
❗️만약, 이 과정에서 다음과 같은 에러가 발생한다면, CPU 아키텍처 환경이 일치하지 않기 때문입니다.
EC2 CPU 아키텍처를 확인합니다.$ lscpu # 해당 명령어로 EC2의 CPU 아키텍처를 확인할 수 있습니다.
이미지를 실행하고자 하는 CPU 아키텍처에 맞춰서 이미지를 다시 빌드합니다.
EC2 CPU 아키텍처에 맞게 다시 빌드된 이미지를 ECR로부터 받아온 후 실행해보면, 잘 작동하는 것을 확인할 수 있습니다.
실습 #2에서 사용한 프로젝트 그대로 이어서 실습합니다.
EC2 내부에 폴더를 하나 생성한 후 해당 폴더에 도커 컴포즈 파일을 생성합니다
도커 컴포즈 파일 내용은 다음과 같습니다:
services:
instagram-server:
image: 381492107073.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:lateset # 실제 사용하는 ECR 주소(이미지 이름)를 입력합니다.
ports:
- 8080:8080
depends_on:
my-db:
condition: service_healthy
my-cache-server:
condition: service_healthy
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: pwd1234
MYSQL_DATABASE: mydb
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthcheck:
test: [ "CMD", "mysqladmin", "ping" ]
interval: 5s
retries: 10
my-cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10
도커 컴포즈 파일이 위치한 경로에서 도커 컴포즈 실행 명령어를 입력합니다. 이때, --build
를 포함하여 명령어를 입력해야 합니다.
$ docker compose up -d --build
# 잘 실행되고 있는지 확인하는 명령어:
$ docker ps
$ docker compose ps
$ docker compose logs
간소화된 배포 프로세스
Docker 이미지로 필요한 환경을 모두 캡슐화하여 EC2에서 바로 실행할 수 있습니다.
운영 효율성 향상
AWS 내부에서 이미지 관리와 배포를 통합적으로 처리할 수 있어 운영 복잡도가 줄어듭니다.
보안 및 성능 강화
IAM으로 보안을 강화하고 AWS 네트워크를 활용해 배포 속도와 성능을 최적화할 수 있습니다.