Intro
간단하게 공부한 도커를 이용해서 스프링부트 서버를 컨테이너화 해보기 위해서
스프링부트 공식 사이트 레퍼런스를 참고하면서 컨테이너화를 진행하면서 궁금한 점을 찾아보면서 정리한다.
https://spring.io/guides/topicals/spring-boot-docker
Getting Started | Spring Boot with Docker
Congratulations! You have created a Docker container for a Spring Boot application! By default, Spring Boot applications run on port 8080 inside the container, and we mapped that to the same port on the host by using -p on the command line.
spring.io
위 레퍼런스를 따라하다 보면 Dockerfile에 대해서 궁금한 점이 생겼다.
내가 학습한 Docker는 일단 이미지를 빌드하고 컨테이너화하여 실행하여 브라우저에서 접속할 수 있도록 하는 것을 학습했다.
이를 위해 간단한 Dockerfile Command를 살짝 봤었지만, 정확히 어떤 역할을 위한 명령인지 잘 몰라 Docker 레퍼런스를 찾았다.
https://docs.docker.com/reference/dockerfile/
Dockerfile reference
Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.
docs.docker.com
이 글에서는 내가 스프링부트를 간단하게 컨테이너화 하면서 궁금한 Command에 대해서 정리한다.
Essential
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
궁금한 점은 ARG
이다.
공식 홈페이지를 참고해보니 ARG
는 변수로 값을 저장하는 것인 것 같다.
내가 도커 파일 내에서 저장된 변수의 값을 사용할 수 있도록 하고 build할 때 값을 재할당할 수 있고 도커 파일 내에 선언한 값은 아무것도 입력하지 않았을 때의 DEFAULT 값이다.
그럼 왜 다음과 같이 ARG
를 선언하였는가?
이유는 Gradle과 Maven의 빌드 후 jar 파일이 생기는 위치가 다르기 때문에 동적으로 값을 할당하기 위해서이다.
Maven : target/*.jar : 다음 위치에 빌드한 애플리케이션 파일이 생성된다.
Gradle : build/libs/*jar : 다음 위치에 생긴다.
빌드 시 값을 전달을 위한 플래그는 다음과 같다.
--builc-arg JAR_FILE=xxx/xxx...
COPY
레이어도 궁금하다.
공식 홈페이지 명령어 구조
COPY <src> <dest>
src는 카피할 원본 파일의 위치를 말하는 것 같은데, dest는 애매했다.
JAR_FILE
변수에 저장된 위치의 파일을 이미지 내부로 복사하면서 app.jar 파일로 저장한다.
<src>는 Docker 빌드 컨텍스트에 있는 파일 경로를 가리킨다.
<dest>는 Destination으로 예상과 같이 목적지로 Docker 컨테이너 안에서 파일을 복사할 위치나 이름을 지정한다.
이는 컨테이너 루트 디렉터리에 복사된다. 따라서 컨테이너 내부에서 /app.jar 경로에 app.jar가 저장될까?
확인해보자
일단 설정한 도커 파일 기반으로 이미지를 빌드한다.
docker build -t springio/gs-spring-boot-docker .
docker run -it springio/gs-spring-boot-docker sh
ls /app
도커 컨테이너를 실행할 때 shell로 못들어가서 도커 데스크톱의 도움을 받아 사진을 첨부한다.
확인해보니 루트에 app.jar 파일이 잘 생성된 것을 볼 수 있었다.