SW/Kubernetes, Docker

Docker에서 read-only mount 설정하는 이유와 실전 적용 팁

얇은생각 2025. 9. 6. 07:30
반응형

Docker Volumes, 진짜 써보니까 이런 느낌이에요

처음 Docker 시작했을 때, volume이 뭐냐고요? 저도 뭔가 파일이 저장되긴 한다는데 그게 도대체 어디에 저장되는지도 모르겠고, 뭘 설정해야 할지도 막막했어요. 근데 한 번 실무에서 제대로 써보고 나니까 아~ 이래서 사람들이 volume, volume 하는구나 싶더라고요.

오늘은 제가 직접 써보면서 느낀 내용을 바탕으로, 너무 어렵지 않게 volume 이야기를 풀어볼게요. read-only mount가 왜 필요한지, 익명 볼륨이 어떻게 작동하는지, 컨테이너가 내 파일을 어떻게 망칠 수 있는지도 얘기해볼게요.

자, 그럼 중요한 얘기부터 들어가 봅시다: read-only bind mount!

 


 

왜 굳이 read-only로 만들어요?

 

왜 굳이 read-only로 만들어요?

제가 한창 feedback 앱을 Docker로 돌리고 있을 때였어요. 매번 docker run으로 실행하고, 그 앱은 의존성도 많고 여러 파일들이 막 생기더라고요. 근데 어느 날, 컨테이너 안에서 내 소스 파일이 바뀌어 있더라고요... 순간 헉! 했죠.

그래서 깨달았어요. 바인드 마운트가 있다고 해도 꼭 다 쓸 수 있게 열어둘 필요는 없다는 걸요. 그냥 읽기만 되게 하면, 적어도 코드가 망가질 일은 없겠구나 싶었죠.

설정은 간단해요:

docker run -v $(pwd):/app:ro my-feedback-app

 

:ro만 붙이면 진짜로 못 건드려요. 이거 하나로 마음이 좀 편해졌습니다.

 


 

근데 앱도 뭔가 저장은 해야 하잖아요

 

근데 앱도 뭔가 저장은 해야 하잖아요

맞아요, 코드만 읽으면 되는 게 아니라, 앱은 뭔가 저장도 해야 하잖아요. Node.js는 예를 들어 로그나 파일을 /app/temp나 /app/feedback 같은 데에 저장하려고 하거든요.

그래서 저는 이 폴더들만 따로 쓰기 가능한 volume으로 설정했어요. Docker는 디렉토리 경로가 더 구체적이면 그걸 우선하니까, 이렇게 하면 메인 코드는 read-only로 두면서 필요한 폴더는 writable하게 만들 수 있어요:

docker run \
  -v $(pwd):/app:ro \
  -v feedback-data:/app/feedback \
  -v /app/temp \
  my-feedback-app

 

이렇게 하고 나니까 앱도 잘 돌아가고, 제 소중한 코드도 안전하고... 한결 마음이 편했죠.

 


 

Bind Mount vs Volume, 뭔 차이냐고요?

딱 정리해드릴게요.

  • Bind mount는 내 컴퓨터에 있는 폴더를 그대로 컨테이너에 연결하는 거예요. 수정하면 바로 반영돼요. 편하지만 위험하죠.
  • Volume은 Docker가 알아서 관리하는 공간이에요. 내 컴퓨터 어딘가엔 있는데 직접 보기 어려워요. 대신 깔끔하게 유지되죠.

 

궁금하면 이거 쳐보세요:

docker volume ls

 

bind mount는 안 보이고, Docker가 직접 관리하는 것만 리스트로 나옵니다.

 


 

Docker는 Volume을 어떻게 다룰까?

 

Docker는 Volume을 어떻게 다룰까?

어떤 volume이 없는데도 docker run 할 때 -v 옵션으로 지정하면요, Docker가 알아서 만들어줘요. 기특하죠?

자세히 알고 싶다면 이 명령어 추천:

docker volume inspect feedback-data

 

여기서 생성 시점이나 저장 경로 같은 것도 볼 수 있어요. 근데 그 경로는 Docker 시스템 안에 있어서 우리가 직접 접근하긴 좀 어려워요. 뭔가 ‘숨어 있는 저장소’ 느낌이에요.

 


 

직접 Volume을 만들어야 하나요?

음, 꼭 그런 건 아닌데요. 저는 가끔 이름 붙여서 관리하고 싶을 때 만들어요:

docker volume create my-volume

 

깔끔하게 이름 붙여놓으면 정리할 때도 좋아요. 안 쓰는 거 정리하고 싶을 땐:

docker volume prune

 

특정한 것만 지우고 싶으면:

docker volume rm my-volume

 

주의! 현재 컨테이너가 쓰고 있는 볼륨은 못 지워요. 그럴 땐 컨테이너부터 종료해야 돼요.

 


 

익명 볼륨은 뭐예요? 이름 없는 친구

가끔 그냥 한 번 쓰고 말 데이터 저장소가 필요할 때가 있잖아요. 그럴 때는 익명 볼륨을 씁니다. --rm 옵션과 같이 쓰면 컨테이너 꺼지면서 같이 사라져요:

docker run --rm -v /app/temp my-app

 

근데 데이터를 계속 보존하고 싶다면? 이름 붙여야죠:

docker run -v feedback-data:/app/feedback my-app

 


 

코드를 안전하게 지키는 작은 습관

진짜 이거 한 번 써보세요. read-only bind mount 설정해두면 코드 날릴 걱정 확 줄어요. 꼭 보안 때문이 아니라, 실수로 수정하는 것도 막아주니까요.

예전에 제가 실수로 index.js 내용 날려서 다시 쓰느라 고생한 기억이 있거든요. 그 이후로는 읽기 전용 mount가 기본 세팅이 됐어요.

반응형