
Docker Volume은 컨테이너의 데이터를 영구적으로 저장하기 위한 기능입니다. 컨테이너 자체의 저장소를 사용하는 것이 아니라, 호스트(로컬 컴퓨터)의 저장 공간을 컨테이너와 공유하는 방식으로 데이터를 안전하게 보존할 수 있습니다.
이렇게 하면, 컨테이너를 교체하거나 삭제하더라도, 데이터는 호스트에 남아있기 때문에 다시 컨테이너를 띄웠을 때 기존 데이터를 그대로 사용할 수 있습니다.
Docker를 사용하면 특정 프로그램을 컨테이너로 실행할 수 있습니다. 그런데 이 프로그램에 기능을 추가하거나 변경 사항이 생길 경우, Docker는 기존 컨테이너를 수정하지 않고 새로운 이미지를 생성하고, 이를 기반으로 새로운 컨테이너를 실행합니다. 이렇게 될 경우 기존 컨테이너에 저장된 데이터도 함께 삭제된다는 문제가 발생합니다.
예를 들어, MySQL을 실행하는 컨테이너가 있다면, 이 컨테이너를 교체할 때 MySQL에 저장된 데이터 역시 사라져버립니다. 이러한 상황에서 데이터 손실을 방지하려면, Docker Volume(볼륨)을 활용해야 합니다.
Docker Volume은 컨테이너와 호스트 시스템 간에 데이터를 공유할 수 있도록 해 주며, 데이터를 영구적으로 보존할 수 있는 방법을 제공합니다. 이를 통해 컨테이너가 교체되더라도 데이터는 호스트에 남아 안전하게 유지됩니다.
이렇게 하면, 컨테이너의 업데이트나 변경이 있더라도 데이터 손실 없이 서비스를 지속적으로 운영할 수 있습니다.
호스트 디렉토리와 컨테이너 디렉토리 연결: 볼륨을 사용하면 호스트의 디렉토리를 컨테이너와 연결시켜, 데이터가 컨테이너를 넘어서 호스트에 저장되도록 합니다.
볼륨(Volume)은 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태입니다.
볼륨을 사용하여 컨테이너를 실행하는 명령어는 다음과 같습니다:
$ docker run -v [호스트 디렉토리 경로]:[컨테이너 디렉토리 경로] [이미지명]:[태그명]


Docker Hub에서 MySQL 이미지를 검색해보면, 다음의 문서를 확인할 수 있습니다.
이것은 해당 이미지를 정상적으로 실행, 사용하기 위한 가이드이므로 문서의 내용을 준수하여야 문제가 발생하지 않습니다.
만약, 문서대로 이미지를 생성 및 실행하지 않았을 경우 다음과 같은 문제가 발생합니다.
컨테이너가 정상적으로 실행되지 않고, 종료되는 것을 확인할 수 있습니다.
문서대로 이미지를 생성 및 실행하게 되면 문제 없이 정상적으로 동작하는 것을 확인할 수 있습니다.
설정한 패스워드, 즉 환경변수 값도 잘 설정되어 있음을 확인할 수 있습니다.
DataGrip으로 확인해보면, 다음과 같이 MySQL이 잘 연결되는 것을 확인할 수 있습니다.
위의 과정은 도커 볼륨을 사용한 것은 아닙니다. 위에서 생성한 MySQL 컨테이너는 컨테이너 내부의 저장 공간을 사용하게 됩니다. 지금까지의 과정을 그림으로 나타내면 다음과 같습니다.
그러면, 위의 컨테이너를 삭제 후 재생성 및 실행하여 데이터가 어떻게 되었는지 확인해 보도록 하겠습니다.

위 방식은 볼륨(Volume)을 활용하지 않고 MySQL 컨테이너를 생성하였습니다. 그래서 MySQL 컨테이너를 삭제함과 동시에 MySQL 내부에 저장되어 있던 데이터도 함께 삭제되어 없어졌습니다. 다음에는, 이를 방지하기 위해 볼륨(Volume)을 활용해 MySQL 컨테이너를 띄우는 방식에 대해 알아보도록 하겠습니다.
$ cd Users/donggyun/Downloads/mysql_volume
$ mkdir docker-mysql # MySQL 데이터를 저장하고 싶은 폴더 만들기
# docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v {호스트의 절대경로}/mysql_data:/var/lib/mysql -d mysql
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /Users/donggyun/Downloads/mysql_volume/docker-mysql/mysql_data:/var/lib/mysql -d mysql
pwd 명령어로 볼륨으로 사용하고자 하는 경로를 확인한 뒤 입력합니다.mysql_data 디렉토리를 미리 만들어 놓으면 안 됩니다. 그래야 처음 이미지를 실행시킬 때 mysql 내부에 있는 /var/lib/mysql 파일들을 호스트 컴퓨터로 공유 받을 수 있습니다.mysql_data 디렉토리를 미리 만들어 놓을 경우, 기존 컨테이너의 /var/lib/mysql 파일들을 전부 삭제한 뒤에 mysql_data로 덮어씌워 버립니다. 이는 mysql의 기본 세팅 설정들을 모두 덮어씌우는 것이므로 컨테이너가 정상적으로 실행되지 않고 바로 종료되는 결과를 초래합니다./var/lib/mysql인지는 Dockerhub MySQL의 공식 문서에 나와 있습니다.


도커 볼륨은 호스트의 저장 공간을 공유하는 방식입니다.
도커 볼륨은 호스트 시스템에 생성되고, 여러 컨테이너에서 이를 마치 파일 시스템의 일부처럼 사용할 수 있습니다. 예를 들어, 호스트의 특정 디렉토리나 파일을 도커 볼륨으로 지정하면, 그 데이터를 컨테이너에서 바로 접근할 수 있게 됩니다.
따라서, 컨테이너에서 파일을 생성하거나 수정할 경우 해당 변경 사항은 호스트 저장소에 그대로 반영되며, 반대로 호스트에서 수정한 파일이나 데이터도 컨테이너에서 바로 접근할 수 있습니다.