본문 바로가기

Server/Infra

[Docker] jar 파일 도커(docker) 이미지로 배포하기 (with. Java, SpringBoot)

반응형
SMALL

Docker로 서버 배포하기

진행하던 사이드 프로젝트에서 헥사고날 아키텍처를 도입하게 되었다. 그에 따라 멀티모듈로 싹 바꾸고 리팩토링 작업을 진행했다. 약 일주일 간의 작업 후 수정된 서버를 재배포하려고 하니 배포에 실패하고 말았다..! EC2 용량 부족의 문제였다. 당황해서 EC2 불륨을 늘려보고 캐시를 지워보고 용량을 확보하기 위해 이것저것 해보았지만, 결국 안그래도 적은 용량을 늘려도 커진 jar 파일을 감당하기엔 무리였던 것 같다.. 하루 정도 텀을 두고 곰곰히 생각해보니 기존의 배포 방식은 jar 파일을 압축해서 AWS를 통해 올려 zip 파일을 ec2 서버 내에서 다시 풀고, 빌드된 jar 파일을 실행시키는 구조였다. 배포 파일 크기를 줄일 수 있는 방식이 없을까 고민하다가 도커 이미지를 떠올렸다.

 

혼자 생각해보고 적용한 큰 흐름이다. 로컬에서 jar 파일을 도커 이미지로 빌드하고, 도커 허브에 push 한다. 그럼 EC2 내부에서 이미지를 pull 받아 실행시키면 배포 성공!인 것이다. 도커를 깊게 파본 적은 없었기 때문에, 우선적으로 수동 배포를 먼저 시도해보기로 결정했다. 이번 기회에 도커를 조금씩 깊게 파보면 좋을 듯하다 ㅎㅎ

 

도커 이미지 생성

우선 로컬 내에서 작업한 프로젝트를 jar 파일로 빌드한다. 프로젝트 빌드를 진행하면 jar 파일은 뿅하고 생긴다.

빌드된 jar 파일을 가지고 도커 이미지를 만들면 된다.

 

$ docker build -t smeem .

 

프로젝트 이름(smeem)으로 도커 이미지를 생성했다.

 

빌드가 끝나고, docker images 명령어를 이용해 생성된 이미지를 확인할 수 있다.

 

도커 이미지 태그

$ docker image tag smeem smeemdev/smeem-dev:2.0

도커 이미지에 도커 허브 이름으로 태그를 붙여줬다. 도커 허브에 이미지를 올리기 위함인데, 도커 허브 username/repository명으로 태그가 필요한 듯 보였다. 도커 이미지(smeem)에 태그(smeemdev/smeem-dev:2.0)를 붙여줬다.

 

이미지를 확인해보면, 지정한 이름(smeemdev/smeem-dev)으로 태그(2.0)이 붙어 새로 생성된 것을 확인할 수 있다.

 

도커 이미지 push

$ docker push smeemdev/smeem-dev:2.0

도커 이미지를 도커 허브에 푸시(push)한다. 혹시 푸시되지 않는다면 docker login 명령어를 통해 로그인하고 다시 시도해보자.

 

잘 올라간 것을 확인할 수 있다! 보면 2.1 태그도 추가로 올라와있는 것을 볼 수 있는데, EC2 플랫폼 호환이 맞지 않아서 재빌드했기 때문이다.

 

💣 도커 이미지 플랫폼 관련 이슈 트러블 슈팅

우분투 환경의 EC2 내에서 도커 이미지를 실행하려고 하니, 에러가 발생해서 GPT와 대화를 나눈 화면이다. (똑똑한 지피티 👍)

지피티 말대로, 플랫폼이 달라서 발생한 문제였고, 플랫폼에 맞춰 도커 이미지를 생성해주니 이슈는 해결되었다.

 

EC2 도커 설치

이제 도커 허브에도 이미지가 정상적으로 업로드 되었으니, EC2에서 이미지를 pull 받아 실행시켜 주기만 하면 된다. docker 명령어를 활용하기 위해서 ec2 내부에도 도커를 설치해주어야 한다. 도커 설치는 아래 아티클을 참고해서 진행했다.

https://everydayyy.tistory.com/121

 

도커 이미지 pull

EC2 내에 접속해서 업로드한 도커 이미지를 pull 받아왔다. 만약 도커 허브 레포지토리가 private라면 docker login이 필요하니 참고하자. public이라면 pull 명령어만 입력해주면 로그인 없이도 잘 받아와진다.

 

도커 이미지 실행

$ sudo docker run -p 80:8080 smeemdev/smeem-dev:2.1

드디어 배포 단계..!! pull 받은 도커 이미지를 위의 명령어를 이용해 실행시켜준다!! (-p 옵션은 포트 번호 지정하는 역할)

 

잘 실행되는 것을 확인할 수 있다 ㅎㅎ 백그라운드로 실행시키고 싶다면 옵션 -d를 추가해주면 된다.

 

추가 방향성

우선적인 배포 이슈는 이렇게 해결되었다. 급하게 해결하느라 수동 배포로 진행했는데, 이후 좀 더 공부해보면서 도커 기반의 배포 자동화 환경을 구축해볼 예정이다 :)

 


References

https://mvje.tistory.com/169

https://everydayyy.tistory.com/121

https://hongl.tistory.com/117

반응형
LIST