본문 바로가기
AyoProject/DevOps

[DevOps] 3. SpringBoot docker image build & run

by 청양호박이 2022. 4. 4.

지난 시간에는 wsl2로 Ubuntu OS가 설치된 가상의 서버를 생성했습니다. 그 다음으로는 Ubuntu server에 docker 환경을 구성하였습니다. 이번에는 SpringBoot로 만든 간단한 application을 docker image로 빌드하고 그것을 실행하는 방법에 대해서 알아보겠습니다.

현재 이 글을 읽어보는 분들을 위해서 기본 SpringBoot 개발환경에 대해서 알아보겠습니다.

jdk 1.8.0_322-1 (LTS, supported until May 2026, announcement)
spring-tool-suite-4-4.14.0.RELEASE-e4.23.0-win32.win32.x86_64
maven (spring-starter)

 

기존에 작성했던 글도 참고해주시면 좋을 것 같습니다.

2019.11.05 - [SpringBoot] - [Spring Boot] 01. 시작하기

 

[Spring Boot] 01. 시작하기

지난번에는 Spring Boot가 무엇인지 간단하게 이야기 해 보았습니다. 오늘은 이제 뭔지는 알았지만, 그래서 어떻게 Spring Boot라는 것을 사용해 볼 수 있는지에 대해서 알아보겠습니다. 순서는 아래

ayoteralab.tistory.com

 

 

1. 간단한 application 제작


STS에서는 Create new Spring Starter Project를 선택하고, 기본세팅은 Maven Project / Jar Packaging / Java Version 8로 세팅하고 나머지는 건드리지 말고 다음으로 넘어갑니다.

Dependencies 세팅은 크게 갈거없이 Spring Web만 체크해주고 Finish로 Project생성에 들어갑니다.

이제 아주 간단한 sample application을 제작해 보도록 하겠습니다. "/" 와 같이 root url을 호출 시 국민적인 string인 hello world!! 를 출력하는 application입니다. 따라서 @RestController와 @RequestMapping만 추가하여 기술하겠습니다.

@SpringBootApplication
@RestController
public class AyoteraLabDockerTestApplication {

	@RequestMapping("/")
	public String home() {
		return "hello world!!";
	}
	
	public static void main(String[] args) {
		SpringApplication.run(AyoteraLabDockerTestApplication.class, args);
	}

}

위와같이 제대로 동작을 합니다.

 

 

2. Maven Build 진행하기


프로젝트에서 마우스오른쪽을 누르고 > Run As > Maven Build로 빌드해 주면 됩니다. 

그러면 한참 Console창이 난리가 나고 아래처럼 Build에 성공하게 됩니다. 성공한 파일은 해당 project workspace내 target 폴더에 들어있습니다.

Error : The requested profile "pom.xml" could not be activated because it does not exist.

다음과 같은 Error가 발생하는 경우는 Maven Build설정에 pom.xml이 포함되어 일텐데... 해결하는 방법은 프로젝트에서 마우스오른쪽을 누르고 > Run As > Run configuration... 을 선택하여 Maven Build설정으로 들어간 후 Profiles에 설정된 pom.xml을 삭제하고 저장하여 다시 빌드를 시도해 보면 됩니다.

Error : No goals have been specified for this build.

다음과 같은 Error가 발생하는 경우는 Maven Build설정에 Goals가 비어있어서 그렇습니다. 아래와 같이 Goals에 package를 입력하고 build를 실행해 보면 됩니다.

 


 

 


 

3. Docker image build


이제 지금까지 만들었던 jar를 가지고 Docker image로 빌드 하고자 합니다. 방법은 jar파일이 있는 곳에 Dockerfile을 만들어서 저장 후 build를 하면 됩니다. Dockerfile은 image build를 위한 환경세팅 파일이라고 보시면 됩니다. 해당 파일은 docker build 명령을 통해서 자동으로 읽혀서 Docker image build를 수행하게 됩니다. 

해당 Dockerfile은 텍스트 파일이고 별도의 확장자는 필요로하지 않습니다.

FROM openjdk:8-jdk-alpine
ARG jar_file=AyoteraLabDockerTest-0.0.1-SNAPSHOT.jar
COPY ${jar_file} ayotera.jar
ENTRYPOINT ["java","-jar","/ayotera.jar"]

