Docker Volumes 완전 해석 — ./html:/usr/share/nginx/html
도커 컴포즈 파일을 보면 이런 구문이 꼭 있죠 👇
목차
volumes:
- ./html:/usr/share/nginx/html
- ./images:/usr/share/nginx/images
이게 도대체 무슨 뜻일까요?
설치도 했고, 서버도 돌아가는데…
Docker Volumes 안에 뭐가있는거야?
“이
./html이건 내 컴퓨터야? 컨테이너 안이야?”
“수정하면 반영되는데, 어떻게 이어져 있는 거지?”
이제 그 의문을 완전히 풀어보겠습니다 🔍

🧠 한 줄로 요약하면
“내 컴퓨터의 특정 폴더를 컨테이너 안의 특정 위치와 실시간으로 연결(Mount) 하라.”
즉,
- 왼쪽(
./html) → 내 컴퓨터(Host) - 오른쪽(
/usr/share/nginx/html) → 컨테이너 내부
이 둘을 연결해두면,
로컬에서 HTML을 수정해도 컨테이너가 즉시 반영합니다.
구조적으로 보면 이렇게 돼요
[ 내 컴퓨터 ] [ 컨테이너 내부 ]
D:\projects\mysite\html\index.html → /usr/share/nginx/html/index.html
D:\projects\mysite\images\logo.png → /usr/share/nginx/images/logo.png
이 연결통로가 바로 volumes의 역할입니다.
각 구문 완전 분석
| 구문 | 설명 |
|---|---|
- | YAML 리스트 항목 |
./html | 내 PC의 현재 폴더(Compose 기준) 안의 html 폴더 |
/usr/share/nginx/html | 컨테이너 안에서 Nginx가 HTML 파일을 읽는 기본 루트 |
: | “왼쪽과 오른쪽을 연결한다”는 의미 |
./images:/usr/share/nginx/images | 내 images 폴더를 컨테이너 내부 /usr/share/nginx/images에 연결 |
그래서 이런 효과가 생깁니다
1. 수정 즉시 반영
내 컴퓨터에서 index.html 수정 → 컨테이너 즉시 갱신.
(빌드 없이 바로 반영)
2. 컨테이너 삭제해도 파일 유지
컨테이너는 없어져도 내 PC(./html)에는 파일이 남아 있음.
즉, 데이터가 안전함.
3. 로컬에서 버전 관리 가능
Git으로 HTML, 이미지 등 코드를 직접 관리 가능.
실제 실습 예시
폴더 구조
mysite/
├── docker-compose.yml
├── html/
│ └── index.html
└── images/
└── logo.png
📄 docker-compose.yml
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
- ./images:/usr/share/nginx/images
📄 html/index.html
<!DOCTYPE html>
<html>
<body>
<h1>Hello from Docker!</h1>
<img src="/images/logo.png" width="200">
</body>
</html>
📄 images/logo.png → 아무 로고 이미지 저장
▶ 실행
docker-compose up -d
브라우저에서
http://localhost:8080 접속하면
내 로컬의 HTML + 이미지가 컨테이너에서 바로 제공됩니다.
내부 연결 구조 시각화
───────────────────────────────────────────────
│ 내 로컬 PC (Host) │
│ D:\projects\mysite\html\index.html │
│ D:\projects\mysite\images\logo.png │
───────────────────────────────────────────────
│ (볼륨 마운트: volumes)
▼
───────────────────────────────────────────────
│ 컨테이너 (Container) │
│ /usr/share/nginx/html/index.html │
│ /usr/share/nginx/images/logo.png │
│ → Nginx가 이 경로를 웹 루트로 사용 │
───────────────────────────────────────────────
참고: Volumes의 3가지 종류
| 타입 | 설명 | 특징 |
|---|---|---|
| Bind Mount | 호스트 폴더를 직접 연결 (./html:/usr/...) | 가장 흔한 개발용 방식 |
| Named Volume | 도커가 내부적으로 이름을 붙여 저장 | /var/lib/docker/volumes/... 경로에 저장 |
| Anonymous Volume | 이름 없이 자동 생성되는 임시 저장공간 | 컨테이너 삭제 시 함께 삭제됨 |
./html:/usr/share/nginx/html 는 Bind Mount 입니다 —
즉, 내 PC와 컨테이너가 폴더를 직접 공유하는 형태입니다.
확인 명령어
docker inspect nginx-web | grep Mounts -A 10
결과 예시 👇
"Mounts": [
{
"Type": "bind",
"Source": "D:\\projects\\mysite\\html",
"Destination": "/usr/share/nginx/html"
}
]
여기서 Source가 내 로컬 경로입니다.
자주 하는 실수
| 실수 | 결과 |
|---|---|
./html 폴더가 없는데 실행함 | 도커가 빈 폴더를 새로 만들어버림 |
절대경로(/Users/...)로 작성 | 이식성이 떨어짐 (다른 환경에서 오류) |
| 컨테이너 내부에서 직접 수정 | 로컬 파일과 동기화 깨짐 |
항상 ./폴더명 형태로 프로젝트 폴더 기준 경로를 쓰세요.
요약 정리
| 항목 | 설명 |
|---|---|
./html:/usr/share/nginx/html | 내 로컬 폴더와 컨테이너 내부 경로를 연결 |
| Bind Mount | 실시간 반영 + 로컬에 파일 유지 |
| 장점 | 수정 즉시 반영, 백업 불필요, 버전 관리 가능 |
| 확인 방법 | docker inspect 컨테이너이름 |
| 주의 | 컨테이너 내부에서 파일 직접 수정 금지 |
마무리
이제 volumes: 구문을 보면
“아, 내 폴더가 컨테이너 내부 어디랑 연결돼 있구나.”
하고 바로 이해하실 수 있을 거예요.
이 구조를 이해하면
도커가 “로컬과 컨테이너를 잇는 다리”처럼 작동한다는 걸 완전히 체감하게 됩니다.