안녕하세요! 오늘은 제가 진행 중인 자바 프로젝트를 도커 이미지화 시킨 후에, 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과 연결이 가능합니다!
'Java' 카테고리의 다른 글
[이펙티브 자바] 적시에 방어적 복사본을 만들라 (Item. 50) (0) | 2024.03.21 |
---|---|
[이펙티브 자바] 매개변수가 유효한지 검사하라. (Item 49) (0) | 2024.02.27 |
[Java/자바] 싱글톤 패턴? 싱글톤 컨테이너? 그게 뭔데!! (0) | 2023.07.30 |
[Java/자바] 문자열을 "+"로 split 해보자(BOJ 1541 잃어버린 괄호) (0) | 2023.07.26 |
[자바/Java] 추상 클래스(Abstract Class) (0) | 2023.07.10 |