본문 바로가기
Docker/docs

[Docker] [docs] 06. 바인드 마운트 사용

by NJ94 2023. 12. 5.

https://docs.docker.com/get-started/06_bind_mounts/

 

Use bind mounts

Using bind mounts in our application

docs.docker.com

 

바인드 마운트 

바인드 마운트는 컨테이너와 호스트 시스템 사이의 디렉터리를 공유하여 실시간으로 파일 변경 사항을 반영하는 기능을 제공합니다. 특히, 개발 환경에서 코드 수정 및 테스트를 편리하게 할 수 있도록 도와줍니다.

 

nodemon은 Node.js 애플리케이션 개발을 위한 도구로, 파일 변경을 감지하고 자동으로 서버를 재시작하여 변경 사항을 즉시 반영합니다. 비슷한 기능을 갖춘 다른 언어와 프레임워크에도 유사한 도구들이 있습니다.

바인드 마운트와 nodemon을 함께 사용하면 개발 시 다음과 같은 이점을 얻을 수 있습니다:

 

  1. 실시간 업데이트: 코드 변경 사항을 바로 반영하여 애플리케이션을 재시작할 필요 없이 개발할 수 있습니다.
  2. 효율적인 개발: 수정한 코드를 즉시 확인하고 테스트하여 개발 작업을 더 효율적으로 진행할 수 있습니다.
  3. 개발자 편의성: 코드 변경 사항을 수동으로 감지하고 재시작할 필요 없이 nodemon이 이를 자동화하여 개발자의 작업을 편리하게 합니다.

 

예를 들어, Node.js 애플리케이션을 개발 중인 경우, 바인드 마운트를 통해 로컬 파일 시스템의 디렉터리를 컨테이너 내부에 마운트하고, nodemon을 실행하여 파일 변경을 감지하고 애플리케이션을 자동으로 재시작할 수 있습니다. 이렇게 함으로써 코드 수정이 더욱 신속하게 반영되며, 효율적인 개발 및 테스트를 진행할 수 있습니다.

 
 
 

볼륨과 바인드 마운트 두 가지 유형의 특징과 차이점

 

  1. 볼륨(Volume):
    • 도커가 관리하는 파일 시스템의 영역으로, 도커 엔진에 의해 생성 및 관리됩니다.
    • 호스트 파일 시스템이 아닌 독립적인 공간으로 볼륨을 생성하여 컨테이너 간에 데이터를 공유하거나 영속적인 데이터를 저장할 수 있습니다.
    • 도커 볼륨은 여러 컨테이너에서 공유하거나 데이터를 보관하는데 사용됩니다.
    • 호스트 시스템의 파일 시스템과는 별도로 도커 엔진에서 관리되기 때문에 운영체제 또는 파일 시스템의 종속성을 줄일 수 있습니다.
  2. 바인드 마운트(Bind Mount):
    • 호스트 시스템의 파일이나 디렉터리를 컨테이너 내부로 직접 마운트합니다.
    • 호스트의 특정 경로를 컨테이너 내부 경로에 연결하여 파일이나 디렉터리를 공유합니다.
    • 호스트 파일 시스템의 특정 경로를 컨테이너 내부 경로에 바인드하여 파일 시스템 변경 사항을 실시간으로 반영할 수 있습니다.
    • 개발 환경에서 코드 수정 및 테스트 등을 용이하게 하기 위해 주로 사용됩니다.

 

주요 차이점:

  • 관리: 볼륨은 도커 엔진에 의해 관리되고, 바인드 마운트는 호스트 시스템의 파일이나 디렉터리를 직접 사용합니다.
  • 영속성: 볼륨은 도커가 관리하기 때문에 컨테이너가 삭제되어도 데이터가 보존됩니다. 반면 바인드 마운트는 호스트 시스템에 의존하기 때문에 호스트의 파일이나 디렉터리를 기반으로 하므로 데이터는 호스트에 영향을 받습니다.
  • 용도: 볼륨은 도커 간 데이터 공유 또는 영속적인 데이터 저장에 사용되며, 바인드 마운트는 개발 환경에서의 코드 수정 및 테스트 등에 주로 사용됩니다.

 

어떤 유형을 선택할지는 상황에 따라 다를 수 있으며, 데이터의 영속성, 관리 방식, 그리고 사용 목적에 따라 적절한 유형을 선택하는 것이 중요합니다.

 

 

바인드 마운트 테스트

빠른 실험을 실행하여 마운트가 동작하는 방식을 실제로 이해하기.

 

 

1. getting-started-app 진입

 

2. 아래의 명령어 입력

$ docker run -it --mount "type=bind,src=$pwd,target=/src" ubuntu bash

 

 --mount옵션은 Docker에게 바인드 마운트를 생성하도록 지시합니다. 여기서는 src호스트 시스템의 현재 작업 디렉터리( getting-started-app)이고 target해당 디렉터리가 컨테이너 내부에 표시되어야 하는 위치( /src)입니다.

 

4. 명령어 실행한 후 Docker는 bash 컨테이너 파일 시스템의 루트 디렉터리 대화형 세션을 시작한다

root@ac1237fad8db:/# pwd
/
root@ac1237fad8db:/# ls
bin   dev  home  media  opt   root  sbin  srv  tmp  var
boot  etc  lib   mnt    proc  run   src   sys  usr

 

