1. 도커 네트워크 설정

컨테이너끼리 통신을 원활히 하려면 네트워크를 생성해야 한다.

docker network create <네트워크 이름>

 

2. MySQL 설정

Dockerfile

# MySQL 8.0 버전을 베이스 이미지로 사용
FROM mysql:8.0.32

# MySQL 설정 파일을 복사
COPY ./my.cnf /etc/mysql/conf.d/my.cnf

# init.sql 파일을 /docker-entrypoint-initdb.d/로 복사
COPY ./init.sql /docker-entrypoint-initdb.d/

# 계정 정보 설정
ENV MYSQL_ROOT_PASSWORD=<루트 비밀번호 계정>
ENV MYSQL_DATABASE=<데이터베이스 이름>
ENV MYSQL_USER=<데이터베이스 유저>
ENV MYSQL_PASSWORD=<패스워드>

# MySQL 기본 포트 3306 노출
EXPOSE 3306

init.sql은 서비스가 실행되기 위한 SQL 파일을 의미한다.

이 파일을 /docker-entrypoint-initdb.d/ 로 복사하면 MySQL 컨테이너가 실행될 때 init.sql 파일이 자동으로 실행된다.

즉, 서비스가 실행되기 위한 테이블 정의나 데이터 삽입 등을 init.sql 파일에 적어놓고 컨테이너가 실행될 때 자동으로 되게 하는 것이다.

 

my.cnf

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

[client]
default-character-set=utf8mb4

DB 컨테이너에서 한글이 깨지는 것을 방지하기 위한 설정파일이다.

 

이제 도커 이미지를 빌드하면 된다.

 

도커파일이 있는 경로로 이동 후에 아래의 명령어로 이미지를 빌드한다.

docker build -t <MySQL 이미지 이름> .

여기서 지정한 컨테이너 이름은 아무렇게나 지어도 상관 없다.

 

이후 이미지에 태그를 붙히고 자신의 이미지 레지스트리에 푸시한다.

docker tag <MySQL 이미지 이름> <도커 레지스트리 계정명>/myapp-db
docker push <도커 레지스트리 계정명>/myapp-db

 

이후 실행할 때는 아래의 명령어를 입력한다.

docker run -d -p 3306:3306 --name <MySQL 이미지 이름> --network <네트워크 이름> <MySQL 이미지 이름>

 

 

3. 스프링부트 설정

Dockerfile

# 베이스 이미지로 OpenJDK 17 사용
FROM openjdk:17-jdk

# 애플리케이션을 위한 작업 디렉토리 설정
WORKDIR /spring-boot

# 빌드된 JAR 파일을 컨테이너로 복사
COPY build/libs/*SNAPSHOT.jar app.jar

# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/spring-boot/app.jar"]

 

application.properties

spring.datasource.url=jdbc:mysql://<MySQL 이미지 이름>:3306/<데이터베이스 이름>
spring.datasource.username=<데이터베이스 유저>
spring.datasource.password=<패스워드>
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

<MySQL 이미지 이름> 은 이전에 MySQL을 컨테이너로 만들었을 때의 이름을 넣어주면 된다.

 

이제 도커 이미지를 빌드하면 된다.

 

스프링 부트 프로젝트를 빌드한다.

./gradlew clean build

 

스프링 부트의 도커 파일로 이동하고, 도커 이미지를 빌드한다.

docker build --platform linux/amd64 -t <스프링부트 이미지 이름> .

 

태그를 지정하고 이미지 레지스트리에 푸시한다.

docker tag <스프링부트 이미지 이름> leesw0924/<스프링부트 이미지 이름>
docker push <도커 레지스트리 계정명>/<스프링부트 이미지 이름>

 

 

이후 아래의 명령으로 실행하면 된다.

단, MySQL 이미지가 실행되어 있어야 한다.

docker run -d -p 80:8080 --name <스프링부트 이미지 이름> --network <네트워크 이름> <스프링부트 이미지 이름>