본문 바로가기
[SpringBoot]

SpringBoot Mysql프로젝트 Docker로 실행하기

by Hevton 2023. 4. 19.
반응형

 

사전

 

일단 스프링부트 프로젝트를 jar 파일로 내보내려고

./gradlew build

를 입력하는데 자꾸 플러그인 관련 오류가 발생했다.

 

 

그건 build.gradle 파일에 가서

buildscript {
ext {
springBootVersion = '3.0.5'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}

이렇게 추가해줌으로써 해결했다. springBootVersion은

id 'org.springframework.boot' version '3.0.5'

이 부분과 같은 버전으로 설정해주면 해결된다!!

 

 

그리고 SpringBoot에서

./gradlew build

 

를 이용해서 빌드를 할 때, 나중에 docker-compose를 이용해서 mysql 컨테이너를 따로 이용해서 접속할지라도,

빌드하여 jar 파일을 생성하기 위해서는 application.yaml 파일 내에 '현재 테스트 가능한 경로의 mysql'이 동작하고 있어야 한다.

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver

    # DB Source URL
    url: jdbc:mysql://127.0.0.1:3306/running?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
    # jdbc:mysql://<IP>:<Port/<DB>?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul

    #DB Username
    username: root

    #DB Password
    password: root

지금 로컬에서의 mysql을 이용하지 않을 것일지라도, 일단 빌드를 위해 테스트에서 문제가 없기 위해서는 mysql을 켜놓고 빌드해야한다!

 

 


 

 

./gradlew build

 

이제 SpringBoot 프로젝트를 jar 파일로 빌드했다면 /build/libs에 jar 파일이 생성될 것이다.

(참고로 빌드 후에 다시 빌드할거라면, clean을 선행해야하고, 이 때는 libs 파일 전체가 재생성되므로 내부에 파일이 존재하지 않게 조심)

./gradlew clean build

 

 

 

그리고 cd build/libs 로 이동한 뒤에 아래 파일들을 만들어준다.

 

Dockerfile

FROM openjdk:17-jdk-alpine
COPY running-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

내 SpringBoot 프로젝트의 jdk는 17이므로 이렇게 기본 이미지를 사용하고,

running-0.0.1-SNAPSHOT.jar 이 build를 통해 만든 jar 파일이다.

 

 

docker-compose.yml

version: '3'
services:
  mysql:
    image: mysql
    container_name: mysql-container
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=비밀번호
      - MYSQL_DATABASE=running
      - MYSQL_CHARSET=utf8mb4
      - MYSQL_COLLATION=utf8mb4_unicode_ci
    volumes:
      - 호스트에서 만든 my.cnf의 절대경로:/etc/mysql/my.cnf
    command:
      - "mysqld"
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"

  springboot:
    build: .
    container_name: my-api-container
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    restart:
      always
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/디비이름?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=Asia/Seoul
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=비밀번호

이렇게 설정해주면 된다. 잘 따라와야 한글이 깨지지 않는다..!

docker compose에서는 자연스럽게 같은 네트워크에 속하므로 네트워크 설정은 따로 진행하지 않아도 된다.

또한 docker-compose에서 depends_on 속성으로 컨테이너 실행 순서는 보장할 수 있을지라도 기타 내부 실행 작업의 초기화는 보장할 수 없으므로 때에 따라 springboot가 mysql보다 먼저 실행되어 에러가 발생할 수 있다.

restart 속성을 always로 두어서 이러한 문제가 발생하지 않도록 한다.

 

depends on을 사용하더라도 명확히 순서를 보장할 수 없기 때문에 (컨테이너 실행 순서만 보장할 뿐, 초기화는 안됨)

restart 속성을 always로 주어야 항상 성공할 수 있게 된다.

 

또한 springboot는 Dockerfile을 이용해서 build하여 이미지파일을 생성해줄 것이므로 build 속성을 넣었고

(이는 "docker build -t 컨테이너명 ." 하던 작업과 같다)

mysql은 이미지를 사용할 것이므로 image 속성을 넣었다.

 

 

참고로 SpringBoot 프로젝트 내의 application.yaml 파일에 있는 DB 설정 변경은 진행하지 않아도 괜찮다.

어차피 Docker compose가 우선순위로 배치되기 때문이다.

 

또한 주의할점. volumnes는 항상 절대경로다. 상대경로가 안된다. 이거 때문에 몇 번 애먹음.

 

 

이렇게 파일들이 배치된다. 참고로 settgins/my.cnf 경로에 설정파일을 넣어놨다.

 

 

my.cnf 설정파일의 내용은 다음과 같다

 

settings/my.cnf

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake = FALSE
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

 

이제 명령어를 입력해준다.

docker-compose build

docker-compose build로 springboot에 대한 build 작업을 진행해줄 수 있다.

mysql은 docker hub에서 가져온거 그대로 쓸거니까 image: 로 설정했던 것이다.

 

그리고

docker-compose up

으로 실행한다.

 

이 때, mysql 이 다른 곳에서 또 실행중이면 안된다. 예를 들어 아까 위에서 실행한 로컬 mysql 이 실행중이면 오류 발생한다..!

 

 

그리고 다음 실행부턴

docker-compose down

-> docker stop, docker rm 까지 해준다.

 

docker-compose up

이런 순서로 해주면 된다.

 

참고로 데몬(백그라운드)으로 실행하고 싶으면 실행할 때 -d 옵션을 넣어주면 된다.

 

 

 

 

https://velog.io/@mooh2jj/docker-compose%EB%A1%9C-SprongBoot-JPA-MySql-DB-%EC%84%9C%EB%B2%84%EB%A7%8C%EB%93%A4%EA%B8%B0

 

docker-compose로 SpringBoot + MySql DB 서버 구동

UserEntity를 가지고 CURD를 하는 SpringBoot RESTAPI 프로젝트를 만들어보았습니다. 이 프로젝트를 MySql DB와 연동을 해야 하는데 docker-compose.yml 파일로 쉽게 연동할 수 있음을 실습해보겠습니다.build.gradle

velog.io

 

 

 

 


명령어 정리

 

./gradlew clean build

./gradlew build 

하게 되면

프로젝트/build/libs 경로에 jar 파일이 생성될 것이다.

그 경로에 Dockerfile, docker-compose.yml, settings/my.cnf 를 두고 실행하면 된다.

 

docker-compose build

-> 일단 mysql은 docker hub에서 pull로 image 자체를 당겨오지만, api server는 Dockerfile로 빌드를 할 것이므로 빌드 해준다.

("docker build -t 컨테이너명 ." 같은 작업을 일괄로)

 

docker-compose up

-> 실행

 

docker-compose down

-> docker container를 stop과 rm 까지 해준다.

 

mysql 접속

docker exec -it mysql컨테이너명 mysql -uroot -p

 

 

다음 글에선 이를 통해 EC2에 배포하는 법을 다룬다.

반응형