간단히 설명하자면 Dockerfile은 정의한 순서대로 읽어서 Docker demon에게 해당 명령을 전달하여 수행하게 됩니다. 

FROM으로 반드시 시작해야 합니다. Docker Base Image로 Docker image의 가본틀을 제공하는 image를 정의합니다. 저는 openjdk 1.8을 사용했기 때문에 해당 버전으로 기술하였습니다. 


CMD도 있지만 저는 소스에서 Docker build를 수행하지 않고, jar로 부터 수행하기 때문에 생략합니다.


ARG는 argument로 내부 변수입니다. jar파일의 위치 및 파일을 명기합니다.


COPY를 통해서 파일을 복사했으며, 


ENTRYPOINT는 java를 실행하는 parameter를 정의합니다. 실제로 jar를 실행하기 위해서는 java -jar jar명 이기 때문에 space가 있다면 다 구분해서 기재해주면 됩니다.

다음으로는 jar파일과 Dockerfile을 wsl로 생성한 Ubuntu server에 넣어줍니다. 

이제 Dockerfile이 위치한 곳에서 docker build를 수행합니다. 

docker build -t ayoteralab-docker-test:0.0.1 .

-t 옵션은 도커 이미지의 이름을 지정하는 옵션입니다. 왼쪽은 repository명, 오른쪽은 tag로 보시면 됩니다. 그리고 가장 중요한 이미지 이름뒤에 (.)는 Dockerfile이 위치한 경로를 명기하는 부분입니다. 가정을 Dockerfile이 위치한 곳에서 수행하는 것이기 때문에 (.)만 넣어줍니다. 

 

Error : unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /APP/dokertest/Dockerfile: no such file or directory

이유는 Dockerfile에 특정 확장자가 붙어있기 때문일 수 있습니다. 다시 확인을 해보셔야 합니다. 저도 vi에서 안만들고 notepad에서 했더니 우연히 들어가 버렸습니다.

Error : Error response from daemon: dockerfile parse error line 2: ARG names can not be blank

이유는 Dockerfile의 2번째 줄 변수를 세팅하는 ARG에서 공백이 들어갔기 때문입니다. 
ARG jar_file = AyoteraLabDockerTest-0.0.1-SNAPSHOT.jar 에서 보시면 (=)양옆에 공백이 있습니다 따라서 이것을 모두 없애주면...ARG jar_file=AyoteraLabDockerTest-0.0.1-SNAPSHOT.jar 요렇게 해보면 됩니다.



 

아주 잘 됬습니다. Successfully built됬다고 하고 해당 이미지는 5a18be44d541 ID를 가지고 있습니다. docker에서 images명령으로 확인해 봅니다. 

sudo docker images

이제 마지막으로 docker run으로 실행해 보겠습니다. docker run에는 몇가지 옵션이 있습니다. 

-d : 컨테이너를 백그라운드에서 동작하게하는 옵션으로 추가하지 않으면 ctrl+c 등으로 빠져나오는 순간 종료됩니다.


-p : host와 컨테이너간 port를 바인딩 하는 것으로 앞에가 host port, 뒤에가 컨테이너 port입니다. 따라서 80:8080일 

경우 host에서 80으로 입력하면 자동으로 docker 8080으로 넘겨줍니다. 


--name : alias로 docker를 실행할 때 좀더 쉬운 가명을 주어 관리용으로 사용합니다. 

docker run -d -p 8080:8080 --name ayotest ayoteralab-docker-test:0.0.1

sudo docker ps로 해당 image가 정상적으로 동작하고 있는 것을 확인 할 수 있습니다. 자 그럼 wsl을 접고... windows의 chrome에 가서 localhost:8080을 입력해 봅니다. 아래와 같이 hello world!!가 뜬다면 아주 정상적으로 완성된 것 입니다.

마지막으로 해당 docker를 종료하도록 하겠습니다. 

sudo docker stop ayotest

이후 docker ps로 확인해보면 정상적으로 종료되었음을 확인할 수 있습니다. 이렇게 springboot project를 Maven으로 빌드하고 이를 docker image로 만들어서 실행까지 해보았습니다. 

 

- Ayotera Lab -

댓글