Home Spring Boot, Dockerfile
Post
Cancel

Spring Boot, Dockerfile

  • 스프링 부트 프로젝트 도커화 시키기
    • 간단한 log 메세지를 출력하는 스프링부트 프로젝트 생성
    • gradlew 기능 사용하여 프로젝트 jar로 묶기
    • Dockerfile 작성 및 테스트
    • 다양한 환경 변수를 설정할 수 있게 Dockerfile 수정


프로젝트 설정

  • 간단한 로그 출력 프로젝트 구성
    • 자바 버전 : java17
    • 빌드 도구 : groovy-gradle
    • 운영체제 : WINDOW10
  • build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.3'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = JavaVersion.VERSION_17
	targetCompatibility = JavaVersion.VERSION_17
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

  • HelloController
1
2
3
4
5
6
7
8
9
10
@Slf4j
@RestController
public class HelloController {
  @GetMapping
  public ResponseEntity<String> helloDocker() {
    log.info("hello docker!!!");
    return new ResponseEntity<>("hello! docker!", HttpStatus.OK);
  }
}
  • 프로젝트 jar로 묶기
    • ./gradlew명령어를 사용하여 프로젝트를 jar파일로 내보내야 하는데 해당 과정에서 자바 버전이랑 gradle 버전이 안맞으면 빌드가 안됨
      • 윈도우를 사용함으로 시스템 환경설정에서 환경변수 셋팅후 java -version해서 나오는 버전이 gradle 버전과 맞게 성정
        • 이번 경우에는 기존에 사용하던 jdk가 예상외로 작동해서 oracle jdk를 직접 받아서 환경변수 설정 후 intellij를 관리자 모드로 실행, IDE내에서 터미널을 띄워서 진행

java_version

  • 자바 버전 셋팅 후 gradlew 명령어 실행
    • 프로젝트 루트에서 ./gradlew clean build 실행 후 build/libs 폴더 안에 jar 생성 확인

jar_check

  • jar파일이 확인 되었다면 Dockerfile 작성


Dockerfile

  • FROM : 자바17을 사용함으로 17버전을 땡겨옴.
  • VOLUME : 도커 컨테이너 내에서 생성된 데이터를 영속화 시킬 수 있게 해주는 Docker기능.
    • 나중에 더 자세히 알아볼 예정
  • COPY : 이미지화 시킬 jar 파일을 app.jar로 카피한다
    • 그런데 ./gradlew build 를 하면 jar파일이 2개가 생긴다
      • SNAPSHOT.jar : 실행 가능한 jar
      • SNAPSHOT-plain.jar : 읽기 전용 jar
      • 도커가 알아서 실행 가능한 jar를 묶어주는거 같긴하지만 build.gradle에서 읽기 전용 jar 생성 옵션을 설정할 수 있다
        • jar {enabled = false}
  • ENTRYPOINT : 컨테이너로 올릴때에 어플리케이션이 실행될 포트 번호를 설정해주는 옵션을 추가하기 위한 설정이 더해진 옵션
    • 참고 : https://spring.io/guides/topicals/spring-boot-docker
1
2
3
4
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
COPY build/libs/*.jar app.jar
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar ${0} ${@}"]


docker build

  • docker build -t spring-docker:v1 . 으로 빌드 후 이미지 확인

docker_build


이미지 컨테이너화 시키기

  • docker run -d -p 9000:9000 spring-docker:v1 --server.port=9000
    • 이미지에서 컨테이너를 생성할때 detached 모드로 실행하고 포트를 9000번 포트로 설정한다
  • 실행 후 로그를 출력 확인

image


여러 프로젝트 띄워보기

  • docker stop $(docker stop -qa) : 명령어로 모든 컨테이너 종료 후 새로운 컨테이너 셋팅
    • spring1, spring2 컨테이너를 각각 다른 포트로 설정하여 띄워볼 예정
      • spring1 : server.port=8081
      • spring2 : server.port=8082
    • 각각 다른 화면에 띄워 놓고 각 port에서 잘 동작 하는지 확인.

test1

test2

  • 더 알아볼것
    • 프로젝트 기능이 복잡해졌을때에는 어떤식으로 동작할지
    • volume을 사용해 어떤식으로 영속성 데이터를 얻을것인지, 로그 관리는 어떤 식으로 하는지
This post is licensed under CC BY 4.0 by the author.