Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

AWS EC2에서 Docker를 활용해 배포해보기 본문

Infra/Docker

AWS EC2에서 Docker를 활용해 배포해보기

studyHub 2025. 8. 19. 21:37

1. Ubuntu에서 Docker, Docker Compose 설치하기

EC2에서 Docker Compose를 활용하기 위해선, 먼저 Docker와 Docker Compose를 설치해야 한다.

sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
newgrp docker && \
sudo curl -L "https://github.com/docker/compose/releases/download/2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 

잘 설치됐는지 확인

$ docker -v # Docker 버전 확인
$ docker compose version # Docker Compose 버전 확인

 


2. AWS ECR(Elastic Container Registry) 활용하기

AWS ECR 이란?

이미지를 저장 및 다운받을 수 있는 저장소 역할하는 것은 Dockerhub 뿐 아니라, AWS ECR도 있다.

AWS ECR을 사용하면 다른 AWS Resource와의 연동이 편하고, AWS 내에서 한 번에 관리할 수 있기에 편하다는 장점이 있다.

 

AWS ECR을 왜 배우는가?

훨씬 간단하게 프로젝트를 배포하고 실행시키기 위해서이다.

프로젝트 코드를 Github에 Push 한 뒤에, AWS EC2에 접속해서 해당 코드를 Pull 받아서 실행시키는 방식

Docker를 사용하지 않았는 위 방식은 프로젝트 코드 전체를 EC2로 이동시켜야 하며, 프로젝트 코드를 실행시킬 런타임 환경(Node, JDK 등)도 설치되어 있어야만 실행이 된다.

Docker의 가장 큰 장점은 이식성이다. Docker만 깔려있으면 어디에서든 내가 원하는 프로젝트를 실행시킬 수 있다는 게 장점이다. 프로젝트에서 필요한 코드에 대해서만 Docker 이미지로 빌드해, EC2에서는 그 이미지만 다운받아서 실행시키는 게 훨씬 심플하다.

 


[실습] AWS ECR(Elastic Container Registry) 사용해보기

1. AWS CLI 설치

로컬 PC와 EC2에 각각 설치한다.

2. IAM 생성하기

1) IAM에서 사용자 생성하기

권한 설정 시, 직접 정책 연결> AmazonEC2ContainerRegistryFullAccess 권한 부여.

 

2) Access Key 발급받기

 

3) AWS CLI로 액세스 키 등록하

 

3. AWS ECR(Elastic Container Registry) 셋팅하기

Docker 이미지를 저장할 수 있는 저장소를 만든다.(프라이빗)

일반적으로 하나의 리포지토리에는 한 종류의 이미지만 저장하고 관리한다.

 

4. 이미지 빌드해서 AWS ECR에 Push, Pull 해보기

1) Dockerfile 작성하기

FROM openjdk:21-jdk

COPY build/libs/*SNAPSHOT.jar app.jar

EXPOSE 80

ENTRYPOINT ["java", "-jar", "/app.jar"]
CMD ["--spring.profiles.active=dev"]

 

2) 이미지 빌드 및 push 하기
AWS ECR에 들어가서 ‘푸시 명령 보기’ 버튼을 누르면, 어떻게 이미지를 Push하면 되는 지 친절하게 설명이 나와있다.

 

3) EC2에서 이미지 Pull 받고 컨테이너 띄우기

$ docker image rm -f [Container ID] # 기존 갖고있던 이미지 지우기
$ docker pull 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server
$ docker image ls
$ docker run -d -p 8080:8080 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server

 

※ 서버 실행 시 오류 발생할 경우

이러한 에러가 발생할 수도 있다.

이 에러의 원인은 CPU 아키텍처 환경이 다르다는 뜻이다. 조금 더 자세히 설명하자면, 이미지 빌드는 M1과 같은 ARM 기반의 환경에서 진행하고, 이미지 실행은 ARM 기반의 환경이 아닌 곳에서 할 때 위와 같은 에러가 발생한다.

# AWS EC2의 CPU 아키텍처 확인하는 방법
$ lscpu

 

위 에러를 해결하기 위해서는 이미지를 실행시키고자 하는 CPU 아키텍처에 맞춰서 이미지를 빌드해야 한다. 로컬 환경에서 아래와 같이 다시 빌드한 뒤 AWS ECR로 Push하자.

$ ./gradlew clean build
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com
$ docker build --platform linux/amd64 -t instagram-server .
$ docker tag instagram-server:latest 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest
$ docker push 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest

 

4. Docker Compose로 배포하기

Docker Compose의 장점 중 하나는 복잡한 명령어로 실행시키던 걸 간소화 시킬 수 있다는 점이 있다. 따라서 Docker CLI 말고 Docker Compose를 활용해서 배포해보자.

 

1) 폴더 만들기

 

2) AWS EC2에 compose.yml 만들기

services:
  dev-capturecat-server:
    image: 911634252644.dkr.ecr.ap-northeast-2.amazonaws.com/이미지
    command: ["--spring.profiles.active=dev"]
    volumes:
      - type: bind
        source: /etc/secrets
        target: /etc/secrets
        read_only: true
    ports:
      - 80:80
    depends_on:
      dev-capturecat-db:
        condition: service_healthy
      dev-capturecat-cache-server:
        condition: service_healthy
  dev-capturecat-db:
    image: postgres
    environment:
      POSTGRES_DB: DB NAME
      POSTGRES_USER: 아이디
      POSTGRES_PASSWORD: 패스워드
      MYSQL_ROOT_PASSWORD:
      MYSQL_DATABASE:
    volumes:
      - /home/ubuntu/capturecat/database/docker-postgresql/postgresql_data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} -h 127.0.0.1 -p 5432"]
      interval: 5s
      retries: 10
  dev-capturecat-cache-server:
    image: redis
    ports:
      - 6379:6379
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 5s
      retries: 10

 

3) 실행시켜보기

$ docker compose up --build -d

 

4) 새로운 기능이 업데이트된 경우, AWS EC2에 업데이트 된 내용 반영하기

$ docker compose pull  # compose.yml에 작성된 이미지를 다운로드 또는 업데이트 할 때 사용
$ docker compose up --build -d

 

 



참고 자료 & 이미지 출처
비전공자도 이해할 수 있는 Docker 입문·실전