Java

[Java/자바] 자바 프로젝트와 mysql을 docker-compose로 묶어보자

F12:) 2023. 8. 30. 11:36

안녕하세요! 오늘은 제가 진행 중인 자바 프로젝트를 도커 이미지화 시킨 후에, docker compose로 묶어서 한번에 관리하는 과정을 기록해보려고 합니다. 모든 네이밍과 설정들이 제 프로젝트에 맞춰져있을 수 있지만, 참고만 한다고 생각하고 봐주시면 감사하겠습니다.

 


우선, 프로젝트를 도커 이미지화하기 위해서는 Dockerfile이 필요합니다.

(Dockerfile 작성에 대한 간단한 글은 아래를 참고해주세요.)

2023.08.24 - [Python] - [파이썬/Python] 도커 이미지를 생성하고 배포해보자

 

 

Dockerfile의 가장 하단에 CMD나 ENTRYPOINT로 자바 파일을 실행하게 됩니다. 이 과정에서 우리는 .jar 파일이 필요하게 됩니다. 따라서 .jar를 먼저 만들어줍시다.

 

gradle의 jar를 실행하면 되는 줄 알았지만, plain.jar가 생성됩니다. 이 부분은 아래의 글에서 다룹니다.

2023.08.30 - [Error Record] - no main manifest attribute, in *.jar

 

 

이제 jar파일을 만들었으니, Dockerfile을 작성해봅시다.

# Base image
FROM openjdk:11

#WORKDIR /app

# Copy JAR file to container
COPY build/libs/seeandyougo-0.0.1-SNAPSHOT.jar seeandyougo-0.0.1-SNAPSHOT.jar

EXPOSE 8080

# Entry point for running the application
CMD ["java", "-jar", "seeandyougo-0.0.1-SNAPSHOT.jar"]

 

자바 버전은 11을 사용하고 있으므로, jdk11 이미지를 사용합니다. 포트번호 80880으로 사용할 예정입니다.

 

 

이제 이 도커파일을 만들었으니, 도커 컴포즈에서 mysql 이미지를 불러와 이 둘을 연결하면 되겠네요!

 


우리가 이전에, 프로젝트에서 mysql을 사용하고 있지 않았다면, 아쉽게도 .jar파일을 다시 만들어야합니다.. 왜냐하면 이제 application.yml를 변경해야하기 때문이죠. (사실 .jar를 만들기 전에 해도 되는데 어쩌다 보니...ㅎ)

 

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql_db:3306/mysql_db?useSSL=false&allowPublicKeyRetrieval=true
    # 여기서 mysql_db 부분이 내 db의 이름이 됩니다.
    username: 유저이름 입력
    password: 비밀번호 입력

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

logging.level:
  org.hibernate.SQL: debug
  org.hibernate.type: trace

저는 기존에 h2를 이용했었습니다. 그렇지만 서버 배포 시에는 mysql을 사용하기 때문에, 이것저것 수정을 좀 해주었습니다.

내 프로젝트가 mysql db에 접속하는 username과 password도 작성해줍시다.

 

jpa 부분에서는 dialect 부분이 중요했던 것 같습니다. (이거 안넣어서 mysql 연결이 안돼 꽤나 애먹었었거든요..)

 

 

아! 또한 datasource 의 url에서 useSSL이랑 allowPublicKeyRetrieval 파라미터는 꼭!! 넣어서 진행해줍시다. 안그러면 여기서 막히는 부분도 있었어요

 

이렇게 application.yml를 작성했으면, 이제 다시 jar 파일을 만들어줍시다!!

 

또한 Dockerfile을 이미지화해서 docker run을 통해 잘 실행되는지까지 확인을 마친다면, 반절은 왔습니다.


이제 docker-compose.yml을 작성해보겠습니다. 여기서 mysql은 이미 있는 이미지를 불러와 사용할 것입니다. 우선 작성한 docker-compose.yml을 확인해보겠습니다.

version: "3.8"

networks:
  db-net:
    driver: bridge

services:
  mysql:
    container_name: mysql_db
    image: mysql:latest
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: mysql_db
      MYSQL_ROOT_PASSWORD: root비밀번호 입력
      MYSQL_USER: application.yml에 작성했던 user 입력
      MYSQL_PASSWORD: application.yml에 작성했던 password 입력
      TZ: 'Asia/Seoul'
    ports:
      - "3306:3306"
    command:
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --range_optimizer_max_mem_size=16777216
    networks:
      - db-net
  seeandyougo:
    container_name: seeandyougo
    build: . # Dockerfile과 Docker compose가 같은 위치에 있으므로, 
             # Dockercompose 기준 현재 디렉토리에서 Dockerfile을 찾는다.
    restart: on-failure
    ports:
      - 8080:8080
    networks:
      - db-net
    depends_on:
      - mysql
    environment:
      - TZ=Asia/Seoul

 

 

주석으로 어느정도는 설명했으니, 자세한 설명은 생략합니다.

 

다만 이렇게 하고 docker compose up을 했을 때, 접근 거부 오류가 뜬다면, 아래 글을 참고해주세요.

 

2023.08.30 - [Error Record] - java.sql.SQLException: Access denied for user

 

 

 

 

 

그럼 이제 mysql과 연결이 가능합니다!