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

전종원·2022년 11월 9일
0
post-thumbnail

1. docker의 data 종류

1.1. Application

  • Build 시 이미지나 컨테이너에 추가된다.
  • read-only로 제공됨.
  • developer에 의해 작성 및 제공된다.
  • 한번 이미지가 빌드되면 변경될 수 없다.

1.2. Temporary App Data

  • 컨테이너 내에서 사용자에 의해 입출력 되는 데이터
  • 메모리나 temporary files에 저장된다.
  • read+write
  • 컨테이너에 적용됨.

1.3. Permanent App Data

  • 컨테이너와 볼륨에 영구적으로 저장되는 데이터
  • read+write
  • 실행중인 컨테이너에 붙여지거나 제공된다.
  • 파일이나 데이터베이스에 저장된다.

2. feedback app을 통한 데이터 실습

2.1. feedback app

  • 주어진 파일들을 dockerfile로 빌드하여 이미지를 만들고 만들어진 이미지를 기반으로 컨테이너를 생성하여 시행시킨다.
  • localhost:3000으로 진입하면 위 사진과 같은 페이지가 나오고 title에 제목을 입력하고 Document Text에 내용을 입력한다.
  • localhost:3000/feedback/titlename.txt 로 접속하면 해당 title의 DocumentText를 볼 수 있다.

2.2. feedback app의 특징

  • 컨테이너를 삭제 후 다시 생성하면 만들었던 .txt 파일들이 사라짐.
  • 컨테이너를 삭제하지 않고 단지 stop 했다가 restart를 한다면 우리가 app에서 만들었던 .txt데이터는 사라지지 않는다.
  • 컨테이너는 자체적으로 독립된 파일 시스템을 가지므로 그 안에서 생성된 파일이나 데이터들은 컨테이너가 삭제되지 않는 한 보존된다. 하지만 컨테이너를 삭제하는 순간 자체 파일시스템을 삭제하고 이미지로부터 새로 구축하므로 우리가 app에서 만든 데이터는 사라진다.

3. Volumes

  • 컨테이너를 삭제하면 내부 데이터가 사라지는 문제를 어떻게 해결할 수 있는가
  • volumes는 컨테이너에 마운트된 호스트 머신에 있는 폴더들이다.
  • volume을 통해 컨테이너 내부 폴더와 호스트 머신에 있는 폴더를 연결해 파일들을 공유할 수 있다.
  • volume은 호스트 머신에 있는 폴더들이기에 컨테이너가 제거되어도 존재한다.

3.1. Anonymous volume

  • 도커 이미지를 빌드할 때 VOLUME [ " path of folder "]을 사용해 익명의 볼륨을 생성 가능
  • 예를 들면 VOLUME ["/app/feedback"] 을 하면 컨테이너 내 /app/feedback 경로를 호스트 머신의 어딘가에 연결 시킨다.
  • 이렇게 생성된 익명의 볼륨은 컨테이너를 stop하면 사라진다.(컨테이너가 관리하기 때문)
  • 하나의 컨테이너에만 연결된다.

3.2. Named volume

  • 컨테이너를 생성할 때 -v 옵션으로 생성
-v [volume_name]:[volume_path]
  • 예시
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback feedback-node:volumes
  • 볼륨에 이름을 지정할 수 있다
  • 컨테이너가 종료되도 볼륨이 호스트 머신 어딘가에 남아있다.
  • 컨테이너를 재시작하면 볼륨이 다시 연결되어 데이터가 살아있다.
  • docker volume ls 명령으로 현존하는 볼륨들을 확인할 수 있다.

3.3. Volume Management

  • docker volume create [volume name]: 수동으로 호스트머신에 볼륨생성
  • docker volume ls: 현존하는 볼륨 리스트업
  • docker volume inspect [volume name]: 해당 볼륨 정보 나열
  • docker volume rm [volume name]: 해당 볼륨 삭제
  • docker volume prune: 사용하지 않는 볼륨 삭제

4. Bind Mount

  • 볼륨은 컨테이너 내 특정 위치를 호스트머신 어딘가에 연결시켜 데이터를 보존하는 역할을 한다.
  • 바인드 마운트는 컨테이너 내 특정위치가 연결되는 호스트 머신의 위치를 정해준다.
  • 컨테이너를 생성 시 -v [host path]:[path in container] 옵션으로 설정 가능하다.
  • 예시
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback -v "/home/jw/Dropbox/JongWon/docker_lec/section3/data-volumes-01-starting-setup/server.js:/app" -v /app/node_modules feedback-node:volumes
  • -v /app/node_modulesnpm install 시 설치되는 node 모듈들이 호스트 머신에서도 적용될 수 있도록 볼륨을 설정해주는 작업이다.

5. .dockerignore

  • COPY 시 제외할 폴더나 파일들을 작성.
  • 주로 .git 파일이나 설치 모듈들이 여기 해당

6. ENV & ARG

6.1. ENV

  • Dockerfile에서 ENV [val_name] [value] 형식으로 설정가능.
  • 도커 내 파일들에서 .env.value_name로 접근 가능
  • 컨테이너 생성 시 --env 옵션으로도 추가가능
--env PORT 8000
  • 로컬폴더에 .env 파일을 생성해 적용할 환경번수들을 적어놓고 컨테이너 생성시 --env-file ./.env 옵션을 이용해 읽도록 할 수 있다.

6.2. ARG

  • dockerfile에 전달하는 인수
  • 디폴트 값을 지정할 수 있고 도커 내 파일에서는 접근할 수 없다.
  • 도커 이미지 빌드 시 --build-arg [arg_name]=[value] 옵션으로 지정 가능하다.
  • dockerfile을 변경하지 않고도 동일한 dockerfile에서 서로 다른 이미지를 만들어 낼 수 있다는 이점이 있다.
FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

ARG DEFAULT_PORT=80

ENV PORT $DEFAULT_PORT

EXPOSE $PORT

# VOLUME [ "/app/node_modules" ]

CMD [ "npm", "start" ]

0개의 댓글