1. 이유
Docker를 이용하여 MYSQL 컨테이너를 생성하여 데이터를 넣었지만 컨터이너를 삭제하면 데이터가 함께 삭제됨
- 비휘발성이라 데이터 지속성을 위해 필요
2. 방법
우선 명령어는 아래와 같습니다.
<bash />docker run -v [호스트_경로]:[컨테이너_경로] [이미지_이름]
예시로 MYSQL이라 생각하고 진행한다면 아래와 같이 명령어를 입력할 수 있습니다.
하지만, 그 전에 내가 준비해야할 호스트 경로를 만들어야 합니다.
<bash />
mkdir [폴더 이름]
cd [폴더 이름]
docker-mysql01 라는 폴더 이름을 생성하여 호스트 경로는 준비가 되었습니다.
컨테이너 경로는 공식 웹사이트에서 확인할 수 있습니다.
mysql - Official Image | Docker Hub
Quick reference Supported tags and respective Dockerfile links 9.2.0, 9.2, 9, innovation, latest, 9.2.0-oraclelinux9, 9.2-oraclelinux9, 9-oraclelinux9, innovation-oraclelinux9, oraclelinux9, 9.2.0-oracle, 9.2-oracle, 9-oracle, innovation-oracle, oracle8
hub.docker.com
<bash />$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
위와 같은 명령어 중 [컨테이너 경로] 라고 보이는 곳은 /var/lib/mysql 부분 입니다.
그럼 준비는 다 되었습니다.

볼륨이라고 생성한 폴더에 가면 실제 파일과 폴더가 생성된 것을 볼 수 있습니다.

실제 접속을 하기 위해 컨테이너 접속 후 MYSQL 에 접근합니다.
<bash />
# 컨테이너 접속
docker exec -it [Container ID] bash
# MYSQL 접속
mysql -r root -p

현재 DB를 확인하고 새로 DB 를 생성해 봅니다.


test_db 라고 생성한 후 호스트에서 만든 폴더 내에서도 변화가 있는 것을 알 수 있습니다.

3. 컨테이너를 삭제 후 재설치 한다면 이전에 생성한 DB가 남아 있을까?
실제로 해보면 남아 있는 것을 확인 할 수 있습니다.
왜?
내가 만든 호스트 폴더에 저장된 것을 사용하기 때문입니다.
결국 볼륨이라는 개념으로 인해 삭제가 안되고 전에 있던 데이터와 패스워드 정보도 가지고 있는 것입니다.
그런데 같은 폴더 내에 password 값을 다르게 입력하여 저장하면 덮어 씌어지지 않습니다.
그 값을... 무시하기 때문이죠. 결국 생성된 유저의 비밀번호는 볼륨데이터가 유지되는 한 변경되지 않습니다.
해결 방법은 기존 볼륨을 삭제 후 다시 컨테이너를 실행하거나 수동으로 비밀번호를 변경하는 것입니다.
4. [호스트 경로] 에 이미 다른 파일이 있다면?
실제로 폴더를 만들고 해당 폴더에는 아무것도 없을 것이라 생각할 것입니다.
그럼에도 불구하고 혹시나... 다른 파일이 있는 상황에서 실행한다면 컨테이너이 저장 공간을 호스트 저장공간으로 공유하는 게 아니라
반대로 실행될 것입니다.
- 새로운 이름을 가진 docker-mysql02 를 생성
- 해당 폴더 내에 파일 생성 (test.txt)
위와 같은 환경에서 위와 같은 명령어를 통해 실행해 봅니다.

생성은 했지만 실행은 안되고 중지된 상태 입니다.
로그를 확인해 본 결과 초기화 과정 중에 데이터 디렉토리에 파일이 있다는 것을 발견하고 중단이 되었네요.

그래서 docker ps 를 통해 접근해보려 했지만 접근이 되지 않았습니다.
'Docker' 카테고리의 다른 글
[Docker] Docker로 MYSQL 설치 및 연결상태 확인 (0) | 2025.03.03 |
---|---|
[Docker] Docker Compose 사용 및 Dockerfile과 비교하기 (0) | 2025.03.02 |
[Docker] Dockerfile과 WORKDIR 명령어 (0) | 2025.02.26 |
[Docker] Dockerfile 과 RUN 명령어 (0) | 2025.02.26 |
[Docker] Dockerfile 과 ENTRYPOINT 명령어 (0) | 2025.02.26 |