능글맞은 구렁이

Docker - Volumes 실습[바운드 마운트 생성] 본문

DevOps/Docker

Docker - Volumes 실습[바운드 마운트 생성]

보라색츄르 2026. 3. 1. 18:09

1. 바운드 마운트를 사용하는 이유는?

  • 개발할 때 코드 실시간 반영
    • 내 로컬 코드 수정
    • 컨테이너 안에서도 바로 반영
    • 서버 재빌드 없이 핫리로드 가능
  • 데이터 영속성 확보
    • 컨테이너는 기본적으로 휘발성이다. 
    • 하지만, 바인드 마운트를 쓰면 DB 데이터, 업로드 파일 등을 보존할 수 있다.
  • 설정 파일 외부관리
    • 컨테이너 이미지 수정없이 설정만 교체 가능하다.
  • 로그 파일 수집
    • 로그 모니터링 시스템과 연동 가능

 

3. 실습

FROM node:20-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
CMD ["npm", "start"]

 

  • 이미지 빌드 (docker build -t feedback-node:voluems .)
  • docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback -v C:\workspace\DOCKER\data-volumes-01-starting-setup:/app -v /app/node_modules feedback-node:volumes
    • -d : 백그라운드 실행
    • -p 3000:80 : 포트 매핑 호스트머신포트(외부):컨테이너포트(내부)
    • --rm : 컨테이너 종료 시 컨테이너 자동 삭제
    • --name feedback-app : 컨테이너 명
    • -v feedback:/app/feedback :  볼륨명:컨테이너경로
    • -v C:\workspace\DOCKER\data-volumes-01-starting-setup:/app : 호스트경로:컨테이너경로
    • -v /app/node_modules : 외부 라이브러리들이 실제로 저장되는 폴더를 별도의 볼륨에 분리
    • feedback-node:volumes : 이미지명:태크

 

🤔 node_modules를 왜 별로의 볼륨으로 분리할까?

  •  현재 docker를 테스트하고 있는 프로젝트가 node 프로젝트이다. 
  • node 프로젝트에서 node_modules는 실행에 필요한 외부 라이브러리들이 저장되는 필수 폴더이다.
  • 컨테이너 실행 시 /app을 바인드 마운트하면 호스트 폴더가 해당 경로로 덮어써 이미지 내부의 node_modules가 보이지 않게 된다.
  • 따라서, node_modules는 별도의 도커 볼륨으로 분리하여 바인드 마운트의 영향을 받지 않도록 보호한다.

 

🤔 바인드 마운트의 데이터를 지우려면?

  • 바인드 마운트는 컨테이너 종료 및 제거 후에도 유지가 된다. 
  • 바인드 마운트의 데이터를 지우려면 실제로 호스트 머신에서 삭제해야한다.

 

🤔바운드 마운트를 하면 Dockerfile의 COPY는 없어도 되지 않을까?

결론부터 말하자면, 개발은 COPY   운영은 COPY

  • 개발환경
    • 호스트 코드가 /app을 전부 덮어씀
    • 이미지에 복사된 코드가 필요없음 
    • 따라서, 개발환경에서는 COPY가 필요없음
  • 운영환경
    • docker run -v.. 는 개발 중에만 쓰이는 방식이다.
    • 왜냐하면 코드 변경을 즉시 반영하고, 실시간 동기화가 목적이기 때문이다.
    • 운영환경에서는 바인드 마운트를 사용하지 않는다. 즉, 호스트 코드 연결을 안한다. 
    • 따라서, 운영환경에선 반드시 필요하다. 
구분 개발 환경 운영환경
바인드 마운트 사용 사용 안함
코드 실시간 반영  
COPY 여부
이미지 역할 베이스 완전한 실행 단위

 

Comments