본문 바로가기

STUDY/Docker & Kubernetes: 실전 가이드 -2022년판

8. 도커 데이터 관리3: 볼륨 관리

읽기 전용 볼륨

 

> docker run --name feedback-app -p 3000:80 --rm -v ${pwd}:/app:ro -v /app/node_modules -v feedback:/app/feedback -v /app/temp feedback-app

개발상의 편의를 위해 컨테이너와 호스트를 바인드 마운트로 연결할 수 있다. 호스트에서 소스를 편집한 내용이 컨테이너에 바로 반영되므로 개발 속도가 빨라진다. 이 경우에 호스트의 변경내용만 컨테이너로 전달되면 충분하다. 반대로 컨테이너에서 소스가 수정되어 호스트에 반영되는것은 문제가 될 수 있다. 이때 사용할 수 있는게 읽기전용 볼륨이다. -v로 정의한 볼륨 뒤에 :ro를 붙여주면 된다. 그리고 읽기전용으로 정의된 경로 하위에 컨테이너에서 쓰기작업을 해야할 경로가 있다면 별도의 볼륨을 정의해서 :ro 옵션이 적용되지 않도록 해야한다.

 

 


도커 볼륨 관리하기

 

> docker volume --help
> docker volume ls
> docker volume create --help
> docker volume create {volume_name}
> docker volume ls
> docker volume inspect {volume_name}
> docker volume rm {volume_name}
> docker volume prune

 

지금까지는 도커의 볼륨을 docker run 명령어의 -v 옵션으로만 사용했지만, docker volume 명령어로 볼륨에 대한 다양한 기능을 수행할 수 있다. 먼저 docker volume ls로 현재 생성된 볼륨 리스트를 볼 수 있다. 그 리스트에는 익명 볼륨, 지명된 볼륨이 존재하고 바인드 마운트는 존재하지 않는다. 바인드 마운트는 도커에서 관리하는 볼륨이 아니기 때문이다. 그리고 docker volume create 명령어를 통해 볼륨을 만들 수 있다. docker volume inspect로 볼륨의 생성일자, 옵션 등을 확인할 수 있다. 그리고 docker volume rm, docker volume prune 명령어로 사용하지 않는 볼륨을 제거할 수 있다.

 

 


COPY vs 바인드 마운트

 

FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
CMD [ "npm", "start" ]

dockerfile을 보면 COPY . . 을 통해 모든 소스를 이미지로 복사하는것을 알 수 있다. 그리고 도커 이미지를 실행시킬 때 -v ${pwd}:/app:ro 옵션으로 모든 소스를 컨테이너로 바인드마운트 한다. 어차피 바인드 마운트될 소스들을 COPY의 동작은 무의미해 보인다. 하지만 바인드 마운트는 개발중 편의를 위해 사용하는 것일 뿐이다. 운영단계에서는 바인드 마운트를 사용하지 않고 실행을 위해 필요한 모든 소스가 이미지에 포함되어 있어야 한다. 그러므로 dockerfile에 COPY가 있는 것이 옳다.

 

 


dockerignore

 

// .dockerignore
**/node_modules
Dockerfile

COPY . . 명령어는 호스트에있는 모든 소스를 이미지로 복사한다. 덕분에 부가적인 파일없이 이미지만으로 어플리케이션을 실행할 수 있지만 불필요한 또는 민감한 파일까지 이미지로 복사될수도 있다. 이때 .dockerignore 파일을 사용해 이미지를 빌드할 때 제외할 파일을 지정할 수 있다.

 

 

728x90