데이터 관리 및 볼륨으로 작업하기

O0·2022년 6월 11일
0

Docker

목록 보기
3/3
post-thumbnail

데이터 관리 및 볼륨으로 작업하기


1.볼륨소개

  • 볼륨은 컨테이너 제거 시 데이터가 삭제되는 문제를 해결해 준다.
  • 볼륨은 호스트 컴퓨터에 장착된 하드 드라이브에 존재하여 사용가능하거나, 컨테이너로 매핑되는 것이다. (내 컴퓨터 내 작은 머신)
  • 볼륨은 도커가 인식하는 호스트 머신인 '내 컴퓨터' 있는 폴더로서 도커 컨테이너 내부의 폴더에 매핑된다.
  • 볼륨은 컨테이너가 종료된 경우에도 지속되며 계속 존재한다.

2.볼륨 추가 방법

  • Docker file에 명령어 추가 VOLUME [ "컨테이너 내부 볼륨 경로"] : 익명의 볼륨
  • 익명의 볼륨, 명명의 볼륨 두 가지가 있다. (docker volume ls)
  • 익명의 볼륨은 컨테이너가 삭제되면 볼륨이 삭제되지만 명명된 볼륨은 컨테이너가 삭제되도 유지가 된다.
  • docker run -d -p 3000:80 --rm --name [container name] -v [컨테이너 파일 시스템 내부의 경로]:[Image name]
    --> -v 옵션으로 명명된볼륨 생성.
  • docker volume rm [vloume NAME], docker volume prune 통해 볼륨 삭제한다.

3.바인드 마운트

  • 개발을 할 때 변경사항을 실시간으로 이미지 리빌드 없이 해주는 역할.
  • 바인드 마운트와 볼륨 차이점은 호스트 머신의 파일 시스템 상의 볼륨이 어디에 있는지 알 수 있다.
  • 즉, 바인드 마운트는 호스트 머신의 파일 시스템 상의 볼륨위치를 알아서 해당 볼륨에 최신 코드를 엑세스할 수 있기 때문에 실시간으로 개발 최신화가 가능하다.
  • docker > preferences > Resource-File-sharing

4.다른 볼륨 결합 & 병합

  • 도커 내 익명의 볼륨 추가하여 바인드 마운트와 병행하게 사용함으로써 이미지를 리빌드 없이 자동적으로 변한다.
    docker run -d -p 3000:8000 --env-file ./.env --rm --name feedback-app -v feedback:/app/feedback -v "[로컬 Dockerfile 경로]:/app" -v /app/node_modules -v /app/temp feedback-node:env

5. 볼륨 & 바인드 마운트 요약

1) docker run -v /app/data : 익명의 볼륨
- 익명 볼륨은 컨테이너에 연결된 일종의 볼륨을 생성한다. 컨테이너 제거시 함께 제거된다. 컨테이너 재시작해도 제거되고 다시 생긴다.
- 즉, 컨테이너 간의 데이터를 공유할 수 없다. 호스트 머신에 폴더를 생성하고 시간이 절약된다. 덮여씌워지는 것을 예방한다.

2) docker run -v data:/app/data : 명명된 볼륨
- 특정 컨테이너에 연결되어 있지 않고 일반적으로 생성된다. 컨테이너를 종료하고 제거해도 살아남는다. 여러 컨테이너간에 데이터 공유 가능
- 다양한 컨테이너에 동일하게 명명된 볼륨 하나를 마운트 할 수 있고 컨테이너 간에 데이터 공유가 가능하다.

3) docker run -v /path/to/code:/app/code ... : Bind Mount
- 명명된 볼륨과 같이 다수의 컨테이너에 연결이 가능하다. 바운드 마운트의 데이터를 제거하려면 호스트 머신(내 로컬파일)에서 제거해야한다.
- 개발에서 변경된 사항을 실시간으로 반영할 수 있다.(라이브 데이터 제공), 바인드 마운트는 도커에 의해 관리되는 것이 아닌 로컬에서 마운트 하는것이다.

4) 볼륨 이란? 컨테이너 외부의 특정 폴더에 연결된 Docker 컨테이너 내부의 폴더/파일

5) 볼륨은 Docker에서 관리하므로, 호스트 폴더(컨테이너 내부 경로에 매핑됨)가 어디에 있는지 반드시 알 필요는 없다.

5. Docker 볼륨 관리하기

  • docker volume create [volume name]
  • 내 로컬 상의 작은가상머신에 도커가 볼륨을 저장한다.
  • docker volume rm [volume-name]

6. COPY 사용 vs 바인드 마운트 사용

  • 항상 스냅샷을 찍어야 하기 때문에 copy를 사용한다.
  • .dockerignore 파일을 생성해서 copy 시 제외 목록을 정한다. (파일에 무시할 파일 및 폴더를 추가한다.)

7. 환경변수 & ".env" 파일 작업

  • PORT 변수로 변경
ARG DEFAULT_PORT=8000
ENV PORT $DEFAULT_PORT
EXPOSE $PORT
  • docker build -t feedback-node:dev --build-arg DEFAULT_PORT=8000 .

핵심정리


  1. 컨테이너는 도커의 핵심이며 데이터를 읽고 쓸 수 있다. 이미지 위에 READ-WRITE 레이어를 추가한다.

  2. 볼륨은 컨테이너가 실행하는 호스트 머신상의 폴더입니다. 도커에 의해 관리되며 도커 컨테이너에 마운트 된다.
    • 컨테이너 내부의 매핑된 경로에 기록된 모든 내용은 호스트 머신에도 저장된다. 컨테이너가 제거된 후에도 유지된다.
    • 명명된볼륨 : 컨테이너가 제거되어도 살아남기 때문에 유용하다.
    • 익명의볼륨 : 컨테이너에 연결 되어 컨테이너 제거시 같이 제거된다.

  3. 바인드마운트를 사용하면 호스트 머신의 로컬 폴더를 매핑할 수 있다. 명명된 볼륨과는 다르게 호스트 머신의 경로를 알고 있어서 항상 최신 데이터를 사용할 수 있다.
    • 로컬의 소스코드를 컨테이너에 노출 후 익명볼륨과 결합하여 덮어쓰고 싶지 않은 컨테이너에 이미 존재하는 폴더를 실수로 덮어쓰지 않도록 한다.

  4. 환경변수를 설정함으로 소스코드에서 모든 것을 하드 코딩할 필요가 없어졌다.
docker run -d -p 3000:8000 --env-file ./.env --rm --name feedback-app -v feedback:/app/feedback -v "[로컬 Dockerfile 경로]:/app" -v /app/node_modules -v /app/temp feedback-node:env
profile
O0

0개의 댓글