컨테이너 저장소 비교 (AWS ECR vs DockerHub)

modolee
Day34 Inc.
Published in
7 min readNov 20, 2019

기본 개념

AWS ECR

Amazon Elastic Container Registry (Amazon ECR)은 안전하고 확장 가능하고 신뢰할 수 있는 관리형 AWS 도커 레지스트리 서비스입니다. Amazon ECR은 AWS IAM을 사용하여 리소스 기반 권한으로 프라이빗 도커 리포지토리를 지원하므로 특정 사용자나 Amazon EC2 인스턴스가 리포지토리 및 이미지에 액세스할 수 있습니다. 개발자는 Docker CLI를 사용하여 이미지를 푸시, 가져오기 및 관리할 수 있습니다.

  • 레지스트리 : Amazon ECR 레지스트리는 AWS 계정마다 제공됩니다. 레지스트리에 이미지 리포지토리를 생성한 다음 이 리포지토리에 이미지를 저장할 수 있습니다.
  • 사용자 권한 토큰 : AWS 사용자로서 Amazon ECR 레지스트리에 대해 인증하는 데는 Docker 클라이언트가 필요합니다. 인증이 되면 이미지를 푸시 및 가져올 수 있습니다. AWS CLI get-login 명령을 사용하면 인증 자격 증명이 제공되어 Docker에 연결할 수 있습니다.
  • 리포지토리 : Amazon ECR 이미지 리포지토리에는 도커 이미지가 들어 있습니다.
  • 리포지토리 정책 : 리포지토리 정책을 사용하면 리포지토리 및 리포지토리 내 이미지에 대한 액세스를 제어할 수 있습니다.
  • 이미지 : 리포지토리에 도커 이미지를 푸시하고 가져올 수 있습니다. 개발 시스템에서 로컬로 이러한 이미지를 사용하거나, Amazon ECS 작업 정의에서 이를 사용할 수 있습니다.

DockerHub

Docker Hub는 Docker에서 제공하는 서비스로써 컨테이너 이미지를 찾고 팀과 함께 공유할 수 있게 해줍니다. 주요 요소들은 리포지토리, 팀&조직, 공식 이미지, 퍼블리셔 이미지, 빌드, 웹 훅이다.

  • 리포지토리 : 컨테이너 이미지를 Push하고 Pull 할 수 있는 저장소이다.
  • 팀 & 조직 : 컨테이너 이미지를 저장하고 있는 프라이빗 리포지토리의 접근을 제어한다.
  • 공식 이미지 : Docker에서 공식적으로 제공하는 믿을 수 있는 고품질의 컨테이너 이미지로 Pull 해서 바로 사용할 수 있다.
  • 퍼블리셔 이미지 : 외부 제조사에서 제공하는 고품질의 이미지로 Pull 해서 바로 사용할 수 있다. 인증 된 이미지는 지원과 Docker Enterprise와의 호환성을 보장한다.
  • 빌드 : 자동으로 GitHug와 Bitbucket에서 데이터를 받아서 컨테이너 이미지를 빌드한다. 그리고 빌드 된 이미지를 Docker Hub에 Push한다.
  • 웹 훅 : Docker Hub와 다른 서비스를 통합하기 위한 트리거 액션들로 리포지토리에 성공적으로 Push가 되고 난 후에 발생한다.

비용

  • 서비스 1개에 필요한 컨테이너는 3개이고(Frontend, Backend, Nginx)의 총 용량을 1GB 라고 가정
    - 현재 KStarLive는 php, nginx 두 컨테이터의 합이 650MB 가량
  • 매주 2회 업데이트가 일어난다고 가정
    - 한 달에 총 8회 PULL
    - 기타 개발용으로 발생하는 PULL은 실 서버의 5배로 예상, 40회
    - 총 48회의 PULL 발생

AWS ECR

  • 아시아 태평양(서울) 리전 기준

스토리지 비용 : 0.10 USD / GB (매 월 발생)

데이터 수신(PUSH) : 비용 없음

데이터 송신(PULL)

  • 1 GB / 월 : 무료
  • 1 GB 초과 10 TB 이하 / 월 : 0.126 USD
  • 10 TB 초과 50 TB 이하 / 월 : 0.122 USD
  • 50 TB 초과 100 TB 이하 / 월 : 0.117 USD
  • 150 TB 초과 / 월 : 0.108 USD

예상 비용 : 6.022 USD / 월

  • 스토리지 비용 : 0.10 USD = 1 * 0.10
  • 데이터 송신 비용 : 5.922 USD = (48–1) * 0.126
  • 총 비용 : 6.022 USD

DockerHub

  • Plans for Oranizations 기준

스토리지 비용 : 7 USD / 월

  • Micro : 7 USD / 5 프라이빗 리포지토리 / 5 병렬 빌드
  • Small : 12 USD / 10 프라이빗 리포지토리 / 10 병렬 빌드
  • Medium : 22 USD / 20 프라이빗 리포지토리 / 20 병렬 빌드
  • Large : 50 USD / 50 프라이빗 리포지토리 / 50 병렬 빌드
  • X-Large : 100 USD / 100 프라이빗 리포지토리 / 100 병렬 빌드
  • XX-Large : 250 USD / 250 프라이빗 리포지토리 / 250 병렬 빌드
  • XXX-Large : 500 USD / 500 프라이빗 리포지토리 / 500 병렬 빌드

데이터 송/수신(PUSH/PULL) : 비용 없음

예상 비용 : 7 USD / 월

사용 방법

AWS ECR

사전 준비

  • AWS 가입
  • IAM 사용자 생성
  • AWS CLI 설치
  • AWS CLI 설정
    aws configure
    - AWS Access Key ID
    - AWS Secret Access Key
    - Default region name
  • AWS ECR 로그인
    aws ecr get-login --no-include-email
    - 위에 명령을 실행하면 docker login 으로 시작하는 명령어가 나옴
    - 해당 명령으로 docker login을 하면 24시간 동안 로그인이 유효함

PUSH

  • 이미지 빌드
    docker build -t dockerhub_id/image_name dockerfile_path
  • 이미지 태깅
    docker tag dockerhub_id/image_name:latest ERC_URI/namespace/image_name:latest
  • 이미지 전송
    docker push ERC_URI/namespace/image_name:latest

PULL

  • 이미지 수신
    docker pull ERC_URI/namespace/image_name:latest

DockerHub

사전 준비

  • DockerHub 가입
  • Docker Hub에 로그인
    docker login

PUSH

  • 이미지 빌드
    docker build -t dockerhub_id/image_name dockerfile_path
  • 이미지 전송
    docker push dockerhub_id/image_name:latest

PULL

  • 이미지 수신
    docker pull dockerhub_id/image_name:latest

CI 툴을 이용해서 자동으로 PUSH하는 방법

AWS ECR

Travis CI

after_success:
# Install AWS CLI
- pip install --user awscli # install aws cli w/o sudo
- export PATH=$PATH:$HOME/.local/bin # put aws in the path
# Log in to the docker CLI
- eval $(aws ecr get-login --region us-east-1) #needs AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY envvars
# Build docker image
- docker build -t dockerhub_id/image_name ./
# Tag image for AWS ECR
- docker tag dockerhub_id/image_name:latest ECR_URI/dockerhub_id/image_name:latest
# Take those image and push them to docker hub
- docker push dockerhub_id/image_name:latest

DockerHub

Travis CI

after_success:
# Log in to the docker CLI
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_ID" --password-stdin
# Biuld docker image
- docker build -t dockerhub_id/image_name ./
# Take those image and push them to docker hub
- docker push dockerhub_id/image_name:latest

--

--