본문 바로가기

Docker

Docker volumes를 통해 안전하게 데이터를 지켜보자!

Docker로 MySQL 컨테이너를 실행할 때, 서버를 재시작하거나 컨테이너를 재생성(down 후 up)하면 데이터가 사라질까봐 걱정이 될거라고 생각한다.

이 글에서는 Docker Compose를 사용하여 MySQL 데이터를 안전하게 보존하는 방법을 단계별로 소개하려고 한다.

 

 

컨테이너를 재생성하면 데이터가 유지되지 않는 경우가 있다.

  • 컨테이너를 down했다가 다시 up했을 때 데이터가 사라짐.
  • --volumes 옵션 사용으로 볼륨까지 삭제되는 실수.
  • Docker에서 볼륨이 제대로 설정되지 않은 경우.

이러한 문제를 방지하려면 Docker 볼륨을 활용해야 한다.

 

Docker 볼륨을 활용한 데이터 보존

Docker 볼륨은 컨테이너가 삭제되더라도 데이터는 남아 있게 한다.

아래는 설정 및 작동 원리이다.

 

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - ./src:/app/src
      - ./build.gradle:/app/build.gradle
      - ./settings.gradle:/app/settings.gradle
      - ./gradle:/app/gradle
    command: >
      sh -c "./gradlew --no-daemon compileJava --continuous &
             ./gradlew --no-daemon bootRun"
    environment:
      SPRING_DEVTOOLS_RESTART_ENABLED: "true"
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql-container:3306/playground
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: 1234
    depends_on:
      - mysql-container

  mysql-container:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: playground
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

 

조금.. 난잡할 수 있겠지만 핵심은 여기에 있다.

volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

 

  • playground_mysql_data라는 Docker 볼륨이 생성
  • MySQL 컨테이너는 이 볼륨에 데이터를 저장
  • 컨테이너를 down해도 볼륨 데이터는 삭제되지 않음
  • 컨테이너를 다시 up하면 동일한 데이터를 다시 사용할 수 있음.
docker volume ls

 

해당 명령어로 볼륨이 잘 실행되고 있는지를 확인할 수 있는데

보이는 것처럼 건강하게 잘 살아있다.

 

그럼 해당 볼륨이 진짜 내 데이터를 담고 있는지도 확인해 보아야 할 것이다. 

(개발자는 항상 꼼꼼함이 필수이다. 되겠지라고 생각하고 넘어가면 코딩인생 망한다고 누군가가 그랬다)

docker exec -it playground-mysql-container-1 bash

 

 

해당명령어로 조회할 수 있다.

 

그럼 mysql에 로그인해주면 된다.

그 코드는

mysql -u root -p

이걸 입력하면 비번 치라고 나오는데 비번 치면 된다.

 

그 다음 쿼리문을 쳐주면 끝

 

엄마와 자식이 오순도순 잘 있는걸 확인할 수 있다.

 

그 뒤에 down 하고 up을 해보고 진짜로 살아있는지 테스트해보자.

(난 살아있었다)