- 스프링 부트 프로젝트 도커화 시키기
- 간단한
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
내에서 터미널을 띄워서 진행
- 이번 경우에는 기존에 사용하던
- 윈도우를 사용함으로 시스템 환경설정에서 환경변수 셋팅후
- ./gradlew명령어를 사용하여 프로젝트를
- 자바 버전 셋팅 후 gradlew 명령어 실행
- 프로젝트 루트에서 ./gradlew clean build 실행 후
build/libs
폴더 안에jar
생성 확인
- 프로젝트 루트에서 ./gradlew clean build 실행 후
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}
- 그런데 ./gradlew build 를 하면
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 run -d -p 9000:9000 spring-docker:v1 --server.port=9000
- 이미지에서 컨테이너를 생성할때
detached
모드로 실행하고 포트를9000
번 포트로 설정한다
- 이미지에서 컨테이너를 생성할때
- 실행 후 로그를 출력 확인
여러 프로젝트 띄워보기
docker stop $(docker stop -qa)
: 명령어로 모든 컨테이너 종료 후 새로운 컨테이너 셋팅- spring1, spring2 컨테이너를 각각 다른 포트로 설정하여 띄워볼 예정
- spring1 : server.port=8081
- spring2 : server.port=8082
- 각각 다른 화면에 띄워 놓고 각
port
에서 잘 동작 하는지 확인.
- spring1, spring2 컨테이너를 각각 다른 포트로 설정하여 띄워볼 예정
- 더 알아볼것
- 프로젝트 기능이 복잡해졌을때에는 어떤식으로 동작할지
volume
을 사용해 어떤식으로 영속성 데이터를 얻을것인지, 로그 관리는 어떤 식으로 하는지