그전에는 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 파일을 만들자!
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 images
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 stop [container ID]
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 설치하고 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