[Docker] Springboot Docker build, docker run image

아무튼 간에·2022년 8월 8일
0

* 이 글은 [Docker] Springboot + RabbitMQ + Redis 연동 실습 과 이어집니다.

개발환경
OS: Windows 11
IDE: Spring Tool Suite 4.14.1
JAVA: 17

Notion으로 더 편하게 보기(클릭)


스프링부트로 작성된 API를 도커 이미지로 빌드하기 위해선

  1. 우선 gradle 빌드 후
  2. 생성된 jar를 가지고 도커 이미지를 만드는 build를 해야함.

최우선적으로 build.gradle 안에 도커 빌드 관련 구성도 함께 포함되어야 한다.

1. Springboot gradle build

1-1. 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])
}
  • pluginsid '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: 이미지 빌드 시 전달할 아규먼트

1-2. Dockerfile 파일 생성

  1. 프로젝트 최상위 경로에 Dockerfile 파일을 생성

  1. 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 등)’
      • JDK 버전이 맞지 않을 경우 아래와 같은 오류가 발생함
        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에 작성한 buildArgsfiles를 받음.
    • RUN: 실행할 명령어 (ex - mkdir tmp)
    • COPY: 실행할 jar를 컨테이너의 어디에 복사할건지
    • EXPOSE: 접속포트
    • ENTRYPOINT: 컨테이너 실행 시 항상 실행할 명령어

    * 참고: [docker] RUN vs CMD vs ENTRYPOINT

1-3. application.yml 수정

호스트에서 사용하는 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

1-4. gradle bulid

  1. build

    • 방법1 - Gradle Tasks View에서 더블클릭으로 간편 빌드
    • 방법2 - 프로젝트 우클릭>Run As>Run Configurations>Gradle Task>Tasks에 ‘build’ Add 후 Run

  1. 정상 빌드 확인

2. Springboot docker build

** 반드시 gradle 정상 빌드 후 진행

  1. Gradle Tasks에서 docker 더블클릭하여 간편 빌드함

  2. 정상 빌드 확인

3. docker run image(Docker Desktop)

  1. 이미지 run

    컨테이너명, 포트 지정

  2. Docker Desktop을 켜고 images 목록에서 생성된 이미지 확인

  3. 컨테이너 확인

    로컬에서 Springboot Application을 구동했을 때와 같은 로그가 찍힌다.

  4. API 테스트

profile
armton garnet

0개의 댓글