* 이 글은 [Docker] Springboot + RabbitMQ + Redis 연동 실습 과 이어집니다.
개발환경
OS: Windows 11
IDE: Spring Tool Suite 4.14.1
JAVA: 17
스프링부트로 작성된 API를 도커 이미지로 빌드하기 위해선
- 우선 gradle 빌드 후
- 생성된 jar를 가지고 도커 이미지를 만드는 build를 해야함.
최우선적으로 build.gradle 안에 도커 빌드 관련 구성도 함께 포함되어야 한다.
plugins {
id 'org.springframework.boot' version '2.7.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
**id 'com.palantir.docker' version '0.25.0'**
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-amqp'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.amqp:spring-rabbit-test'
}
tasks.named('test') {
useJUnitPlatform()
}
docker {
println("gradle docker-plugin start = apple:${version}")
name "apple:${version}"
files tasks.bootJar.outputs.files
tag 'DockerHub', "fruit/apple:${version}"
buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])
}
plugins
에 id 'com.palantir.docker' version '0.25.0'
추가docker
추가docker {
println("gradle docker-plugin start = apple:${version}")
name "apple:${version}"
files tasks.bootJar.outputs.files
tag 'DockerHub', "fruit/apple:${version}"
buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])
}
println
: 콘솔 출력 메시지name
: 도커 이미지이름files
: 이미지 빌드 시 포함할 파일들. 2개 이상 작성 시 (file1, 'temp.txt', 'temp2.txt') 식으로 나열tag
: 도커 이미지 태그buildArgs
: 이미지 빌드 시 전달할 아규먼트Dockerfile에 docker script 작성
FROM openjdk:17-alpine
ARG JAR_FILE=build/libs/apple-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} apple-0.0.1-SNAPSHOT.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/apple-0.0.1-SNAPSHOT.jar"]
위 소스가 가장 기본적인 명세
FROM
: 도커가 실행될 환경 (ex - openjdk 버전 or Ubuntu 등)’Exception in thread "main" java.lang.UnsupportedClassVersionError:
has been compiled by a more recent version of the Java Runtime (class file version 55.0),
this version of the Java Runtime only recognizes class file versions up to 52.0
ARG
: 아규먼트. 파일의 경우 gradle.build에 작성한 buildArgs
와 files
를 받음.RUN
: 실행할 명령어 (ex - mkdir tmp)COPY
: 실행할 jar를 컨테이너의 어디에 복사할건지EXPOSE
: 접속포트ENTRYPOINT
: 컨테이너 실행 시 항상 실행할 명령어호스트에서 사용하는 localhost와 docker 내에서 사용하는 localhost는 다르기 때문에 현재 내 실제 ip로 지정해주어야 함. localhost나 127.0.0.1로 지정할 경우 docker에서 실행하면 connection refused 오류발생함.
spring:
rabbitmq:
host: 192.168.**.** # rabbitMQ host (docker로 띄웠음)
port: 5672 # default port
username: guest # default username
password: guest # default password
redis:
lettuce:
pool:
max-active: 5 # pool에 할당될 수 있는 최대 커넥션 수(음수: 무제한)
max-idle: 5 # pool의 idle 최대 커넥션 수(음수: 무제한)
min-idle: 2 # pool에서 관리하는 idle 최소 커넥션 수
host: 192.168.**.**
port: 6379
# password: redisPass
config:
app:
duration: 10000
build
** 반드시 gradle 정상 빌드 후 진행
Gradle Tasks에서 docker 더블클릭하여 간편 빌드함
정상 빌드 확인
이미지 run
컨테이너명, 포트 지정
Docker Desktop을 켜고 images 목록에서 생성된 이미지 확인
컨테이너 확인
로컬에서 Springboot Application을 구동했을 때와 같은 로그가 찍힌다.
API 테스트