If at first you don't succeed, try again

[Docker] Docker Volume 활용 - 데이터 유실 방지 본문

Infra/Docker

[Docker] Docker Volume 활용 - 데이터 유실 방지

웅지니어링 2025. 3. 25. 09:26

* 개요

얼마 전, Docker로 MySQL 컨테이너를 띄운 후, 데이터베이스에 다량의 데이터를 저장했다.

그런데 rm 명령어를 잘못 써서 MySQL 컨테이너가 삭제되는 대참사가 발생했다.

컨테이너가 삭제되면서 DB는 물론, 데이터도 다 날아가버렸다...

복구 방안이 없나 찾아봤지만, 찾을 수 없었다..

Docker Volume을 활용하면 데이터 유실을 방지할 수 있다고 하여 공부 겸 글을 쓰게 되었다.

 

* Docker Volume이란?

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

 

* Docker Volume 명령어

$ docker run -v [host directory 절대경로]:[container의 directory 절대경로] [이미지명]:[태그명]

여기서 주의해야 할 점은 [host directory 절대경로]에 디렉토리가 이미 존재할 경우,

호스트의 디렉토리가 컨테이너의 디렉토리를 덮어씌운다.

 

[host directory 절대경로]에 디렉토리가 존재하지 않을 경우,

호스트의 디렉토리 절대 경로에 디렉토리를 새로 만들고, 컨테이너의 디렉토리에 있는 파일들을 호스트의 디렉토리로 복사해온다. 

 

* Docker Volume을 활용 후 MySQL 실행

1. 우선 MySQL에 대한 데이터를 저장할 호스트 디렉토리를 만들어준다.

 나는 C:\Users\gram\Downloads\prac 디렉토리 내에 mkdir 명령어를 통해 docker-mysql 폴더를 만들었다.

이제 저장할 폴더 경로를 이용해 docker run 명령어를 써보자.

 

$ docker run -e MYSQL_ROOT_PASSWORD=1234 -p 3307:3306 -v C:/Users/gram/Downloads/prac/docker-mysql/mysql_data:/var/lib/mysql -d mysql

 

보통 호스트의 포트도 MySQL의 default 포트인 3306으로 설정하지만,

이미 나는 다른 프로젝트에 MySQL 포트 3306을 사용하고 있어 3307로 설정하였다.

 

2. MySQL 컨테이너에 접속해서 데이터베이스를 만든다.

실행시킨 MySQL의 container id가 ff2f로 시작하기에 ff2f를 이름으로 지정하여 실행한다.

bash에 접속한 후 mysql -u root -p 명령어를 통해 mysql에 접속한다.

show databases;

데이터베이스 정보를 확인한다.

생성된 DB가 없고 default DB만 존재한다. DB를 생성하고 컨테이너를 삭제하자.

create database testdb;

MySQL container를 삭제했다. 다시 도커 볼륨을 이용해 컨테이너를 띄운 후 데이터가 존재하는지 확인하자.

아까와 동일한 경로로 실행했다. MySQL에 접속해서 데이터를 확인한다.

show databases;

아까 생성했던 testdb가 존재하는 것을 확인할 수 있다.

'Infra > Docker' 카테고리의 다른 글

[Docker] Docker 간단한 사용법  (0) 2025.03.01
[Docker] Docker의 기초와 개념  (0) 2025.03.01