바인드 마운트
바인드 마운트 (Bind mounts)
컨테이너 안에서 만든 파일을 호스트에 그대로 남기고 싶을 때, 그리고 호스트의 소스 코드를 컨테이너에서 바로 읽고 싶을 때가 있죠. 그럴 때 가장 직관적인 방법이 바인드 마운트예요. 호스트 머신의 파일이나 디렉터리를 그대로 컨테이너에 마운트해서, 양쪽에서 같은 파일을 보게 만드는 방식이에요.
본문
볼륨(volume)은 도커가 관리하는 저장 위치에 새 디렉터리를 만들어 쓰는 방식이에요. 반면 바인드 마운트는 호스트에 이미 있는 파일이나 디렉터리를 컨테이너에 연결해요. 여기서 마운트한다는 건 호스트의 특정 경로를 컨테이너의 특정 경로에 '꽂아서' 양쪽이 같은 내용을 보게 한다는 뜻이에요. 컨테이너가 지워져도 호스트에 있는 원본은 그대로 남아 있어요.
바인드 마운트는 언제 쓸까
- Docker 호스트의 개발 환경과 컨테이너 사이에서 소스 코드나 빌드 산출물을 공유할 때.
- 컨테이너 안에서 파일을 생성하고 그 결과를 호스트 파일시스템에 영속화하고 싶을 때.
- 호스트의 설정 파일을 컨테이너에 공유할 때 (컨테이너마다 설정 파일을 이미지에 복사해 넣는 대신, 호스트의 같은 설정 파일을 여러 컨테이너가 함께 쓰는 방식).
바인드 마운트는 빌드에서도 쓸 수 있어요. 호스트의 소스 코드를 빌드 컨테이너에 마운트해서 테스트·린트·컴파일을 할 수 있답니다.
바인드 마운트로 컨테이너 시작하기
source 디렉터리에서 소스를 빌드하면 산출물이 source/target/에 저장된다고 가정해 볼게요. 이 산출물을 컨테이너의 /app/에서 쓰고, 개발 호스트에서 빌드할 때마다 컨테이너가 새 빌드 결과를 바로 보게 하고 싶다면 이렇게 해요. source 디렉터리에서 아래 명령을 실행하면 target/ 디렉터리를 컨테이너의 /app/에 마운트해요.
$ docker run -v $(pwd)/target:/app nginx:latest
비어 있지 않은 컨테이너 디렉터리에 마운트하기
호스트 디렉터리를 컨테이너의 비어 있지 않은 디렉터리에 바인드 마운트하면, 그 디렉터리에 있던 기존 내용물이 마운트에 가려져요. 이건 때로 유용해요. 예를 들어 새 버전의 애플리케이션을 이미지를 새로 만들지 않고 테스트해 보고 싶을 때, 컨테이너 디렉터리를 호스트의 새 파일로 덮어쓰는 식으로 활용할 수 있죠.
바인드 전파(propagation) 설정하기
마운트 지점에서 바인드 전파를 설정하려면 그 전에 호스트 파일시스템이 바인드 전파를 지원해야 해요. 바인드 전파에 대한 자세한 내용은 리눅스 커널 문서의 shared subtree를 참고하면 돼요.
Docker Compose에서 바인드 마운트 쓰기
Docker Compose에서 바인드 마운트를 쓰는 단일 서비스는 이렇게 생겼어요.
services:
frontend:
image: node:lts
volumes:
- type: bind
source: ./static
target: /opt/app/static
volumes:
myapp:
volumes 아래 type: bind로 지정하고 source와 target을 명시하는 게 포인트예요. Compose 파일에 선언된 volumes:(하단의 myapp)은 이름 있는 볼륨을 위한 목록이라 바인드 마운트와는 별개로 관리돼요.
더 알아보기
- 공식 원문: Bind mounts
- 관련: 볼륨으로 데이터 저장하기
- 관련: tmpfs 마운트
- 관련: 스토리지 드라이버