아래는 패키징을 WAR로 작업한 스프링부트 서버를 도커에 올리는 과정이다. 

개인적인 기록을 위한 것으로 간단하게 명령어만 서술하려 한다.

 

- 필자는 Window10 버전을 사용한다.

- 도커가 설치되어있다고 가정한다.

- Gradle을 사용하여 빌드한다

- Dockerfile을 사용하여 도커에 올린다

 

참고 : https://zzang9ha.tistory.com/360

 

 


1. Dockerfile 작성

프로젝트 루트 폴더에 Dockerfile을 생성한다.

 

파일 내부에는 아래와 같이 작성한다

 

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

 

필자는 java 17버전을 사용하고 있어서 jdk:17로 baseimage를 불러온다. 

ARG는 변수를 선언하는 명령어이다. 빌드를 하면 build/libs/ 폴더에 .war 형태로 저장된다. 이 파일들을 변수에 저장한다.

app.war 파일에 빌드된 war 파일들을 저장한다.

ENTRYPOINT는 도커를 실행할 때 실행하는 스크립트이다.

찾아보니, java -jar 형태로도 war 파일을 실행할 수 있었다.

 

2. 프로젝트 빌드

 

gradlew build -x test

 

-x test 는 test를 생략한다는 명령이다.

빌드를 진행하면 build/libs 폴더가 생성되며 그 안에 war 파일 2개가 저장된다.

 

 

3. 도커 이미지 생성

 

docker build --build-arg DEPENDENCY=build/dependency -t 이미지이름 .

 

이미지이름은 dockerTest처럼 원하는 이름으로 지정하면 된다.

마지막에 점(.) 은 필수이므로 잊지 말 것.

 

이미지가 잘 생성됐는지 확인해보고 싶으면 다음 명령어를 입력하면 된다.

 

docker images

 

4. 도커 컨테이너 실행

이제 생성된 도커 이미지로 도커 컨테이너를 실행한다. 

 

docker run -d -p 8080:8080 이미지이름

-d : 백그라운드(데몬)으로 컨테이너를 실행하라는 명령어

-p : 포트를 지정, 연결해주는 명령어. 외부의 8080포트와 컨테이너 내부 8080 포트를 연결한다.

 

컨테이너를 실행하면 컨테이너 ID 하나만 띄우고 터미널 실행이 끝나는데, 제대로 돌아가고 있는지를 확인하려면 다음 명령어를 입력한다.

 

docker ps

 

위 명령어를 입력하면 현재 실행중인 모든 컨테이너를 띄운다.

실행을 시켰는데도 아무것도 뜨지 않는다면, 무언가 문제가 생겨 컨테이너가 종료된 것이다.

종료된 컨테이너까지 모두 보려면 마지막에 -a 를 붙이면 된다.

 

docker ps -a

 

종료된 컨테이너의 경우 STATUS에 Exited라고 뜰 것이다.

오류를 확인하려면 로그를 봐야하니 다음 명령어를 입력해보자.

 

docker logs 컨테이너ID

 

ps -a 명령어로 확인한 컨테이너 ID를 logs 옆에 작성하면 로그가 뜬다.

이 로그에서 문제가 뭔지를 파악하면 된다.

반응형

+ Recent posts