Docker Volume

말하는 감자·2025년 5월 15일
2

내일배움캠프

목록 보기
60/73

왜 Docker Volume이 필요한가?

컨테이너가 가진 문제점

Docker를 활용하면 특정 프로그램을 컨테이너로 띄울 수 있다.
이 프로그램에 기능이 추가되면 새로운 이미지를 만들어서 컨테이너를 실행시켜야 한다.
이 때, Docker는 기존 컨테이너에서 변경된 부분을 수정하지 않고, 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식으로 교체를 한다.

-> 이런 특징 때문에 기존 컨테이너를 새로운 컨테이너로 교체하며ㅛㄴ 기존 컨테이너 내부에 있던 데이터도 같이 삭제된다.
만약 이 컨테이너가 MySQL을 실행시키는 컨테이너였다면 MySQL에 저장된 데이터도 같이 삭제됨.

도커는 컨테이너 기반 가상화 기술로 애플리케이션을 어디서든 실행 가능하게 만들어준다.
하지만 컨테이너는 기본적으로 "휘발성"이다.
즉, 컨테이너가 삭제되면 그 안에 저장된 모든 데이터도 같이 사라진다.
이 특성은 다음과 같은 문제를 낳는다:

  • DB 컨테이너를 껐더니 데이터가 사라짐
  • 로그 파일을 외부에서 분석하고 싶은데 컨테이너 내부에 있음
  • 업로드한 이미지 파일이 컨테이너 재시작 후 사라짐

이러한 문제를 해결하기 위해 도커는 컨테이너 외부에 데이터를 저장하는 방식, 즉 "볼륨(Volume)"이라는 개념을 도입했다.

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








Docker Volume의 기능 및 특징

  • 데이터 영속성 : 컨테이너를 삭제해도 볼륨에 저장된 데이터는 유지됨
  • 데이터 공유 : 여러 컨테이너가 같은 볼륨을 사용 가능 (공유 디렉토리처럼)
  • 호스트와 연결 : 호스트의 특정 디렉토리를 볼륨으로 연결 가능
  • 백업/복원 : 볼륨은 Docker 명령어로 백업 및 마이그레이션 가능

기술적으로는 볼륨은 호스트의 특정 디렉토리에 저장되며, 도커가 이 위치를 관리한다.








어떤 상황에서 사용하는가?

다음과 같은 상황에서 Docker Volume은 필수적으로 사용된다:

  1. 데이터베이스를 컨테이너로 실행할 때

    • MySQL, PostgreSQL 등의 데이터가 컨테이너 삭제 시에도 유지되어야 함
  2. 업로드 파일이 존재하는 서비스

    • 유저가 이미지/파일을 업로드하는 웹 서비스 → 파일은 외부에 보존되어야 함
  3. 로그 분석이나 로컬 저장소가 필요한 경우

    • Spring Boot 애플리케이션의 logs/ 디렉토리를 외부에서 보기 위해 마운트
  4. 컨테이너 간의 파일 공유

    • 데이터 처리 파이프라인에서 1단계 컨테이너가 파일을 쓰고, 2단계 컨테이너가 읽음








사용하는 방식


해당 방식으로 연결해주는 명령어 >

$ docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]

(docker run -e MYSQL_ROOT_PASSWORD=비밀번호 -p 3306:3306 -v /내컴퓨터디렉토리경로:/var/lib/mysql -d mysql) 이런식으로 작성된다.

  • /내컴퓨터디렉토리경로 -> [호스트의 디렉토리 절대경로]
  • /var/lib/mysql -> [컨테이너의 디렉토리 절대경로] mysql 경로
  • -e MYSQL_ROOT_PASSWORD=비밀번호 -> 환경변수 설정
  • -p 3306:3306 -> 포트설정(외부에서 MySQL 접속 가능하게 포트 3306 개방)
  • -d -> 백그라운드 실행

즉, MySQL 데이터 저장소(/var/lib/mysql)를 내 컴퓨터의 디렉토리와 연결.
+외부에서 MySQL 접속 가능하게 포트 3306 개방.
+루트 비밀번호 환경 설정 해줌
해주고있음 ㅇ

https://hub.docker.com/_/mysql

사용하는 명령어 종류에 따라서MySQL 컨테이너 실행 옵션이 바뀜




[호스트의 디렉토리 절대경로]에 디렉토리가 존재하는 경우

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

[호스트의 디렉토리 절대경로]에 디렉토리가 존재하지 않는 경우

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




출처 >
https://velog.io/@psi7218/Docker-%EB%8F%84%EC%BB%A4-%EB%B3%BC%EB%A5%A8-%EB%B0%8F-DB%EC%97%B0%EA%B2%B0
https://velog.io/@haeny01/Docker-데이터-관리1-Volume-과-Bind-mounts
https://hub.docker.com/_/mysql
https://youtu.be/XQ_jdJ8jSNk?si=gHmRvDI6MnzWNMJF <시리즈임








Docker와 BindMount

볼륨 내용을 찾는데 BindMount라는 용어가 같이 묶여서 설명되는것이 많다.

Bind Mount는 도커에서 데이터를 공유할 때 사용하는 볼륨의 한 종류인데, 특히 개발할 때 로컬 파일을 컨테이너 안에서 바로 반영하고 싶을 때 많이 쓴다고함.

호스트(로컬 컴퓨터)의 특정 디렉토리를 컨테이너 내부 경로에 연결(mount) 시켜주는 방식

즉 , 내 컴퓨터 디렉토리와 컨테이너 안의 디렉토리가 그대로 연결돼 있어서
내가 VSCode에서 수정한 코드가 즉시 컨테이너 안에서도 반영됨




비유로 두 개념 이해하기

🎒 바인드 마운트 = 내가 갖고 온 가방을 컨테이너 책상에 놓는 것

  • 컨테이너는 그 가방을 열고, 거기다 DB 데이터를 집어넣음
  • 밖(호스트)에서 그 가방 안에 손 넣어서 뭐 바꾸면,
    컨테이너에서도 그대로 보임 → 완전 공유




🗃️ 볼륨 = 도커가 책상 서랍을 하나 만들어줌

  • 내가 "mysql_volume"이라는 이름의 서랍을 요구함
    → 도커가 /var/lib/docker/volumes/mysql_volume/... 이런 식으로 보관
  • 컨테이너는 /data/db라는 폴더 안에 이 서랍을 연결해줌
  • 중요한 점은:
    • 이 서랍은 밖에서 잘 안 보임
    • 도커가 책임지고 관리해줌 (CLI로 volume ls, volume inspect 등)

나머진 나중에

출처 >
https://velog.io/write?id=7c3d36be-33bd-4e9b-a61c-6afa3aee00d2

profile
진짜 개발자가 되고싶은 무늬 개발자

2개의 댓글

comment-user-thumbnail
2025년 5월 15일

너무 유익한 글이에요 꼼꼼히 읽어보겠습니다

1개의 답글