본문 바로가기

[스프링, 도커] 도커로 스프링 배포하기

ironwhale 2022. 11. 23.

스프링으로 간단한 서비스를 구현하고 나서 서버에 배포하여 언제든지 내가 만든 서비스를 이용하고 싶었습니다. 그래서 도커를 이용하는 배포하는 방법을 소개해보고자 합니다. 


순서

1. 도커 파일만들기

2. 도커 파일로 이미지 만들기

3. 만든 이미지로 컨테이너 만들기(마운트 포함)

4. 스프링 빌드 파일 업로드 하기


1. 도커 파일 만들기 

도커 파일 만들기는 쉽습니다. 간단히 메모장에 확장자 없이 Dockerfile이라는 이름으로 하셔도 되고 다른 이름을 사용하셔도 경로 설정만 해주시면 사용할 수 있습니다. 하지만 보통은 Dockerfile이라고 만듭니다.

도커 파일 내용

  • 첫번째는 이 이미지의 베이스가 되는 이미지를 의미합니다. 
  • 두번째는 폴더위치를 바꾸는 명령어라는데 저는 그냥 기본 폴더, 시작하는 폴더라고 이해하였습니다. 
  • 세번째는 컨테이너가 실행되면 자동으로 실행되는 명령어 인데 java -jar app.jar을 의미합니다. 저는 빌드 파일의 이름을 app.jar로 하려고 해서 app.jar을 마지막에 기입하였습니다. 
FROM openjdk:11-jdk

WORKDIR /code

ENTRYPOINT ["java","-jar","app.jar"]

2. 도커 파일로 이미지 만들기

도커가 설치되어있는 환경에서 도커파일로 이미지를 만들기 위해서는 도커 파일이 있는 위치에서 

docker build -t <만들 이미지의 이름:태그명> . 을 입력하시면 이미지를 만듭니다.

이 명령어가 정상 작동하기 위해서는 도커파일이 있는 위치에 있어야 하며 도커파일의 이름이 Dockerfile이어야합니다. 그리고 제일 중요한 맨뒤에 . 을 입력해야 합니다.  저는점을 빼먹어서 왜 안되지 하면서 괜한 시간만 잡아먹었습니다. 

 

만약 도커파일의 이름을 Dockerfile외에 다른 이름으로 하셨으면 -f <도커파일 이름> 옵션을 사용하시면 됩니다. docker build -t <만들 이미지의 이름:태그명> -f <도커파일이름> 이렇게 말이죠


3. 이미지를 이용해서 컨테이너 만들기 

컨테이너를 만드는 명령어는 docker run 입니다. 

docker run -d --name <컨테이너명> -p <외부포트>:<내부포트> -v ~/code/app:/code <이미지명:태그명>

 

-d는 백그라운드에서 컨테이너가 돌아가는 옵션입니다. 

--name은 컨테이너 이름을 지정하는 옵션입니다. 

 

-p 은 포트 설정입니다.  외부포트: 내부포트 이렇게 설정하며 스프링에 경우에는 내부포트을 8080으로 하시면되고 외부는 원하는 시는 포트 번호를 이용하시면 됩니다. 그럼 ip주소:외부포트와 같이 도커 내부에서 돌아가는 스프링 서버에 접근할 수 있습니다. 

 

-v는 컨테이너 외부 저장공간을 내부에 마운트하는 옵션으로 로컬 저장공간의  ~/code/app의 app 폴더 안에 파일을 컨테이너 안에 code 폴더 안에 마운트, 위치 시킨다고 보시면 됩니다. 즉, 컨테이너에 들어가지 않고도 로컬 저장소의 app 폴더에 파일을 변경하면 되는 것입니다. 그래서 스프링을 빌드한 jar파일을 로컬 저장소의 app 폴더 안에 위치시키면 됩니다. 그리거 컨테이너의 기본 폴더를 code로 했기 때문에 컨테이너 내부의 폴더는 그냥 코드로 하시면 됩니다. 


4. 스프링 빌드 파일 업로드

아마 로컬 저장소에 app 폴더에 스프링 빌드 파일을 업로드 했으면 위에 명령어를 통해 컨테이너를 생성하고 실행하면 바로 스프링 서버가 실행 되었을 겁니다. 하지만 빌드 파일을 업로드 하지 않으셨으면 컨테이너가 오류를 일으키면서 바로 꺼졌을 것입니다. 

ENTRYPOINT ["java","-jar","app.jar"] 이 명령어를 실행해야 되는데 app.jar파일이 없기 때문이죠 컨테이너에 마운트한 로컬 저장소 경로인 ~/code/app 폴더 안에 app.jar 파일을 업로드 하시고

docker start <컨테이너명>을 입력하시어 컨테이너를 시작하시면 정상적으로 스프링 서버가 동작할 것입니다. 

 

 

댓글