docker-volume 사용법

박상은·2021년 8월 20일
1

🛢️ docker 🛢️

목록 보기
4/5
post-custom-banner

1. Volume

파일들을 컨테이너로 복사하지않고 참조하도록 설정하는것
docker는 기본적으로 컨테이너를 삭제하면 데이터가 삭제되므로 데이터를 보존하고 싶을 때 혹은 여러 컨테이너간에 데이터를 공유해서 사용하고 싶을때 적용하면됨
Volume을 사용하는 방식은 두가지가 있음 ( 알고보니 Volume이 두가지방식은 아님 )

1.1 Volume방식

호스트의 특정 공간에 공유할 폴더를 생성하는 방식임

1.1.1 Volume생성

docker volume create <volume-name>
docker volume create db-redis

1.1.2 Volume조회

docker volume ls

1.1.3 특정 Volume상세조회

docker volume inspect <volume-name>
docker volume inspect db-redis

  • Mountpoint에 적힌 경로가 현재 volume값이 저장된 경로가 적혀있음
    ( ubuntu 20.04 에서 실행한 결과 /var/lib/docker/volumnes/db-redis/_data )

1.1.4 Volume사용

docker run의 다른 옵션 입력하듯이 입력

  • docker run <option> -v <volume-name>:<container-route> <image-name>
  • docker run --name my-redis -d -p 8080:8080 -v my-redis:/data redis
    위 처럼 사용하면 my-redis이라는 폴더에 존재하는 파일들이 컨테이너의 /data에 공유됨
    컨테이너를 몇개를 사용하든 동일한 파일이 공유되며 하나가 수정되면 전체가 바뀜
  • -v usr/app/node_modules처럼 작성시에는 현재 컨테이너환경에서 node_modules를 찾으라는 의미

1.1.5 Volume제거

  • 특정삭제: docker volume rm <volume-name>
  • 전체삭제: docker volume prune

1.2 bind-mount방식

특정 volume을 생성하지않고 호스트의 특정 경로의 폴더를 공유하는것

1.2.1 사용

  • docker run <option> -v <host-route>:<container-route> <image-name>
  • docker run --name my-node -d -p 8080:8080 -v $(pwd):/app/src node:10
    - ubuntu 20.04 terminal 기준 현재경로는 $(pwd)
    - window 10 cmd 기준 현재경로는 %cd%

마무리

1. Dockerfile과 volume 사용하며 격은 문제

Dockerfilevolume을 같이 사용할 경우 조심해야할게 Dockerfile로 복사한 파일이 존재하는 폴더에다가 volume을 지정해버리면 기존값들이 사라지고 volume의 값만 남게됨
예를 들어보자면 아래와 같은 Dockerfile로 빌드된 이미지가 있고 현재 경로에 app.js가 존재할 때
docker run -dp 8080:8080 --name my-node -v $(pwd):/usr/src/app ghksaud55/node 명령을 실행했다고 가정
Dockerfile로 생성한 image에는 package.json으로 설치된 종속성이 들어있음
그 이후 -v를 이용해서 현재폴더의 app.js를 컨테이너의 실행폴더인 /usr/src/app에 복사해가고 컨테이너 실행시 node app명령이 실행되면서 서버가 가동될것같지만 /usr/src/app에는 기존값들이 사라지고 app.js가 덮어씌어지면서 app.js만 남게된다고 생각함
사실 개인적인 추측이라 정확하게 모르지만 -v로 지정한 폴더는 volume값으로 덮어씌워지는것 같음

#Dockerfile

FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY ./ ./
CMD [ "node", "app" ]

# app.js
const express = require("express");
const app = express();

app.get("/", (req, res) =>{
	res.send(<h1>Hello, Docker!</h1>);
});

app.listen(8080, ()) =>{
	console.log("8080번 대기중");
});

2. 특정파일제외하기

docker run -d -p 8080:8080 --name my-node -v /user/src/app/node_modules -v %cd%:/user/src/app ghksaud55/node
-v로 호스트경로를 지정하지않으면 컨테이너에서 알아서 찾아서 사용함

참고한 사이트

  1. 인프런강의
  2. 전체적으로참고
  3. volume참고사이트
  4. docker이미지생성후테스트
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 2월 22일

안녕하세요 운영자님
인카토스입니다.
먼저, 댓글로 인사를 드리게 된 점 양해 부탁 드립니다.
이렇게 연락 드린 이유는 이번에 저희가 제작한 도커 각티슈케이스 제품 협찬을 제안드리고 싶어서 연락 드렸습니다.
개발자들에게 많은 사랑은 받은 각티슈케이스입니다.
저희 상품 블로그 포스팅이 가능하실지 여쭙고자 연락드렸습니다.
아니면 클리앙,서버포럼, okky,2cpu,그누보드 등 가입되어 있으신 개발자 커뮤니티가 있으시다면 해당 커뮤니티에 아래와 비슷하게 게시글을 올려주실수 있을까요?

클리앙 : https://www.clien.net/service/board/park/17797443

연락드릴수 있는방법이 댓글밖에 보이지 않아 이렇게 먼저 연락드립니다.

협찬제안에 긍정적인 검토 부탁드리고 제안이 마음에 드신다면 하기 메일로 메일주시면 제품 보내드리도록 하겠습니다.

sungjh0726@naver.com

협찬제품 링크 : https://incatos.shop/surl/P/11

답글 달기