본문 바로가기

Trouble Shooting/Cloud

배포과정 : SpringBoot + Docker + Amazon EC2

 

 

목적

하나의 애플리케이션을 제작해보았고 이를 배포하는 과정을 기록해보려고 한다.

초기 과정을 기록해두는 것으로 나중에 방법을 개선하는 방향으로 나아가 보려고 한다.

 

 

 

과정

1. SpringBoot 프로젝트 제작

2. Dockerfile 작성

3. Git Repository 생성 및 push

4. Amazon EC2를 ubuntu 운영체제 이용해 컴퓨터 대여

5. 대여한 컴퓨터에 리눅스 접속

6. 대여한 컴퓨터에 깃 코드 Clone

7. 자바, 도커, Maven 설치

8. 기존의 작성한 Dockerfile을 이용해 해당 파일 빌드 및 이미지 생성

9. 컨테이너 실행 및 서버 연결

 

 

 

 

 

1. SpringBoot 프로젝트 제작

기존의 프로젝트를 이용해 이를 배포하려고 한다.

구성은 아래와 같다.

  • Springboot 3.0.5
  • java 17
  • Maven
  • Sts4
  • Mysql with AWS RDS, Redis(Local - Docker)

 

 

2. Dockerfile 작성

의미 : 아래 파일은 의미상 openjdk 이미지에 app 폴더를 생성하고 현재 작업하고 있는 디렉토리(실제 코드 디렉토리) 파일이나 폴더들을 app 폴더에 복사한다. 이 후, 이미지 생성 작업시 mvn package 명령어를 통해 빌드하고 해당 이미지를 통해 컨테이너 실행시 해당 jar파일을 주어진 위치에서 찾아 실행한다.

# Maven이 설치된 Docker 이미지를 기반으로 설정
FROM maven:3-openjdk-17

# 작업 디렉토리 설정, 없다면 자동 생성 됨
WORKDIR /app

# 소스 코드 복사 (현재 경로에 존재하는 폴더나 파일A를 B에 복사)
COPY src ./src
COPY pom.xml .

# 애플리케이션 빌드 : 이미지 생성시 실행
RUN mvn package

# 애플리케이션 실행 : 컨테이너 실행시 실행
CMD ["java", "-jar", "target/ReservationServer1-1.0.0.jar"]

 

- 환경 변수 설정해야 함.

 

 

 

3. Git Repository 생성 및 push

해당 작업은 깃을 통해 AWS EC2에 코드를 쉽게 저장하기 위한 방법으로

레파지토리 생성해 코드를 Main에 올려둔다.

현재 여기서는 그냥 Main으로 바로 설정하였지만 실제 개발과정에서는 Branch를 만들어 협업 후 올리는게 일반적이다.

git add .
git commit -m "변경사항"
git push origin main

 

 

 

4. Amazon EC2를 ubuntu 운영체제 이용해 컴퓨터 대여

4-1. Amazon EC2 접속

https://ap-northeast-2.console.aws.amazon.com/ec2/home?region=ap-northeast-2#Home: 

 

https://ap-northeast-2.console.aws.amazon.com/ec2/home?region=ap-northeast-2#Home:

 

ap-northeast-2.console.aws.amazon.com

4-2. 서버 서울 설정

- 대상으로 하는 사용자가 많은 지역 주변으로 설정하는 것이 일반적이다.

 

4-3. 인스턴스 시작

 

4-4. OS 설정, 키페어 설정, 네트워크 설정, 스토리지 설정

- 인스턴스는 1개로 설정 -> 컴퓨터 한대를 사용함을 의미

- 운영체제는 ubuntu로 설정하고 인스턴스 유형 또한 ubuntu의 t2.micro로 설정하여 아마존 프리티어가 무료로 사용가능한 버전으로 설정한다.

- 키페어는 서버 보안을 위해 사용되는 파일로 노출하지 않고 개인의 컴퓨터에 저장을 하는 것이 일반적이다.

 

 

4-5. 인스턴스 연결

- 인스턴스 상태가 실행중일때 가능하다.

- 이 후, terminal이 열린다.

 

 

 

5. 대여한 컴퓨터의 리눅스 접속

- ubuntu는 기본적으로 리눅스를 운영체제로 사용한다.

- 인스턴스 생성 후 연결시 터미널이 열리고 사용하면 된다.

- 본인의 컴퓨터에서 연결 원할시 SSH 클라이언트 창을 통해 연결

 

 

 

6. 대여한 컴퓨터에 깃 코드 Clone

루트 디렉토리에서 git clone 사용하는 깃 주소 입력으로 클론 처리

 

 

 

 

7. 자바, 도커, Maven 설치

자바 설치

- sudo apt update

- sudo apt install openjdk-17-jdk (사용하고자 하는 버전에 맞춰 사용)

- java -version (버전 정보 뜨면 설치 완료)

 

Maven 설치

- sudo apt install maven

 

Docker 설치

// 운영체제 시스템 패키지 업데이트
sudo apt-get update
// 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
// Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
// Docker 공식 apt 저장소 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
// 시스템 패키지 업데이트
sudo apt-get update
// Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io
// 설치 확인
sudo systemctl status docker
// Docker 실행
sudo docker run hello-world

 

 

추가적으로 실행시 아래와 같은 오류가 발생할 수 있다. 해결방법은 다음과 같다.

 

오류

[linux@localhost ]$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permi
ssion denied

 

해결방법

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

 

 

 

8. 기존의 작성한 Dockerfile을 이용해 해당 파일 빌드 및 이미지 생성

- docker build -t 이미지이름 .

 

 

9. 컨테이너 실행 및 서버 연결

- docker run -p 호스트포트:컨테이너포트 컨테이너 이름

-> 호스트 포트와 컨테이너 포트 연결해 서버 연결

 

또한, 해당 포트는 인스턴스의 보안 그룹 - 인바운드 규칙 편집에서 개통해주어야 연결이 성립된다.

인바운드 규칙 : 외부에서 AWS EC2로 접속을 의미

아웃바운드 규칙 : AWS EC2에서 외부로 접속을 의미

 

- HTTP 설정 - 포트범위 설정 - 접속 가능 IP 설정 (아래와 같이 지정시 모두 접속 가능)