Docker로 SpringBoot jar파일 AWS EC2에 배포하기

devdo·2022년 2월 11일
0

Docker

목록 보기
5/9
post-thumbnail

그전에는 Springboot 프로젝트에서 빌드해서 jar파일로만 배포하는 것을 실습해보았다.
이번에는 Docker를 설치해서 Docker image로만 간단하게 배포하는 방법을 실습해보자.


Docker 이미지는 Dockerfile을 빌드해서 만들어낼 것이다. Dockerfile 위치는 프로젝트 바로 하단에 놓으면 된다.

mooh2jj/cpu-bound-application-1 프로젝트에 쓰일 Dockerfile

빌드 도구(maven, gradle)에 따라 Dockerfile 양식이 조금 다를 수 있다. 주의하자!

Dockerfile

maven

# 최신 17-jdk 이미지로 부터 시작
FROM openjdk:17-jdk
# 인자 정리
ARG JAR_FILE=target/*.jar

# 앞에는 HOST OS의 현재 폴더를 의미
# 뒤에는 컨테이너의 현재 폴더(WORKDIR)를 의미
COPY ${JAR_FILE} app.jar

# 안해도 되지만, 하는게 좋습니다.
# 이 컨테이너는 8080 포트를 사용한다는 의미 입니다.
EXPOSE 8080

# docker run 명령에서 실행항 명령어
ENTRYPOINT ["java","-jar","/app.jar"]
# java 옵션 처리
# ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","/app.jar"]

gradle

FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

💥gradle 같은 경우, springboot 2.5 버전 이후에 jar 파일이 두개가 생겨 별도의 설정을 하지 않으면 docker이미지가 뜨지 않을 것이다. gradle로 빌드시, build.gradle에 별도 설정을 추가하자.

build.gradle

// gradle 시 꼭 해주어야 됨
jar {
    enabled = false
}

gradle build

./gradlew clean build

으로 jar 파일을 만들자!

  • 생성된 jar 파일 위치


로컬에서 docker 이미지 build해서 컨테이너 실행하기

docker login

## 도커허브에 등록된 id 그다음 password를 등록하면 docker 명령어를 칠 수 있게 됩니다.
docker login -username={dockerhub ID}

docker build

나중에 dockerhub push를 위해 [dockerHub ID이름]/ 앞단을 꼭 지정해주자.

💥 당연하지만, docker build 명령어는 빌드할 Dockerfile이 있는 경로에서 해줘야 한다!

# 뒤에 아무것도 안넣을시 자동으로 `:latest`로 되어진다.
docker build -t mooh2jj/cpu-bound-application-1 .

docker tag
[dockerHub ID이름]/ 안했거나 image 이름을 바꾸고 싶을시, tag 명령어를 적어소 바꿔주면 된다.

docker tag mooh2jj/cpu-bound-application-1

  • docker image 확인
docker images

  • docker image 실행 -> docker continer가 된다.
docker run -p [외부접속포트:도커컨테이너포트] [build한 image 이름]
docker run -p 8080:8080 mooh2jj/cpu-bound-application-1

💥 오류

docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

이것은 8080 port가 중복되어서 생긴 문제다.

cmd에 가서 kill 해주면 된다.

netstat -ano | find "4646"

taskkill /f /pid "pid"

로컬에서 docker imege 실행 확인

브라우저에서 확인

http://localhost:8080/hash/1111

이제 로컬에서 정상동작됨을 확인했으니 AWS EC2 인스턴스에서 배포해보면 된다.

  • docker container 멈추기
docker stop [container ID]

dockerHub에 이미지 등록하는 법

push 하고 pull을 받을려면 dockerHub에 push 한 이미지를 Repository로 등록해주어야 한다.

docker 로그인하기

docker login

이제 sudo를 안붙여도 된다!

docker 이미지 push하기 -> docker Hub Repository에 등록됨

docker push mooh2jj/cpu-bound-application-1

💥 주의사항

push할 image는 docker build 시 tag 이름으로 지정되니, docker build 시 tag 이름을 꼭 dockerHub ID이름까지 지정해줘야 한다.

실제 dockerHub 페이지(https://hub.docker.com/repositories)에 들어가보면 도커 이미지가 들어간 걸 확인할 수 있다.

push 확인 - Docker registry 에 들어가서 확인해보면
빨간색 사각형 처럼 이미지 push를 확인할 수 있다.


AWS EC2 인스턴스에 Docker로 배포하기

이제 AWS EC2 인스턴스에 배포하기 위한 할일은 docker 설치하고 docker run 명령어밖에 없어졌다.

docker 설치 : https://velog.io/@mooh2jj/AWS-EC2-Docker-설치

docker run 실행

run을 할시 dockerHub에 이미지가 등록되어있으면 자동으로 pull해서 실행시켜준다.

docker run -p 8080:8080 mooh2jj/cpu-bound-application-1

브라우저 확인

docker를 사용하니 서버에 배포하는 일이 이렇게 간단해질 수 있게 됐다.
접속할 원격서버에 docker 설치docker run 명령어만 하면 되니까 말이다.

더 나아가면 jenkins라는 CI/CD 도구를 이용하면 더 간단하게 배포가 가능하다.



참고

maven 소스출처 : https://github.com/mooh2jj/cpu-bound-application-1.git

profile
배운 것을 기록합니다.

0개의 댓글