2025. 7. 8. 17:56ㆍ도커
볼륨과 바인드 마운트란?
볼륨(Volume): Docker가 관리하는 저장 공간을 말합니다.
바인드 마운트(Bind Mount): 호스트의 특정 폴더를 컨테이너에 연결하여, 파일을 양쪽에서 실시간으로 공유하는 것을 말합니다.
볼륨과 바인드 마운트는 왜 필요한가
문제 1. 컨테이너를 삭제하면 데이터가 사라진다.
컨테이너는 격리된 파일 시스템을 가지고 있기 때문에 컨테이너 내부에 있는 파일은 컨테이너 안에만 존재합니다.
따라서, 컨테이너가 삭제되면 우리가 컨테이너에 저장해 둔 데이터도 삭제됩니다.
예를 들어서 mysql 컨테이너를 띄운 후 여러 작업을 통해 DB에 데이터가 생성되었는데
포트를 변경해야해서 컨테이너를 삭제하고 다시 띄우면 여태까지 진행한 작업에 대한 데이터가 다 날아갑니다.
컨테이너를 삭제하지 않으면 되지 않냐라고 생각할 수 있지만, 컨테이너는 우리가 필요할 때 언제든지 생성했다가
필요 없어지면 언제든지 삭제할 수 있다는 장점으로 인해서 사용하는 이유도 있기 때문에 장점 하나를 포기하는 것이기도 하고.
컨테이너는 여러 가지 이유로 삭제되었다가 다시 생성될 수도 있습니다.
(설정 변경, 업데이트, 이미지 재빌드, 의도치 않은 문제로 인한 삭제 등등...)
문제 2. 개발 중 코드 수정에 대한 반영이 빠르게 이뤄지지 않는다.
index.html을 보여주는 간단한 서버를 만들고 해당 웹서버 컨테이너를 띄워놨다고 가정해 보겠습니다.
브라우저로 접근하면 index.html의 내용이 보일 겁니다.
여기서 수정사항이 생겨서 index.html을 hello, world에서 hello, docker로 변경한 후 저장한다고 해서
컨테이너의 내용이 바뀌지 않기 때문에 새로고침을 해도 여전히 브라우저에서는 hello, world를 보여줍니다.
수정사항을 반영하려면 이미지를 재빌드하고 컨테이너를 재실행해야 합니다.
이런 과정이 한두 번이라면 상관없겠지만 개발 중에는 코드에 대한 수정이 빈번히 일어나므로 엄청난 불편함이 있을 수 있습니다.
위에서 언급한 문제들을 볼륨과 바인드 마운트로 해결할 수 있습니다.
이제 하나씩 알아가 보겠습니다.
볼륨(Volume)

볼륨은 Docker가 관리하는 독립적인 저장 공간을 말합니다.
볼륨을 생성하면 호스트 시스템의 특정 위치에 생성되기 때문에 컨테이너가 삭제되어도 데이터가 삭제되지 않으며,
여러 컨테이너에서 동시 사용도 가능합니다.
주요 명령어
# 볼륨 생성
docker volume create [볼륨 명]
# 볼륨 목록 확인
docker volume ls
# 볼륨 상세 정보
docker volume inspect [볼륨 명]
# 볼륨 삭제
docker volume rm [볼륨 명]
# 사용하지 않는 볼륨 모두 삭제
docker volume prune
실습해 보기
1. 볼륨을 생성합니다.
docker volume create mysql-data
2. MySQL 컨테이너 생성 및 실행합니다. (볼륨 연결)
# mysql-data볼륨을 컨테이너의 /var/lib/mysql과 연결
docker run -d \
--name mysql-volume-test \
-e MYSQL_ROOT_PASSWORD=1234 \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
# 인터렉티브 모드로 접속
docker exec -it mysql-volume-test mysql -uroot -p1234
# 데이터 생성
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE users (id INT, name VARCHAR(50));
INSERT INTO users VALUES (1, 'Hello'), (2, 'World');
3. 데이터를 생성합니다.
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE users (id INT, name VARCHAR(50));
INSERT INTO users VALUES (1, 'Hello'), (2, 'World');
4. 결과 조회

5. 컨테이너 삭제 및 재생성합니다.
# 컨테이너 삭제
docker rm -f mysql-volume-test
# 컨테이너 다시 생성 (같은 볼륨 사용)
docker run -d \
--name mysql-volume-test \
-e MYSQL_ROOT_PASSWORD=1234 \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
# 인터렉티브 모드로 접속
docker exec -it mysql-volume-test mysql -uroot -p1234
6. 재생성 후 결과 조회

컨테이너를 삭제하고 다시 만들었는데, 데이터가 그대로 살아있는 걸 확인할 수 있습니다.
바인드 마운트(Bind Mount)
바인드 마운트는 호스트의 특정 폴더를 컨테이너에 직접 연결하는 방식입니다.
볼륨과 달리 내가 정확한 경로를 지정하며, 호스트에서 파일을 수정하면 컨테이너에 즉시 반영되고,
컨테이너에서 파일을 수정하면 호스트에도 즉시 반영됩니다.
주로 개발 중 코드를 실시간으로 수정하고 테스트할 때 사용하기 유용합니다.
실습해 보기
1. 프로젝트 폴더를 만들고 해당 경로에 index.html, Dockerfile을 만듭니다.
<!-- index.html -->
<h1>Hello, Docker!</h1>
# Dockerfile
FROM ubuntu:20.04
RUN apt update && apt install -y python3
WORKDIR /app
CMD ["python3", "-m", "http.server", "8000"]
2. 이미지 빌드하고 바인드 마운트로 컨테이너를 실행합니다. (프로젝트의 경로에서 해야 합니다.)
docker build -t bind-mount-test .
# 현재경로(프로젝트 경로)와 컨테이너의 /app과 연결
docker run -d --name bind-mount-test-container -p 8888:8000 -v $(pwd):/app bind-mount-test
3. 브라우저에서 확인합니다.

4. index.html을 아래와 같이 수정합니다.
<!-- index.html -->
<h1>실시간 반영 테스트</h1>
<p>바인드 마운트 덕분에 즉시 반영됩니다!</p>
5. 브라우저 새 로고침해서 확인

호스트의 프로젝트 파일과 컨테이너의 /app이 연결되어서 호스트에서 수정을 하면 즉시 컨테이너에서도 확인할 수 있습니다.
6. 컨테이너에서 파일 수정
컨테이너의 쉘로 붙어서 index.html을 수정하면 연결된 호스트의 index.html도 수정됩니다.
echo '<p>Docker is Good</p>' >> index.html

'도커' 카테고리의 다른 글
| Docker를 이용해 프로젝트 컨테이너화 하기 - docker-compose.yml 작성 (1) | 2026.01.20 |
|---|---|
| 도커 이미지와 컨테이너 (1) | 2025.07.08 |
| 도커 컴포즈(Docker Compose) (0) | 2025.07.08 |
| Dockerfile (0) | 2025.07.08 |
| 컨테이너(Container) (2) | 2025.06.22 |