Docker로 SpringBoot Mysql 프로젝트 실행

사전

먼저 스프링부트 프로젝트를 jar 파일로 export 해보았습니다.

./gradlew build

플러그인 관련 오류가 계속 발생합니다.

build.gradle 파일에 들어가는

빌드스크립트 {
내선 {
springBootVersion = ‘3.0.5’
}
저장소 {
메이븐센트럴()
}
종속성 {
클래스 경로(“org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion})
}
}

추가해서 해결했습니다. springBootVersion은

ID ‘org.springframework.boot’ 버전 ‘3.0.5’

이 부분과 같은 버전으로 설정하시면 해결됩니다!!

그리고 스프링부트에서

./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로 이동하여 다음 파일을 만듭니다.

도커파일

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은 빌드를 통해 생성된 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보다 먼저 실행되어 오류가 발생할 수 있습니다.

이 문제를 방지하려면 재시작 속성을 항상으로 설정하십시오.

depends on을 사용하더라도 순서를 명확하게 보장할 수 없습니다(컨테이너 실행 순서만 보장할 뿐 초기화하지 않음).

항상 성공하려면 다시 시작 속성을 항상으로 지정해야 합니다.

또한 springboot는 Dockerfile을 사용하여 이미지 파일을 생성하므로 build 속성을 넣었습니다.

(이것은 “docker build -t containername”을 수행하는 것과 동일합니다.)

mysql은 이미지를 사용할 것이기 때문에 이미지 속성을 넣었습니다.

참고로 SpringBoot 프로젝트의 application.yaml 파일에서 DB 구성을 변경하지 않아도 괜찮습니다.

어쨌든 Docker Compose가 우선적으로 배포되기 때문입니다.

또한 참고할 사항입니다. 볼륨은 항상 절대 경로입니다. 상대 경로는 허용되지 않습니다. 이것 때문에 몇 번 엉망이되었습니다.

파일은 다음과 같이 배치됩니다. 참고로 settgins/my.cnf 경로에 구성 파일을 넣었습니다.


my.cnf 구성 파일의 내용은 다음과 같습니다.

설정/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 빌드를 통해 springboot 빌드 작업을 진행할 수 있습니다.

mysql은 docker 허브에서 가져온 것을 사용하므로 image:로 설정됩니다.

그리고

docker-compose up

함께 실행

이때 mysql은 다른 곳에서 실행되지 않아야 합니다. 예를 들어 위에서 실행한 로컬 mysql이 실행 중이면 에러가 난다..!

그리고 다음 실행

docker-compose down

-> 도커 중지, 도커 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 file.build.gradle과 쉽게 연결될 수 있도록 연습해 봅시다.

velog.io


명령 요약

./gradlew 클린 빌드

./gradlew 빌드

당신이 할 경우

프로젝트/빌드/libs 경로에 jar 파일이 생성됩니다.

해당 경로에 Dockerfile, docker-compose.yml, settings/my.cnf를 넣고 실행합니다.

도커 작성 빌드

-> 우선 mysql은 docker hub에서 이미지 자체를 pull로 pull을 하는데, api 서버는 Dockerfile로 빌드를 해주기 때문에 빌드를 합니다.

(“docker build -t container name”과 같은 배치 작업)

도커 구성

-> 실행

도커 작성

-> 도커 컨테이너를 중지하고 실행합니다.

mysql 연결

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

다음 기사에서는 이를 통해 EC2에 배포하는 방법을 다룰 것입니다.