목차
개요
도커 공식홈페이지에서 지원해주는 get_started Tutorial 파일을 가지고 도커를 다뤄보자!
본 포스팅은 아래의 도커 공홈에서 지원해주는 튜토리얼을 토대로 포스팅하였음
https://docs.docker.com/get-started/
Volume mount 와 다른 점
Bind mount 는 호스트 내에 있는 파일 시스템을 컨테이너에 공유하는 시스템으로 컨테이너 내의 어플리케이션 실행에 필요한 소스 코드들을 실시간으로 수정하여 저장하게 되면 프로세스가 변화한 소스코드에 반응하여 변경되어 실행된다.
임의의 파일 추가 삭제를 통해 Bind mount 방식을 알아보자
1. getting-start 앱 내에 /app 폴더의 로컬 경로를 찾는다
나의 경우에는 이곳에 설치가 되어있었다. /root/Github/getting-started/app
*getting-start 앱은 도커 공식 홈페이지에서 지원해주는 튜토리얼을 위한 프로젝트이다. 아래에서 확인해보자
2023.01.16 - [Docker] - 튜토리얼(1) Dockerfile 생성, 컨테이너 이미지 만들기
2. bind-mount 옵션을 이용하여 도커를 실행한다.
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
위에서 구한 app 로컬 경로가 src = 옵션의 $(pwd) 에 들어간다 target 옵션에는 도커 파일을 실행하는 앱의 소스 위치가 들어가야한다.
이후에 도커 컨테이너 내의 우분투가 bash CLI 형태로 보여질텐데 pwd , ls 등으로 작동을 확인해본다.
3. src 폴더 내로 들어가서 로컬의 /app 폴더 내에 있던 것들이 존재하는지 확인한다.
4. src/ 폴더 내에 myfile.txt 파일을 생성하여준다.
touch myfile.txt
당연하지만 로컬에서도 이를 확인 할 수 있다.
5. myfile 을 로컬에서 삭제한 후에 도커에서도 지워졌는지 확인해본다.
성공적으로 연동이 된 것을 확인 할 수 있었다.
Bind mounts를 getting-start 의 Todo 에 적용하기
1. Bind mount 를 진행할 해당 컨테이너를 멈추고 제거한다.
docker rm -f <container-id>
2. getting-start/app 폴더 위에서 아래 명령어를 실행한다.
docker run -dp 3000:3000 \
-w /app --mount type=bind,src="$(pwd)",target=/app \
node:18-alpine \
sh -c "yarn install && yarn run dev"
app 로컬 경로가 src = 옵션의 $(pwd) 에 들어간다 target 옵션에는 도커 파일을 실행하는 앱의 소스 위치가 들어가야한다.
위의 명령어를 분석하여 보면
- -dp 3000:3000 작동할 포트를 맵핑해준다.
- -w /app 해당 명령어가 작동할 디렉토리를 설정하여준다.
- --mount type=bind 바인드 마운트를 진행한다.
- src="$(pwd)" 호스트의 해당 디렉토리에서 소스를 가져온다
- target=/app 가져올 최종 디렉토리
- node:18-alpine 실행을 하는 이미지 선정
- sh -c "yarn install && yarn run dev" 각각 패키지 설치와 서버를 실행하는 명령어이다.
- (추가로 패키지는 package.json을 참고하고 dev 스크립트는 nodemon을 실행한다.)
3. docker log 명령어를 이용해서 서버 실행 로그도 볼 수 있다.
docker logs -f <container-id>
ctrl + c 로 로그 출력을 종료할 수 있다.
4. Bind mount 가 잘되었는지 확인하기 위해서 소스코드를 고쳐보자
로컬의 src/static/js/app.js의 출력 텍스트 를 조금 고쳐보자
- {submitting ? 'Adding...' : 'Add Item'}
+ {submitting ? 'Adding...' : 'Add'}
http://localhost:3000/에 가서 전 후 변화를 살펴보게 된다면
상당히 딜레이 없이 변경이 되는 것을 확인 해볼수 있었다.
마무리
다음 포스팅에서는 기존에 지원해주는 SQLite 뿐만아니라 MySQL을 적용해보고 컨테이너 간의 데이터 교환에 대해서도 알아보자
'Docker' 카테고리의 다른 글
도커로 MySQL 설치하고 접속하기, MySQLWorkBench로 관리 (0) | 2023.04.05 |
---|---|
튜토리얼(6) 멀티 컨테이너(Multi container apps) (0) | 2023.01.22 |
튜토리얼(4) 볼륨 마운트(Volume mount)로 Persist DB관리 (0) | 2023.01.21 |
튜토리얼(3) Docker Hub를 통해서 이미지 배포, 다른 환경에서 실행 (0) | 2023.01.19 |
튜토리얼(2) 도커 이미지 업데이트, 도커 배포 삭제 (0) | 2023.01.17 |