springboot
와 MySQL
을 도커 컨테이너 환경에서 구동까지는 성공했습니다. 근데 컨테이너가 내려가는 순간 DB의 데이터가 모두 초기화 되어 버립니다.
컨테이너 구동 중에 DB에 쌓이는 데이터는 컨테이너 내부에 쌓일 뿐 로컬 파일시스템은 모르는 일 입니다.
mysql
이 구동되는 컨테이너의 데이터를 로컬 파일시스템과 연결해주어야 합니다.
docker
는 이러한 문제를 해결하기 위해 여러 기능을 제공하지만 찾아본 결과 volume
을 가장 많이 쓰고 권장하는 것 같아 volume
을 사용해보겠습니다.
version: "3.7"
services:
db-mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: user
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
ports:
- 3306:3306
volumes:
- ./db:/var/lib/mysql
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
networks:
- springboot-mysql-net
test-app:
build:
context: ./
dockerfile: Dockerfile
ports:
- 8080:8080
depends_on:
- db-mysql
networks:
- springboot-mysql-net
networks:
springboot-mysql-net:
driver: bridge
db-mysql
부분의 volumes
만 추가로 설정합니다.
:
를 기준으로 앞쪽이 로컬 파일시스템의 경로이고 뒤쪽이 컨테이너 내부의 경로입니다.
설정해준 컨테이너의 경로를 지정한 로컬 경로로 마운트 시키는 것 입니다.
docker-compose up
으로 실행하면 프로젝트의 루트경로에 db
폴더가 생길 것 입니다.
아직 도커에 대한 이해가 부족해서 볼륨을 추가하고도 영속화가 되지 않는 현상을 겪었습니다.
혹시 같은 현상을 겪는 분이 있을까봐 적용방법도 함께 써볼께요.
일단 테스트를 위해 application.yml
의 JPA
옵션인 ddl-auto
는 create
에서 update
혹은 none
으로 해주세요.
그리고 변경된 사항을 적용하기 위해 다시 프로젝트를 패키징합니다.
mvn clean package -DskipTests
이제 이미지 재빌드와 함께 컨테이너를 구동합니다.
docker-compose up --build
감사합니다 ㅎ