Docker Volumes 완전 해석 — ./html:/usr/share/nginx/html


도커 컴포즈 파일을 보면 이런 구문이 꼭 있죠 👇

volumes:
  - ./html:/usr/share/nginx/html
  - ./images:/usr/share/nginx/images

이게 도대체 무슨 뜻일까요?
설치도 했고, 서버도 돌아가는데…

Docker Volumes 안에 뭐가있는거야?

“이 ./html 이건 내 컴퓨터야? 컨테이너 안이야?”
“수정하면 반영되는데, 어떻게 이어져 있는 거지?”

이제 그 의문을 완전히 풀어보겠습니다 🔍

 Docker 볼륨의 특징

🧠 한 줄로 요약하면

“내 컴퓨터의 특정 폴더를 컨테이너 안의 특정 위치와 실시간으로 연결(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/imagesimages 폴더를 컨테이너 내부 /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/htmlBind 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: 구문을 보면

“아, 내 폴더가 컨테이너 내부 어디랑 연결돼 있구나.”
하고 바로 이해하실 수 있을 거예요.

이 구조를 이해하면
도커가 “로컬과 컨테이너를 잇는 다리”처럼 작동한다는 걸 완전히 체감하게 됩니다.