본문 바로가기
개발/DevOps

Docker docs 따라하기 - 4. bind mount를 사용하기

by ny0011 2021. 2. 9.
반응형

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

 

Use bind mounts

 

docs.docker.com

ny0011.tistory.com/106 에서 named volume을 썼음.

-> 간단하게 데이터를 저장할 때 좋은 것. 데이터가 로컬 pc에 어디에 저장돼도 상관 없을 때 사용함.

 

0. bind mount를 사용하면 로컬 pc에 어느 위치에 mount 할 지 지정할 수 있음.

-> 보통 bind mount는 container에게 추가 데이터를 제공할 때 사용함.

app을 띄울 때, 소스 코드가 있는 곳을 mount하는 데 사용함. 그래서 코드가 바뀌면 바로 적용되도록 함.

 

node-base app에서는 nodemon을 사용함(파일 변경되면 app 재시작해줌)

 

대강 volume type을 비교해봄

- volume driver 지원은 저장공간을 SFTP, Ceph, NetApp, S3 등으로 지정할 때 해당되는 얘기인듯❓

이번에 프로젝트 하면서 NetApp을 알게됐는데 다른 것도 있구만

  named volume bind mount
로컬 PC에서 폴더 위치 docker가 알아서 고름 유저가 고름
mount example(-v 옵션 사용할 때) my-volume:/usr/local/data /path/to/data:/usr/local/data
새 volume을 container와 함께 배포 가능? ㅇㅇ ㄴㄴ
volume driver 지원? ㅇㅇ ㄴㄴ

 

1. dev-mode container를 시작해보자

개발에 지원하기 위한 container를 실행하기 위해선 다음과 같은 절차가 있을 것임

- container에 소스코드를 mount 하기

- 모든 관련된 패키지들을 install 하기("dev" dependency 포함)

- nodemon을 실행해서 파일이 변경되었는 지 검사

 

요 절차대로 한번 해보장

1) 모든 getting-started container를 지우고 시작하자

$ sudo docker container rm -f 1badc8fb656c
1badc8fb656c

2) 새 container를 띄우자

$ pwd
.
├── Dockerfile
├── node_modules
├── package.json
├── spec
├── src
└── yarn.lock


$ sudo docker run -dp 3000:3000 \
     -w /app -v "$(pwd):/app" \
     node:12-alpine \
     sh -c "yarn install && yarn run dev"

-w /app : working directory나 현재 폴더를 보도록 지정. container에서 command(sh -c) 가 실행되는 위치

-v "$(pwd):/app" : container의 /app 디렉토리와 로컬PC의 현재 디렉토리(./app 안) 를 bind mount

node:12-alpine : 사용하는 image 이름

sh -c "yarn install && yarn run dev" : container의 sh을 사용해서 "" 안에 있는 명령어를 실행

 

3) container에서 어떤 일이 일어났는지 docker logs -f로 확인 가능

종료는 ctrl+c로 한당

$ sudo docker logs -f 171043ef0bf810
yarn install v1.22.5
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.9: The platform "linux" is incompatible with this module.
info "fsevents@1.2.9" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 12.28s.
yarn run v1.22.5
$ nodemon src/index.js
[nodemon] 1.19.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

 

4) ./src/static/js/app.js 파일을 다음과 같이 수정한다

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

http://localhost:3000 을 새로고침하면 버튼이 Add Item에서 Add로 바로 바뀐걸 볼 수 있다!!

오와우아앙

내가 코드를 수정하면 바로 반영이 되어 확인할 수 있구만~

 

5) 코드를 변경해서 기존 image에 덮어씌우려면 docker build를 사용한다

$ sudo docker build -t getting-started .
Sending build context to Docker daemon   65.3MB
Step 1/5 : FROM node:12-alpine
 ---> 0206ff8a5f9e
Step 2/5 : WORKDIR /app
 ---> Using cache
 ---> 37d127849726
Step 3/5 : COPY . .
 ---> f1ee0190588d
Step 4/5 : RUN yarn install --production
 ---> Running in 09372d3fab9a
yarn install v1.22.5
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.9: The platform "linux" is incompatible with this module.
info "fsevents@1.2.9" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 6.63s.
Removing intermediate container 09372d3fab9a
 ---> bc16dbb25dcb
Step 5/5 : CMD ["node", "src/index.js"]
 ---> Running in 76cd0b921b07
Removing intermediate container 76cd0b921b07
 ---> 88fa5845a71f
Successfully built 88fa5845a71f
Successfully tagged getting-started:latest

 

이렇게 image에 변경된 내용이 적용된다

$ sudo docker images
REPOSITORY                  TAG         IMAGE ID       CREATED          SIZE
getting-started             latest      88fa5845a71f   15 seconds ago   231MB

댓글