Dockerizing a Spring Boot = Spring Boot + Docker

Danny·2023년 11월 9일

ASAC

목록 보기
6/8

프로젝트 설정

프로젝트 생성과 적용은 제외

스냅샷 생성


bootJar

  • build.gradle에서 bootJar 설정을 추가할 수 있다.
    mainClass을 지정해서 시작 포인트를 지정하거나, archieveName 등을 지정해서 jar 파일 이름을 지정할 수도 있다.

libs / demo*.jar 파일 생성 <- 이게 스냅샷

Dockerfile

FROM openjdk:17
ARG JAR_FILE=build/libs/spring-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} docker-springboot.jar
ENTRYPOINT ["java","Djava.security.egd=file:/dev/./urandom","-jar","/docker-springboot.jar"]
  • FROM openjdk:17 : jdk 이미지 openjdk:17 적용

  • ARG JAR_FILE=build/libs/spring-0.0.1-SNAPSHOT.jar

    • build/libs 폴더 안에 있는 프로젝트 스냅샷
  • ADD ${JAR_FILE} docker-springboot.jar

    • 도커 이미지로 사용할 이름 생성 .jar의 이름은 docker-0.0.1-SNAPSHOT.jar이지만 도커에서는 docker-springboot로 출력
  • ENTRYPOINT ["java","Djava.security.egd=file:/dev/./urandom","-jar","/docker-springboot.jar"]

    • 컨테이너 실행 시 반드시 실행될 명령어를 입력합니다.
      []로 여러 명령어를 지정할 수 있습니다.
    • 기본적으로 자바는 빌드된 .jar를 실행할 때 java -jar <빌드 파일명>으로 실행하기 때문에 java, /docker-springboot.jar는 필수로 입력되므로 추가했습니다.
    • -Djava.security.egd=file:/dev/./urandom 옵션의 경우 세션 ID를 생성할 때 필요한 난수 파일을 미리 적용시켜 톰캣의 실행 속도를 빠르게 하고자 추가한 옵션입니다.

docker-compose.yml

version: '3'
services:
  mysql:
    image: mysql:latest
    container_name: lennnnon
    environment:
      - MYSQL_ROOT_PASSWORD=#password
      - MYSQL_DATABASE=asac
    ports:
      - "3307:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - springboot-mysql-net

  backend:
    image: docker-springboot
    build: .
    ports:
      - "8081:8080"
    depends_on:
      - mysql
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/user?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=Asia/Seoul
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=#password
    networks:
      springboot-mysql-net:

networks:
  springboot-mysql-net:

volumes:
  mysql_data:

docker run

docker build -t (이미지 이름) .

docker-compose up -d

주의사항

로컬 작업

application.yml or application.properties

  datasource:
    url: jdbc:mysql://mysql:3306/user?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=Asia/Seoul
    username: root
    password: #password
    driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8버전
    # driver-class-name: com.mysql.jdbc.Driver # mysql 5버전

위 내용과 같이 url 중 mysql과 주소를 같게 설정해야한다.
아니면 도커에서 인식을 못한다.

도커작업

version: '3'
services:
  mysql:
    image: mysql:latest
    container_name: lennnnon
    environment:
      - MYSQL_ROOT_PASSWORD=#password
      - MYSQL_DATABASE=asac
    ports:
      - "3307:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - springboot-mysql-net

  backend:
    image: docker-springboot
    build: .
    ports:
      - "8081:8080"
    depends_on:
      - mysql
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/user?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=Asia/Seoul
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=#password
    networks:
      springboot-mysql-net:

networks:
  springboot-mysql-net:

volumes:
  mysql_data:
  • 스프링부트 이미지를 참고하여 작성할때
    mysql의 포트번호와 연결해야한다.
  • ex : (외부접속포트):(내장포트)
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/user?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=Asia/Seoul
mysql:
    image: mysql:latest
    container_name: lennnnon
    environment:
      - MYSQL_ROOT_PASSWORD=#password
      - MYSQL_DATABASE=asac
    ports:
      - "3307:3306"
 - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306

공식문서
https://spring.io/guides/topicals/spring-boot-docker/

https://github.com/ddongbu/ASAC-Multi-Container

https://www.notion.so/softsquared/0a81bda4fdbd4bc9bf76231f650deb1f?pvs=4

0개의 댓글