공부/Spring

Spring boot와 MySQL을 Docker 컨테이너로 올리기

2020. 8. 22. 22:42

Spring boot로 어플리케이션 개발하던 중 도커를 이용하여 동작시키면 어떨까 하여 진행하였고,

그 과정에 여러 가지 일들을 기록하고 공유하고자 한다.

 

먼저 어플리케이션은 spring boot로 되어있고 데이터베이스는 mysql을 사용한다.

mysql과 spring boot를 도커 컨테이너로 각각 올려야 한다.

이 과정에서 docker compose라는 것을 사용하여 같이 동작시키고 한 네트워크 안에서 만들 수 있으나,

데이터베이스와 어플리케이션을 분리하여 관리하고 싶어서 docker composer를 사용하지 않았다.

각각의 docker 컨테이너를 실행시킬 때 문제는 컨테이너 간 네트워크가 연결되어야 한다는 것이다.

도커 네트워크에 대해서는 아래 블로그에 자세하게 나와 있어 확인이 가능하다.

jungwoon.github.io/docker/2019/01/13/Docker-4.html

 

Docker 정리 #4 (도커 네트워크) | Jungwoon Blog

최근에 쿠버네티스를 공부할 일이 있어서 보고 있는데, 쿠버네티스 자체가 도커(Docker) 오케스트레이션을 해주는 툴이라 도커에 대한 개념이 없으니, 공부하기가 힘들었습니다. 그래서 이렇게

jungwoon.github.io

 

사용하기로 한 방법은

어플리케이션과 데이터베이스를 각각의 컨테이너로 띄우고,

(단 데이터베이스 컨테이너를 먼저 실행 후 어플리케이션 컨테이너를 실행시킨다.)

link를 이용하여 데이터베이스 컨테이너를 어플리케이션 컨테이너에서 연결하는 것이다.

그 과정에서 아래 블로그가 많은 도움이 되었다.

https://bluese05.tistory.com/54

 

Docker Network 구조(4) - container link 구조

Docker Network 구조 (4) - Container link 구조 [Contents] 1. Docker Network 구조(1) - docker0와 container network 구조 2. Docker Network 구조(2) - Container network 방식 4가지 3. Docker Network..

bluese05.tistory.com

 

 

실습

가장 먼저 해줘야 할 것은 mysql 컨테이너를 실행시키는 것이다.

실행 문은 아래와 같다. 컨테이너의 이름은 mysql-db으로 명시해 두었다.

docker run --name mysql-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pass123 -d mysql

 

그다음 어플리케이션의 속성 파일 application.properties이다.

 

datasource.url을 보면 ip가 아니라 mysql-db라고 되어있는데 이 값이 바로 link의 이름이고,

oauth2server가 database 이름이다.

이렇게 설정해 두고 어플리케이션을 빌드하고 도커 이미지를 빌드하고 도커 컨테이너를 실행시킨다.

(gradle build시 application.properties의 url 때문에 테스트에서 오류가 날 수 있다.)

아래 실행문을 보면 컨테이너 실행 시 mysql-db라는 컨테이너를 링크로 연결한 것을 확인할 수 있다.

# gradle build
gradlew build
# 이미지 빌드
docker build --build-arg JAR_FILE=build/libs/*.jar -t byeongukchoi/oauth2-server .
# 컨테이너 실행
docker run -d --name oauth2-server-container -p 8080:8080 --link mysql-db byeongukchoi/oauth2-server

이렇게 실행되면 어플리케이션 컨테이너의 /etc/hosts 파일에는 mysql-db가 mysql컨테이너로 연결되어있고,

mysql 컨테이너가 재시작되어 ip가 달라지더라도 hosts 파일이 동적으로 변하여 연결이 가능하도록 되어있다.

 

마무리

이렇게 하여 정상적으로 웹 어플리케이션과 데이터베이스를 잘 작동시켰다.

네트워크 설정, build.gradle 파일에서 도커 실행, application.properties파일의 환경 분리(로컬, docker), k8s 등 하나하나 더 알아가도록 하자.

 

 

 

 

반응형