컨테이너는 기본적으로 데이터를 저장하지 않는 휘발성(Stateless) 프로세스다.
도커는 데이터를 영구적으로 보존하거나 호스트와 공유하기 위해 '볼륨(Volume)'과 '바인드 마운트(Bind Mount)' 기능을 제공한다.
우선 이번 포스팅에서는 바인드 마운트 방식에 대해 알아보자.
바인드 마운트는 호스트의 특정 파일 경로를 컨테이너 내부에 직접 연결하므로, 호스트에서 소스 코드를 수정하면 컨테이너에 즉시 반영된다. 개발 환경에서는 소스 코드를 수정할 때마다 이미지를 다시 빌드하는 것이 비효율적이므로, 바인드 마운트 기능을 활용한다.
예시: 호스트에 웹 페이지 소스 디렉터리를 생성하고, 호스트의 디렉터리를 Nginx 컨테이너의 웹 루트 디렉터리에 마운트 하여 호스트에서 파일을 수정하면 웹 페이지가 변경되도록 구성한다.
# 1. 웹 파일을 저장할 호스트 디렉터리 생성
mkdir /home/ubuntu/Desktop/webs
# 2. 테스트용 index.html 파일 생성
echo "<h1>Original Nginx Webpage</h1>" > /home/ubuntu/Desktop/webs/index.html
# 3. 디렉터리 이동
cd /home/ubuntu/Desktop/webs
docker run 명령어의 -v 옵션을 사용하여 호스트의 현재 경로(pwd)를 컨테이너의 웹 루트 디렉터리에 연결한다.
docker run -v [호스트_경로]:[컨테이너_경로]:[권한옵션] [이미지_이름]
- [호스트_경로] (Source): 내 컴퓨터(Host)의 실제 파일이나 디렉터리 경로. 반드시 절대 경로로 입력해야 한다. (예: /home/user/web 또는 해당 경로로 이동해서 $(pwd))
- [컨테이너_경로] (Target): 컨테이너 내부에서 해당 데이터를 연결할 경로.
- [권한옵션] (Optional): 생략 가능하며 기본값은 rw(읽기/쓰기)다. ro(읽기 전용)로 설정할 수 있다.
# 호스트의 현재 경로($(pwd))를 컨테이너의 /usr/share/nginx/html 에 연결
docker run --name webpage1 -v $(pwd):/usr/share/nginx/html:rw -p 3001:80 -d nginx:latest
docker run --name webpage2 -v $(pwd):/usr/share/nginx/html:rw -p 3002:80 -d nginx:latest
-v $(pwd):/usr/share/nginx/html:rw: 호스트의 현재 디렉터리(/home/ubuntu/Desktop/webs/)를 컨테이너 내부의 Nginx 기본 문서 경로인 /usr/share/nginx/html에 덮어씌운다(mount). (rw는 읽기/쓰기 권한을 의미)
이제 호스트에 있는 index.html이 컨테이너의 원본 index.html을 대체하게 된다.
만약 호스트에서 파일을 수정하면 어떻게 될까?
# 호스트에서 파일 수정
nano index.html
# 내용을 "<h1>Modified Nginx Webpage</h1>" 으로 수정 후 저장
브라우저에서 http://localhost:3001, http://localhost:3002 등으로 접속해 보면, 컨테이너를 재시작하지 않았음에도 문구가 "Modified Nginx Webpage"로 변경된 것을 확인할 수 있다.
이는 파일이 복사된 것이 아니라, 호스트의 파일 시스템을 컨테이너가 직접 참조하고 있기 때문이다.

이처럼 Volume을 사용하면 다음과 같은 이점이 있다.
- 데이터 영속성: 컨테이너가 삭제되어도 호스트의 데이터는 안전하다.
- 개발 편의성: 코드를 수정하기 위해 매번 이미지를 다시 빌드하거나 컨테이너에 접속할 필요 없이, 호스트에서 소스 코드를 수정하면 즉시 반영된다.
- 데이터 공유: 여러 컨테이너(webpage1, webpage2 등)가 하나의 호스트 경로를 공유함으로써 동일한 콘텐츠를 서비스할 수 있다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화 (2) (0) | 2026.01.05 |
|---|---|
| [Kubernetese] 스프링부트(Spring boot) 서버를 파드(Pod)로 띄우기 (0) | 2026.01.03 |
| [Docker] 컨테이너의 네트워크 구조: docker0과 veth (0) | 2026.01.01 |
| [Docker] 컨테이너 통신: 링크(--link) 옵션을 활용해서 WordPress와 DB 연동하기 (0) | 2026.01.01 |
| [Kubernetese] Nginx 파드(Pod) 생성하고 포트 포워딩(port forwarding)하기 (0) | 2025.12.31 |