코딩과로그

도커) 6. 'bind mounts' 사용하기 (가이드 실행 결과) <Use bind mounts> 본문

Docker

도커) 6. 'bind mounts' 사용하기 (가이드 실행 결과) <Use bind mounts>

피리음 2023. 3. 17. 08:44
아래의 도커 가이드를 따라한 뒤 참고할만한 내용을 남겼습니다.
https://docs.docker.com/get-started/06_bind_mounts/

bind mounts 는 Named volumes 과는 또 다른 마운트이다.

이를 통해 컨테이너는 실제 호스트 파일 시스템상의 폴더를 호스트 머신과 공유할 수 있다.

 

 Named volumes 과 Bind mounts 의 차이점

  Named volumes Bind mounts
볼륨 위치 도커가 정함 사용자가 정함
마운트 방법 (using --mount) type=volume,src=my-volume,target=/usr/local/data type=bind,src=/path/to/data,target=/usr/local/data
Populates new volume with container contents
=> 뭘 의미하는 지 아직 모름.
가능 불가능
볼륨 드라이버 지원
=> 드라이버로 뭐가 가능한건 지 아직 모르겠음
지원 미지원

 

아래와 같이 가이드를 따라 실행해본 결과, 컨테이너에서의 변경사항이 호스트에 반영된 것을 확인할 수 있었다.

# 현재, 호스트 터미널의 파일들 확인
~/test/getting-started/app master
❯ ls
package.json  spec  src  yarn.lock

# 컨테이너의 터미널로 접속함.
  # 이 때 src 폴더를 마운트하였음. => (target=/src)
~/test/getting-started/app master
❯ docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash

root@8ebf5aa922d7:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   src  sys  usr
boot  etc  lib   lib64  media   opt  root  sbin  srv  tmp  var

# 마운트한 src 폴더에 들어감
root@8ebf5aa922d7:/# cd src

root@8ebf5aa922d7:/src# ls
package.json  spec  src  yarn.lock

# 파일을 생성함
root@8ebf5aa922d7:/src# touch myfile.txt

# 컨테이너 터미널에서 나옴.
root@8ebf5aa922d7:/src# exit
exit

# 컨테이너에서 만들었던 파일(myfile.txt)가 존재하는 것을 확인했다.
~/test/getting-started/app master
❯ ls
myfile.txt  package.json  spec  src  yarn.lock

실행 결과 스크린샷

이제 바인드 마운트를 통해서 이전 블로그에서 실습했던 to-do 앱을 다시 실행시켜보았습니다.

 

# todo-app을 실행시킴.
  # 이 때 nodemon이라는 실행기를 통해서 to-do 앱을 실행시켰는데 nodemon은 자신이 다루는 소스코드가 바뀌면 프로그램을 재시작한다.
~/test/getting-started/app master
❯ docker run -dp 3000:3000 \
    -w /app --mount type=bind,src="$(pwd)",target=/app \
    node:18-alpine \
    sh -c "yarn install && yarn run dev"
Unable to find image 'node:18-alpine' locally
18-alpine: Pulling from library/node
63b65145d645: Already exists 
f41005eb563c: Already exists 
69dcb013f10f: Already exists 
00a00d315650: Already exists 
Digest: sha256:ffc770cdc09c9e83cccd99d663bb6ed56cfaa1bab94baf1b12b626aebeca9c10
Status: Downloaded newer image for node:18-alpine
335af3420b661a5b0c5fdca127aeccd733c910571180849e1d8587dfd28f8ee4

# 소스코드를 바꿔보았다.

# 컨테이너의 로그를 확인해보았다.
❯ docker logs -f 33
yarn install v1.22.19
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 7.90s.
yarn run v1.22.19
$ nodemon 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

# 소스코드가 변경되어서 프로그램이 재시작된 것을 확인할 수 있었다.
[nodemon] restarting due to changes...
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

 

바인드 마운트는 로컬 개발환경에서 흔하게 사용된다고 하며, 이 환경의 장점은 모든 빌드 툴을 호스트 머신에 다 설치되어 있을 필요가 없다는 점이다.

docker run  이라는 명령어 하나로 모든 개발 의존 환경이 준비가 된다.  추후에 Docker Compose 가이드에서 더 자세히 알아볼 예정. 바인드 마운트를 하면 자신이 공유하기 원하는 폴더에서 소스작업을 하면서도 도커 컨테이너의 결과값을 실시간으로 볼 수 있다는 점이 장점이다.