[Springboot + MySQL + Docker] Volume (볼륨 마운트)

Kim Dae Hyun·2021년 8월 21일
1

Docker

목록 보기
7/7

springbootMySQL을 도커 컨테이너 환경에서 구동까지는 성공했습니다. 근데 컨테이너가 내려가는 순간 DB의 데이터가 모두 초기화 되어 버립니다.

컨테이너 구동 중에 DB에 쌓이는 데이터는 컨테이너 내부에 쌓일 뿐 로컬 파일시스템은 모르는 일 입니다.

mysql이 구동되는 컨테이너의 데이터를 로컬 파일시스템과 연결해주어야 합니다.

docker는 이러한 문제를 해결하기 위해 여러 기능을 제공하지만 찾아본 결과 volume을 가장 많이 쓰고 권장하는 것 같아 volume을 사용해보겠습니다.


Docker-compose.yml 작성

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.ymlJPA 옵션인 ddl-autocreate에서 update 혹은 none으로 해주세요.

그리고 변경된 사항을 적용하기 위해 다시 프로젝트를 패키징합니다.
mvn clean package -DskipTests

이제 이미지 재빌드와 함께 컨테이너를 구동합니다.
docker-compose up --build


감사합니다 ㅎ

profile
좀 더 천천히 까먹기 위해 기록합니다. 🧐

0개의 댓글