[Docker] 도커로 띄운 MySQL를 스프링부트에서 사용하기
도커로 데이터베이스를 실행하고, 이를 스프링부트에서 사용할 수 있습니다. 그렇다면 왜 굳이 도커로 데이터베이스를 띄울까요?
다양한 이유가 존재하겠지만... 이유를 하나만 뽑자면 다음과 같습니다.
팀 구성원이 모두 동일한 환경에서 작업을 진행할 수 있다.
A라는 사람은 MySQL 5.7을 사용하고, B는 MySQL 8.0을 사용합니다. 서로가 다른 버전을 사용하기 때문에 호환성 문제가 발생할 수 있습니다. 특히나 배포에 있어서 예상치 못한 문제가 발생할 수 있습니다.
이러한 문제를 사전에 방지하고자 도커를 활용하여 개발 및 배포 환경에서 일관성, 호환성을 확보해야 합니다.
도커 컴포즈를 사용하여 MySQL를 띄어 스프링부트에서 사용해보도록 하겠습니다.
도커 컴포즈
도커 컴포즈란 여러 컨테이너를 손쉽게 관리할 수 있도록 해줍니다. 즉, 여러 개의 컨테이너를 사용해야 한다면 도커 컴포즈를 사용하여 실행하는 과정을 단순화할 수 있습니다.
docker-compose.yml
도커 컴포즈에 MySQL를 사용하기 위한 도커 컨테이너 정보를 작성합니다. 주석으로 설명이 되어 있기 때문에 이해하는 데 어려움이 없을 것이라 생각합니다.
version: '3.7' # Docker Compose의 버전
services: # Docker Compose를 통해 실행할 서비스(컨테이너) 정의
db: # 서비스의 이름
image: mysql:8.0 # 사용할 MySQL 버전 8.0 이미지
restart: always
container_name: mysql_container # 생성될 도커 컨테이너의 이름
environment: # MySQL 컨테이너에 필요한 환경 변수 설정
MYSQL_DATABASE: example # 생성할 데이터베이스의 이름
MYSQL_USER: hope # 생성할 사용자
MYSQL_PASSWORD: hope1234 # 사용자 비밀번호
MYSQL_ROOT_PASSWORD: 1234 # MySQL 루트 사용자의 비밀번호 설정
ports: # 호스트와 컨테이너 간의 포트 매핑
- "3307:3306" # 호스트의 포트 3307을 컨테이너의 포트 3306으로 매핑
volumes: # 호스트의 디렉토리를 컨테이너에 마운트
- mysql_data:/var/lib/mysql # mysql_data 볼륨을 컨테이너의 /var/lib/mysql에 마운트
volumes: # 도커 볼륨 정의
mysql_data: # MySQL 데이터베이스의 데이터를 저장할 볼륨
Volume이란 컨테이너의 데이터 저장과 관리에 중요한 역할을 합니다. 컨테이너가 종료되거나 삭제되어도 데이터를 지속적으로 보관할 수 있습니다.
docker volume ls를 입력하면 로컬 환경(호스트)에 저장된 볼륨을 조회할 수 있습니다. 위에서 도커 컴포즈를 작성할 때 volumes 부분에 mysql_data를 생성하였기 때문에 dokcer_mysql_data 볼륨이 조회됩니다.
~/desktop/study/study-spring main* ❯ docker volume ls 18:06:45
DRIVER VOLUME NAME
.. 생략
local docker_mysql_data
local e7db8f76e0d6a671f05a21d85b1a52eb8c68375a004b9551f23464211667b291
docker volume inspect docker_mysql_data를 통해 도커 볼륨에 대한 자세한 정보를 확인할 수 있습니다.
볼륨 생성 시간은 UTC를 따르기 때문에 한국 시간보다 9시간 느립니다.
docker-compose.yml이 존재하는 경로에서 docker-compose up -d를 입력하여 컨테이너가 백그라운드에서 실행되도록 합니다.
스프링부트에서 컨테이너 사용하기
실행 중인 MySQL에 접근하기 위하여 컨테이너로 띄운 정보를 입력하면 됩니다.
application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3307/example # 컨테이너로 띄운 DB 이름
username: root # 컨테이너로 띄운 데이터베이스 사용자 이름
password: 1234 # 컨테이너로 띄운 데이터베이스 비밀번호
jpa:
hibernate:
ddl-auto: update # application 실행 시 기존 테이블 drop 후 create
properties:
hibernate:
format_sql: true
docker exec -it mysql_container /bin/bash를 통해 실행 중인 도커 컨테이너의 내부로 진입합니다.
- docker exec : 실행 중인 도커 컨테이너에게 명령을 전달
- -it : 'i' + 't'를 통해 터미널과 상호작용
- mysql_container : 컨테이너 이름
- /bin/bash : 컨테이너 내부에 진입하여 Bash 쉘로 명령어 전달
도커 컴포즈에서 MySQL 컨테이너 정의를 내릴 때, 입력한 example 데이터베이스가 정상적으로 생성되었습니다.