5. src 디렉토리로 변경  (ls 명령어 입력 시, getting-started-app 디렉터리의 내용과 같다)

root@ac1237fad8db:/# cd src
root@ac1237fad8db:/src# ls
Dockerfile  node_modules  package.json  spec  src  yarn.lock

 

6. myfile.txt 라는 이름의 새 파일 생성

root@ac1237fad8db:/src# touch myfile.txt
root@ac1237fad8db:/src# ls
Dockerfile  myfile.txt  node_modules  package.json  spec  src  yarn.lock

 

7. getting-started-app 호스트에서 디렉터리를 열고 myfile.txt 파일이 디렉터리에 있는지 확인한다

 

로컬 - getting-started-app 디렉터리

 

8. 호스트에서 myfile.txt 파일 을 삭제한다

9. 컨테이너에서 app 디렉터리의 내용을 다시 한 번 나열한다. 이제 파일이 사라진것을 확인 가능하다

10. 대화형 컨테이너 세션을 중지한다.

 

 

개발 컨테이너

바인드 마운트를 사용하여 개발 환경을 구성하는 방법

 

  1. 소스 코드를 컨테이너에 마운트:
    • 개발 환경에서는 로컬 머신의 소스 코드를 도커 컨테이너 내에 마운트하여 수정된 코드를 실시간으로 반영할 수 있습니다.
    • 이를 위해 도커 실행 명령에서 -v 옵션을 사용하여 호스트 머신의 디렉터리를 컨테이너 내 경로에 연결합니다.
    • 예를 들어, docker run 명령어에 -v /로컬/경로:/컨테이너/경로를 추가하여 호스트의 소스 코드를 컨테이너 내의 특정 경로에 마운트할 수 있습니다.
  2. 모든 종속성 설치:
    • 개발 환경에 필요한 모든 종속성 및 라이브러리를 도커 이미지 내에 설치합니다.
    • 이를 위해 Dockerfile을 사용하여 도커 이미지를 빌드할 때 필요한 패키지, 라이브러리, 의존성을 정의하고 설치합니다.
  3. nodemon 파일 시스템 변경 사항 감시 시작:
    • nodemon은 파일 시스템의 변경 사항을 감지하고 자동으로 애플리케이션을 다시 시작하는 도구입니다.
    • 도커 컨테이너 내에서 nodemon을 실행하여 파일 시스템을 감시하고 코드 변경이 있을 때 앱을 자동으로 재시작하도록 설정합니다.

 

 

개발 컨테이너에서 앱 실행

 

1. 현재 실행중인 컨테이너가 없는지 확인

 

2. getting-started-app 디렉터리에 접근해서 아래의 명령어 입력

docker run -dp 127.0.0.1:3000:3000 `
    -w /app --mount "type=bind,src=$pwd,target=/app" `
    node:18-alpine `
    sh -c "yarn install && yarn run dev"
  • -dp 127.0.0.1:3000:3000- 이전과 같습니다. 분리(백그라운드) 모드로 실행하고 포트 매핑 생성
  • -w /app- "작업 디렉터리" 또는 명령이 실행될 현재 디렉터리를 설정합니다.
  • --mount "type=bind,src=$pwd,target=/app"- 호스트의 현재 디렉터리를 /app컨테이너의 디렉터리 에 바인드 마운트합니다.
  • node:18-alpine- 사용할 이미지. 이는 Dockerfile의 앱 기본 이미지입니다.
  • sh -c "yarn install && yarn run dev"- 명령. sh(alpine에는 없음 ) 을 사용하여 셸을 시작 bash하고 실행하여 yarn install패키지를 설치한 다음 실행하여 yarn run dev개발 서버를 시작합니다. 를 보면 스크립트가 시작되는 package.json것을 볼 수 있습니다 .devnodemon

 

3.아래의 명령어를 사용해서 로그를 볼 수 있다.

docker logs -f <container-id>
nodemon -L src/index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

 

4. 로그 확인이 끝나면 종료

 

 

개발 컨테이너를 사용하여 앱 개발

1. 파일의 src/static/js/app.js 109행에서 "항목 추가" 버튼을 추가로 간단히 변경

- {submitting ? 'Adding...' : 'Add Item'}
+ {submitting ? 'Adding...' : 'Add'}

변경한 파일을 저장한다.

 

2. 웹 브라우저에서 페이지를 새로 고치면 바인드 마운트로 인해 변경 사항이 거의 즉시 반영되는 것을 볼 수 있습니다. Nodemon은 변경 사항을 감지하고 서버를 다시 시작합니다. 노드 서버를 다시 시작하는 데 몇 초 정도 걸릴 수 있습니다. 오류가 발생하면 몇 초 후에 새로고침해 보세요.

 

3. 다른 변경사항을 자유롭게 적용하세요. 파일을 변경하고 저장할 때마다 바인드 마운트로 인해 변경 사항이 컨테이너에 반영됩니다. Nodemon은 변경 사항을 감지하면 컨테이너 내부의 앱을 자동으로 다시 시작합니다. 완료되면 컨테이너를 중지하고 다음을 사용하여 새 이미지를 빌드합니다.

 

$ docker build -t getting-started .