도커에서 컨테이너가 제거되면 내부에 저장되어 있던 데이터까지 함께 삭제되어 없어지는 문제가 있다.
이를 방지하기 위해 개념인 볼륨(Volume)을 활용하여 MySQL 컨테이너를 실행해 보자.
볼륨(Volume)을 활용해 MySQL 컨테이너 실행
$ docker run -v C:\docker-workspace\mysql/mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql
볼륨은 -v 옵션을 통해 설정이 가능하며, 사용법은 '-v [호스트의 폴더 절대경로]:[컨테이너의 폴더 절대경로]'이다(다른 옵션들의 의미는 여기에서 확인). 포인트는 아래와 같다. 별5개로 중요!!!🤩
- [호스트의 폴더 절대 경로]에 디렉토리가 이미 존재할 경우, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.
- [호스트의 폴더 절대 경로]에 디렉토리가 존재하지 않을 경우, 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사해온다.
MySQL 이미지(image) 사용법을 보면 뒤에 '{폴더 절대경로}/datadir:/var/lib/mysql' 식으로 작성하면 된다고 설명돼있다(저장 경로는 DB 종류마다 다름). 저는 호스트 볼륨으로 사용할 공간으로 C:\docker-workspace\mysql 라는 폴더를 만들었습니다. 주의할 점으로는 명령문 콜론(:) 바로 앞에 있는 맨 마지막 폴더(위 사진 예시에서는 datadir)까지 전부 미리 만들어 놓으면 처음 실행 시 컨테이너의 폴더를 덮어씌우므로 미리 만들어놓지 않고 명령문에만 붙여놓으면 되겠다. 저는 datadir 대신 'mysql_data'를 폴더 이름으로 사용했습니다.
명령문을 실행하니 mysql_data 폴더가 만들어지면서 여러 잡다한 파일들이 생겨난 것을 확인할 수 있는데, 실제 컨테이너 내부 공간의 데이터 파일들과 동일함을 알 수 있다.
MySQL 컨테이너에 접속하여 DB에 새로운 데이터 추가하기
$ docker exec -it [컨테이너ID] bash
$ mysql -u root -p
다음 명령어로 컨테이너 내부로 이동하고 MySQL에 접속해보자.
mydb라는 데이터베이스를 생성한 후 exit.
컨테이너 삭제
$ docker ps
$ docker rm -f [컨테이너ID]
일반적이라면 컨테이너를 삭제(remove)했으므로, 컨테이너 내부 디렉토리에 저장되어 있을 mydb라는 데이터베이스가 없어져야 한다.
MySQL 컨테이너 재실행
$ docker run -v C:\docker-workspace\mysql/mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql
$ docker exec -it [컨테이너ID] bash
$ mysql -u root -p
$ show databases;
컨테이너 내부가 아닌 호스트의 저장 공간에 DB 데이터를 뒀기 때문에, 컨테이너를 재실행해도 새로 생성했던 남아있음을 확인할 수 있다. 한 가지 중요한 점은 볼륨을 이용하여 MySQL 컨테이너를 처음 띄울 때 설정했던 초기 비밀번호가 호스트 저장 공간에 셋팅이 돼버린다는 점이다.
$ docker run -v C:\docker-workspace\mysql/mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pwd1234 -d -p 3306:3306 mysql
그래서 컨테이너를 다시 띄울 때 위와 같이 다른 비밀번호를 이용하여 셋팅한다고 하더라도, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌우기 때문에 초기에 볼륨에 설정했던 비밀번호가 적용된다.
Docker Volume 저장 공간 이해하기
추가적으로 컨테이너가 실행된 상태에서 호스트 저장 공간에 파일을 추가하면, 컨테이너 저장 공간에 해당 파일이 복사돼있는 것을 알 수 있다.
'Docker' 카테고리의 다른 글
Docker 명령어 사용 및 예시(nginx 설치&실행) (0) | 2025.04.25 |
---|---|
Docker Desktop 설치 및 확인 (0) | 2025.04.17 |
도커 컨테이너(Container)와 이미지(Image)란? (9) | 2020.11.02 |
도커(Docker)와 가상머신(Virtual Machine) 비교 (2) | 2020.10.02 |
도커(Docker)를 이용한 오라클 설치 및 실행 (0) | 2020.03.09 |