아래는 패키징을 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 옆에 작성하면 로그가 뜬다.
이 로그에서 문제가 뭔지를 파악하면 된다.