본문 바로가기
대외활동/기타

[Toy Project] Spring Boot + Docker + EC2 로 배포해보기

by 윤J 2023. 8. 30.

Spring Boot + Docker + EC2 의 조합이 많이 쓰인다고 하여, spring으로 만든 기본 페이지를 docker을 이용해서 배포해보고 도메인까지 할당하는 간단한 프로젝트를 진행해보기로 했다. 한마디로 오직 배포를 위한 프로젝트이다.

 

Docker

일단 Docker의 개념에 대해 알아보자면, 도커는 다양한 의존성을 추상화하여 어떤 환경에서든 실행하기 위해 필요한 모든 의존성을 포함하는 패키지로, 서비스 파일이 어디서나 동일하게 실행될 수 있도록 하는 환경을 조성해주는 것이라고 생각하면 된다. 그래서 서비스 운영에 필요한 서버 프로그램, 소스코드나 라이브러리, 컴파일된 실행 파일을 묶은 형태를 Docker Image 라고 한다. (jpeg 같은 이미지가 아니다) 이 이미지를 바탕으로 서비스를 돌린 것이 Docker Container인 것이다.

 

도커 이미지(Docker Image)는 컨테이너(Container)를 만드는 데 사용되는 읽기 전용 템플릿(Read-only templates)이고, 컨테이너(Docner Container)는 이러한 템플릿에서 생성된 배포된 인스턴스(Deployed Instances)라고 생각하면 좋다.


일단 스프링부트로 초간단하게 화면을 만들어주었고,

 

 

AWS EC2로 서버 만들기

AWS의 EC2로 서버 만들고 기본적인 설정하기

velog.io

 를 참고해서 AWS에서 EC2의 인스턴스와 탄력적 IP를 생성해서 연결해주었다.


1. EC2 에서 인스턴스 생성

2. 탄력적 IP 생성 후 인스턴스와 연결

3. .pem 키 파일을 ~/.ssh 경로로 복사하고 chmod 600 .pem 명령어 써서 권한 변경한다

4. ~/.ssh 디렉토리에 config 파일 생성하고 아래 내용을 작성한다.

Host 플젝 이름
HostName 탄력적 ip 주소
User ec2-user
IdentityFile .pem 키 주소

 

5. config 파일 권한 chmod 700 으로 바꿔준다

6. ssh 플젝 이름 해서 ec2 접속한다 (rds 사용하는 경우 따로 ec2에서 db 만들고 연결시켜주기)

7. 자바 다운 & 깃 다운 받기

  • 나는 기본 java 버전이 17인데 근데 여기서 자바 11 다운 받는 걸 안내해줘서 나중에 완전 오류남
  • java 17 다운받고 # update-alternatives --config 사용해서 자바 버전 change 해주기

 

 

스프링부트를 도커로 EC2에 배포하기 (SpringBoot, Docker, EC2)

SpringBoot + Docker + EC…

devfoxstar.github.io

를 참고하여, WSL & 도커 가입해서 Docker Desktop 설치해주었고

DockerFile 도 만들어주었다! -> git repository 에 올리기

그리고 나서 계속 오류가 났는데 여기서 docker build 명령어 쓰는 게 아니라 EC2 접속한 다음에 거기에서 명령어 쓰는 것이었다.

 

cd ~/.ssh

ssh 키 이름

sudo su -

cd ~ (루트로 이동한다)

git clone [repository 주소]

(해당 폴더 들어간 다음에)
sh gradlew
sh gradlew build

 

그런데 문제가 생겼다.

sh gradlew build 했는데 76%에서 멈춰서 다운이 안되는 것 ㅠㅠ 한마디로 무한로딩이 걸렸다. 😭

찾아보니 이건 EC2의 메모리 문제일 수도 있다고 그래서

 

 

EC2 gradle build시 무한 로딩 오류 해결

오류 내용 EC2에서 ./gradlew build를 하면 무한로딩이 되면서 인스턴스를 중지한 후에 다시 실행시켜야 접속이 되는 상황이 발생했다. 원인 메모리 부족으로 인해 발생한 문제. 프리티어를 쓰다보니

ge0nmo.tistory.com

를 보고 스왑 공간을 할당해주었다.

감격스러운 성공

근데 이제 또 하나의 산이 남았는데 바로 EC2 서버에도 도커를 설치해주어야 한다는 것이다.

sudo yum install docker -y
docker
sudo systemctl status docker
sudo systemctl start docker
sudo systemctl enable docker
docker run -p 80:80 nginx

이렇게 도커 설치까지 완료했다.

 

이제 git bash 에서

docker build -t docker id/프로젝트명 . (한칸 띄어주기 필수)

입력해주면 Docker Image 가 생성된다!

 

주의) 오류가 생기기 때문에 plain.jar 은 삭제해주었다.

 

마지막으로 아래의 명령어를 입력해주면

docker run -p 8080:8080 spring-bappo

짠~


원래 로컬 환경에서 Docker Hub에 도커이미지를 push 하고 EC2 환경에서 도커 설치 후 이미지를 pull 받는 형식이지만 이 프로젝트에서는 EC2 환경에서 도커이미지를 생성해주었기 때문에 사실상 Docker Hub는 필요가 없다.

그래도 알아두는 게 좋기 때문에 Docker Hub에 도커 이미지를 push 해보겠다.

 

Docker Hub 에 해당 이미지를 push 해주는 명령어들이다.

docker tag 이미지id 내id/spring-bappo:done

docker push 내id/spring-bappo:done

이제 터미널을 꺼도 서버가 계속 돌아가도록 하기 위해 nohub 명령어를 써줄 것이다.

반드시 EC2 서버 환경에서 입력해주어야 한다.

nohup java -jar build/libs/spring-bappo-0.0.1-SNAPSHOT.jar & > /dev/null

 

그러면 서버가 계속 background에서 돌아가게 된다.

 

이제 도메인을 할당해줄 것인데, 내 도메인 사이트에서 도메인을 만들었고

 

내도메인.한국 - 한글 무료 도메인 등록센터

한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공

xn--220b31d95hq8o.xn--3e0b707e

 

위 블로그를 참고해서 EC2에서도 도메인을 연결해주었다.

 

AWS EC2 도메인 연결

1. AWS EC2 Route 53 이동 https://us-east-1.console.aws.amazon.com/route53/v2/home#Dashboard 2. "호스팅 영역" 선택 > "호스팅 영역 생성" 선택 3. 도메인 이름 입력 4. 레코드 생성 선택 5. 값 입력 6. www, 기본 도메인에

cutebabypig15.tistory.com

이제 아래 사이트로 들어가면 결과가 뜬다. 😂😂

감격스럽다. 😙😙

 

 

spring-bappo

 

docker-bappo.o-r.kr:8080

 

 

댓글