• 서버 환경 : Ubuntu 24.04 LTS (GNU/Linux 6.8.0-1012-aws x86_64)
  • MySQL : 8.0.32
  • 스프링부트 : 3.3.3
  • Redis : latest(24.8.26 기준)

 

EC2에 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 버전 확인

 

 

 

AWS ECR 설치

필자는 Mac OS를 사용중이므로 맥 기준으로 설명

로컬 PC에 AWS ECR 설치

brew install awscli
aws --version # 잘 출력된다면 정상 설치된 상태

 

EC2에도 AWS ECR 설치

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 # 잘 출력된다면 정상 설치된 상태

 

IAM 생성

사용자 생성

 

액세스 키 발급

액세스 키와 비밀 액세스 키는 따로 적어놓거나 보관해두어야 한다.

 

AWS CLI로 액세스 키 등록

$ aws configure
AWS Access Key ID [None]: <위에서 발급한 Key id>
AWS Secret Access Key [None]: <위에서 발급한 Secret Access Key>
Default region name [None]: ap-northeast-2
Default output format [None]:

로컬 PC에서 등록

 

EC2에서 등록

 

 

AWS EC2에 Spring Boot 배포

Docker 파일 작성

FROM openjdk:17-jdk

WORKDIR /spring-boot

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

ENTRYPOINT ["java", "-jar", "/spring-boot/app.jar"]

 

 

이미지 빌드 및 Push

Amazon Elastic Container Registry

 

Mac에서

먼저 스프링 부트를 빌드 하고, 4개의 항목에 대해서 터미널에 입력한다.

맥 사용자는 도커 이미지를 빌드할 때, --platform linux/amd64 를 붙혀주는 것을 잊지 말자.

#스프링부트 빌드
./gradlew clean build

#로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com

#--platform linux/amd64를 추가적으로 붙여준다(linux/amd64 플랫폼 지정)
docker build --platform linux/amd64 -t instargram-server .

#instargram-server:latest 이미지를 ECR 레포지토리에 맞는 태그로 재태깅함.
docker tag instargram-server:latest 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest

#ECR로 푸시
docker push 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest

 

 

Amazon Elastic Container Registry

이미지가 생긴 것을 확인할 수 있다.

 

 

이후 URI를 복사해둔다.

 

EC2에서 아래의 명령어를 입력한다. 

#로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com

docker pull <이전에 복사한 URI>

docker image ls

docker run -d -p 8080:8080 <image ls 확인한 명령어로 이미지 리포지토리 명>

 

<image ls 명령어로 이미지 리포지토리 명 확인 후 실행>

 

전체 과정

 

이후 EC2의 퍼블릭 아이피로 접속하면 스프링부트 프로젝트가 정상적으로 구동하고 있는 것을 확인할 수 있다.

 

Docker Compose를 이용한 SpringBoot + MySQL + Redis 배포

폴더를 하나 생성 후 vim 편집기로 compose 파일의 내용을 정의해준다.

#Vim 편집기로 Compose 파일 수정
vi compose.yml

 

services:
  instagram-server:
    image: <이전에 입력한 URI>
    ports:
      - 8080:8080
    depends_on:
      my-db:
        condition: service_healthy
      my-cache-server:
        condition: service_healthy
  my-db:
    image: mysql:8.0.32
    environment:
      MYSQL_ROOT_PASSWORD: <사용자정의 비밀번호>
      MYSQL_DATABASE: mydb
    volumes:
      - /home/ubuntu/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
  • instagram-server:
    -이미지: <이전에 입력한 URI>
    이 Docker 이미지가 AWS ECR에 저장되어 있다. Docker Compose는 이 이미지를 사용하여 컨테이너를 시작한다.
    -포트: 8080:8080
    로컬 머신의 포트 8080을 컨테이너의 포트 8080에 매핑하여 외부에서 웹 애플리케이션에 접근할 수 있도록 한다.
    -의존성(depends_on):
    my-db와 my-cache-server가 service_healthy 조건을 만족할 때까지 이 서버는 시작되지 않는다. 이는 서비스가 실행되는 순서를 정의한다.

  • my-db:
    -이미지: mysql
    mysql 이미지를 사용하여 MySQL 데이터베이스를 설정한다.
    -환경 변수:
    MYSQL_ROOT_PASSWORD: MySQL의 루트 비밀번호를 설정한다.
    MYSQL_DATABASE: mydb라는 데이터베이스를 생성한다.
    -볼륨:
    ./mysql_data:/var/lib/mysql: 로컬 디렉토리 ./mysql_data를 컨테이너의 MySQL 데이터 디렉토리 /var/lib/mysql에 마운트하여 데이터를 유지한다.
    -포트: 3306:3306
    로컬 머신의 포트 3306을 컨테이너의 MySQL 포트 3306에 매핑한다.
    -헬스체크:
    MySQL이 정상적으로 실행되고 있는지 확인하기 위해 mysqladmin ping 명령을 사용하여 상태를 주기적으로 체크한다.

  • my-cache-server:
    -이미지: redis
    Redis 이미지를 사용하여 캐시 서버를 실행한다.
    -포트: 6379:6379
    로컬 머신의 포트 6379를 컨테이너의 Redis 포트 6379에 매핑한다.
    -헬스체크:
    redis-cli ping 명령을 사용하여 Redis가 정상적으로 실행 중인지 확인한다.

 

 

 

이후 Compose를 실행시켜야 한다.

docker compose up -d --build

스프링 부트, mysql, redis가 모두 정상적으로 실행되고 있는 것을 확인할 수 있다.

 

프로젝트 업데이트시 유지보수

프로젝트를 운영하면서 프로젝트의 변경사항이 있다고 가정하자.

./gradlew clean build

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com

docker build --platform linux/amd64 -t instargram-server .

docker tag instargram-server:latest 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest

docker push 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest

위 코드는 이전에 언급했던 명령어이다.

다시 이 코드를 입력하여 AWS CLI에 푸시한다.

 

새로운 이미지가 추가된 것을 확인할 수 있다.

 

이제 아래의 명령어를 이용하여 compose 파일에 작성되어 있는 이미지를 업데이트 시킨다.

docker compose pull

docker compose up -d --build