본문 바로가기
Development/Docker

도커 기초 가이드 - Docker Basic Guide (4)

by Barcy 2024. 8. 22.

Docker Compose를 활용해 여러 컨테이너를 관리할 때, 바인드 마운트(Bind Mount)를 사용하면 호스트 시스템의 파일을 컨테이너에 연결하여 효율적으로 개발 환경을 구축할 수 있습니다. 이번 글에서는 Docker Compose에서 바인드 마운트를 설정하는 방법을 다루고, 그 과정에서 발생할 수 있는 문제와 해결책을 함께 살펴보겠습니다.

 

1. 바인드 마운트란?

바인드 마운트(Bind Mount)는 호스트 시스템의 특정 디렉토리나 파일을 컨테이너 내부의 디렉토리와 직접 연결하는 방법입니다. 이 방식은 특히 개발 환경에서 유용한데, 호스트 시스템에서 파일을 수정하면 컨테이너 내부에서도 실시간으로 그 변화를 반영할 수 있기 때문입니다.

 

2. Compose 파일에서 바인드 마운트 추가하기

Docker Compose 파일(compose.yaml)에서 바인드 마운트를 추가하려면 주석 처리된 부분을 언주석(uncomment)하여 활성화하면 됩니다. 다음은 예시입니다:

git clone [https://github.com/docker/bindmount-apps](https://github.com/docker/bindmount-apps)

먼저 repository를 클론해줍니다.

todo-app:  
    # ...  
    volumes:  
      - ./app:/usr/src/app  
      - /usr/src/app/node_modules

위의 예에서 volumes 설정을 활성화하여, 호스트 시스템의 ./app 디렉토리를 컨테이너 내부의 /usr/src/app 디렉토리로 마운트합니다. 이 바인드 마운트를 통해 호스트에서 작업한 파일 변경 사항이 컨테이너 내에 즉시 반영됩니다.

docker compose up -d

compose파일을 실행시켜줍니다.

 

2.1 바인드 마운트의 역할

첫 번째 바인드 마운트 (./app:/usr/src/app):

호스트의 ./app 디렉토리를 컨테이너의 /usr/src/app 디렉토리와 연결합니다. 이 설정은 개발 환경에서 매우 유용합니다. 예를 들어, 코드베이스가 호스트에서 변경될 때, 컨테이너 내에서도 즉시 업데이트되어 테스트할 수 있습니다.

두 번째 바인드 마운트 (/usr/src/app/node_modules):

• 이 설정은 컨테이너의 node_modules 디렉토리를 덮어쓰지 않도록 보호합니다. 바인드 마운트는 호스트 디렉토리의 내용을 컨테이너 내에 그대로 반영하기 때문에, 호스트의 node_modules가 없거나 다를 경우, 컨테이너 내의 패키지들이 손상될 수 있습니다. 이 설정을 통해 패키지들을 안전하게 보존할 수 있습니다.

 

 

3. 더 깊이 들여다보기

3.1 바인드 마운트가 어떻게 작동하는가?

바인드 마운트는 호스트 파일 시스템과 컨테이너 파일 시스템 간의 실시간 동기화를 제공합니다. 이는 특히 개발 중에 코드를 작성하거나 수정할 때 변경 사항을 컨테이너 내에서 즉시 확인할 수 있는 환경을 만듭니다. 이러한 설정은 개발 컨테이너를 구축할 때 주로 사용됩니다.

예를 들어, todo-app 서비스의 경우 호스트에서 ./app 폴더에 코드를 수정하면, 컨테이너 내의 /usr/src/app에 즉시 반영됩니다. 이는 수동으로 컨테이너를 다시 빌드하거나 재시작하지 않고도 즉각적인 피드백을 받을 수 있다는 점에서 개발자에게 매우 유용합니다.

3.2 node_modules 예외 처리

바인드 마운트를 사용할 때는 컨테이너 내의 node_modules 디렉토리가 호스트의 빈 node_modules 폴더로 덮어쓰여 npm 패키지들이 손상될 수 있습니다. 이를 방지하기 위해 compose.yaml 파일에서 /usr/src/app/node_modules를 명시하여, 이 디렉토리는 바인드 마운트의 영향을 받지 않도록 설정합니다.