[Docker] 도커 볼륨 및 DB연결

psi·2024년 9월 20일

✅ 컨테이너가 가진 문제점

Docker를 활용하면 특정 프로그램을 컨테이너로 띄울 수 있다. 이 프로그램에 기능이 추가되면 새로운 이미지를 만들어서 컨테이너를 실행시켜야 한다. 이 때, Docker는 기존 컨테이너에서 변경된 부분을 수정하지 않고, 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식으로 교체를 한다. 이게 효율적이라고 생각했던 것이다.
이런 특징 때문에 기존 컨테이너를 새로운 컨테이너로 교체하면, 기존 컨테이너 내부에 있던 데이터도 같이 삭제된다. 만약 이 컨테이너가 MySQL을 실행시키는 컨테이너였다면 MySQL에 저장된 데이터도 같이 삭제 돼버린다.
따라서 컨테이너 내부에 저장된 데이터가 삭제되면 안 되는 경우에는 볼륨(Volume)이라는 개념을 활용해야 한다.

Docker volume이란?
도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법이다. 볼륨(Volume)은 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태이다.

도커 볼륨 명령어

$ docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
  • [호스트의 디렉토리 절대 경로]에 디렉토리가 이미 존재할 경우, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.
  • [호스트의 디렉토리 절대 경로]에 디렉토리가 존재하지 않을 경우, 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사해온다.

DB연결 (Mysql)

Dockerhub 사이트를 통해 각 이미지를 다운받는다.

  • sql 종류별로 설정법이 다르므로 사이트를 꼭 참조해야함
docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /컴퓨터/경로:/var/lib/mysql -d mysql
  • /var/lib/mysql -> mysql이 요구하는 경로
  • MYSQL_ROOT_PASSWORD=비밀번호 -> mysql 기본 설정
  • 3306포트 맵핑이후 볼륨을 이용해 mysql을 도커에 다운로드

❌ 트러블 슈팅

MySQL 컨테이너를 Docker에서 실행하여, 볼륨을 마운트하여 데이터를 유지하려고 시도함.

  1. 문제 증상 (Error Details)
    MySQL 실행 후 데이터베이스 접속 및 CREATE DATABASE mydb; 명령을 실행하여 mydb가 정상적으로 생성됨.
    하지만, 컨테이너를 삭제(docker rm -f <컨테이너>)하고 동일한 명령으로 다시 컨테이너를 실행한 후, 데이터베이스에 접속하면, 이전에 생성한 mydb가 존재하지 않음.
    기대한 결과는 데이터베이스가 마운트된 볼륨에 저장되어 컨테이너를 삭제하더라도 DB가 유지되는 것.

2. 문제 원인 분석 (Root Cause Analysis)
MySQL 컨테이너는 데이터베이스 파일을 /var/lib/mysql 디렉터리에 저장하도록 설정되어 있음.
초기에는 컨테이너 내부의 /var/lib/mysql에 데이터베이스 파일이 생성되지만, 컨테이너를 삭제하면 이 데이터도 함께 삭제됨.
볼륨 마운트를 사용했으나, 시스템 경로(c:/WINDOWS/system32/docker-mysql/mysql_data)에 마운트했기 때문에 권한 문제로 인해 데이터가 볼륨에 저장되지 않았을 가능성이 큼.
이로 인해 docker rm -f로 컨테이너를 삭제하면, 데이터도 함께 사라짐.

3 .해결 과정 (Solution)
시스템 경로가 아닌 사용자 디렉터리로 마운트 경로를 변경함
docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 -v C:/docker-mysql/mysql_data:/var/lib/mysql mysql
사용자 디렉터리를 마운트하였을 때, 볼륨이 제대로 작동하여 데이터가 유지됨을 확인함.
컨테이너를 삭제하고 재실행한 후에도, 데이터베이스 mydb가 그대로 남아있는 것을 확인함.

참고 사항 (Notes)
Windows 시스템 경로는 권한 문제를 일으킬 수 있으므로, 볼륨 마운트 시 사용하지 않는 것이 좋음.
사용자 디렉터리나 전용 디렉터리를 사용하여 데이터 저장 경로를 설정하면 데이터가 유지됨.
docker logs와 docker inspect 명령을 통해 컨테이너 문제를 빠르게 파악할 수 있음.

profile
사용자 경험을 최우선하며 논리적 문제 해결을 즐기는 개발자

0개의 댓글