♣ Docker에서의 volume이란 무엇일까?
- 컨테이너가 종료되거나 삭제가 되더라도 데이터를 안전하게 유지하기 위해 사용하는 도커의 데이터 관리 방식이다.
♣ 왜 volume을 사용하는가
- 컨테이너 내부의 파일 시스템은 휘발성으로 컨테이너가 종료되거나 삭제되면 내부에서 작업을 한 데이터들은 삭제가 된다. 작업내역이 사라져도 무관하다면 굳이 volume을 사용할 필요는 없다고 생각한다 다만 내가 사용하는 컨테이너가 데이터를 저장하는 DB라면? DB를 사용하는 이유는 데이터를 보관하여 유지시키기 위함인데 휘발성이라면 매우 불편할 것으로 생각이 된다 이때 volume을 사용하게 된다면 컨테이너의 저장공간만을 단독적으로 사용하는 것이 아닌 로컬(호스트)의 저장소와 연결하여 데이터를 컨테이너 외부에 저장하고 지속적으로 유지할 수 있도록 하기 위해 사용하게 된다.
♣ DB프로그램을 사용하여 volume 사용법을 알아보자
- volume을 사용하지 않았을 때 아래 이미지를 확인해 보면 새로 생성한 'mydb'가 없어진 게 확인된다.
DB는 데이터를 쌓는 프로그램인데 저장한 데이터들이 사라진다? 곤란... 이때 volume을 사용하면 어떻게 달라지는지 확인해 보자
1. 데이터를 저장하고 싶은 폴더 만들기
2. 생성된 폴더로 이동하여 절대경로 파악하기 (pwd)
3. docker 컨테이너 실행할 때 로컬 경로와 컨테이너 경로를 연결해 주기
docker run -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -v /Users/eunsol/Documents/docker-mysql/mysql_data:/var/lib/mysql -d mysql
옵션 / 항목 | 설명 |
docker run | 도커 컨테이너 실행 명령어. 이미지가 없으면 자동으로 다운로드 후 실행. |
-d | Detached 모드. 컨테이너를 백그라운드에서 실행하여 터미널을 점유하지 않음. |
-p 3306:3306 | 포트 포워딩 설정. 로컬의 3306 포트를 컨테이너의 3306 포트와 연결.MySQL 기본 포트이므로 외부에서 접근 가능하게 함. |
-e MYSQL_ROOT_PASSWORD=1234 | 환경변수 설정. MySQL 컨테이너 실행 시 root 계정의 비밀번호를 "1234"로 지정. |
mysql | 실행할 이미지 이름. 여기서는 공식 MySQL 이미지를 사용. |
여기서 부터 volume 관련 | |
-v {데이터를 저장할 폴더의 호스트절대경로}:{컨테이너의 저장 경로} | 볼륨 마운트 옵션, 로컬 디렉토리와 컨테이너 내부 디렉토리를 연결(공유)하는 설정 |
로컬의 절대 경로는 pwd명령어를 통해 알 수 있지만 docker 컨테이너 내부의 데이터는 어디에 저장되는지 확인하려면 dockerhub에 문서를 잘 살펴보면 어디에 저장해야 하는지에 대해서 설명한 파트가 나온다 해당 경로를 가지고 사용하면 된다.
위에 2, 3번 이미지를 통해 volume을 연결했다면 컨테이너를 종료하고 다시 실행시켰을 때도 이전에 생성했던 테이블이 그대로 있는 걸 확인할 수 있다. 또한 4, 5번 이미지를 통해 /Users/eunsol/Documents/docker-mysql/mysql_data:/var/lib/mysql 연결된 폴더 내의 파일이
완전 일치하는 걸 확인할 수 있다. 이와 같이 데이터가 유지되어야 할 때 volume을 사용해서 데이터의 유지성을 지켜줄 수 있다.
📌 주의할 점
1. 생성된 volume의 정보를 컨테이너 생성할 때 변경할 수 있을까?
- 불가능하다 mysql의 경우 컨테이너를 생성할 때 같은 volume을 사용할 거지만 패스워드를 변경하고 싶다고 해서 컨테이너를 생성할 때 변경값을 입력해 버리면 실행이 되지 않고 오류가 난걸 콘솔에서 확인할 수 있을 것이다 그 이유는 이미 volume에 지정이 된 변경 값이 있기 때문에 만약 패스워드를 변경하고 싶다면 그 볼륨 mysql에 직접 들어가서 변경하는 방법을 사용해야 한다.
2. volume을 연결하려고 하는 디렉터리에 다른 파일이 있다면 연결이 가능할까?
- 불가능하다. 컨테이너를 실행한다면 초기 데이터베이스 구조를 자동으로 생성하지만 만약 volume에 연결된 로컬 디렉터리에 다른 파일이 있다면 깨끗한 초기상태가 아니라서 불가능하든 에러가 나오고 초기 구성이 되지 않는다. 고로 처음 volume을 사용할꺼라면 디렉터리가 아무것도 없는 걸로 연결이 되어야 한다!
'DevTools > Docker' 카테고리의 다른 글
Docker Compose (0) | 2025.06.15 |
---|---|
dockerfile과 dockerfile 자주 사용되는 명령어 (0) | 2025.06.15 |
docker - 컨테이너, 이미지 강제(-f) 삭제, 컨테이너, 이미지 일괄 삭제 CLI (1) | 2025.04.15 |
docker 컨테이너 생성, 조회, 실행, 중단, 삭제 CLI (0) | 2025.04.15 |
docker 이미지 다운로드, 조회, 삭제 CLI (0) | 2025.04.15 |