Chapter03: 데이터 관리 & Volumes

hahic·2022년 6월 6일
0

Docker

목록 보기
3/7
post-thumbnail

Goal

이미지와 컨테이너 내부의 데이터를 관리하는 방법

  • 다양한 종류의 데이터 이해
  • Image, Container의 Volumes
  • 인수 및 환경 변수 사용법

About Data

📙 Type

  • Application (Code + Environment)
  • Temporary App Data
  • Permanent App Data

🔎 Application (Code + Environment)

  • Image 영역
    • 빌드할 때, 생성
  • 읽기 전용

🔎 Temporary App Data

  • Container 영역
    • Image로 Container 생성/실행할 때, 생성
  • 읽기/쓰기 가능
  • 임시적인 데이터
    • Container 내부에 저장 (로컬 머신에 저장되지 않음)
    • Container가 삭제되면 같이 삭제
    • Container가 중지되었다가 다시 시작되도 삭제되지 않음

🔎 Permanent App Data

  • Volumes/Bind Mounts 영역
    • Image로 Container 생성/실행할 때, 생성
  • 읽기/쓰기 가능
  • 영구적인 데이터

About Volumes

Docker가 관리하며, 저장된 경로를 알 수 없음

📙 Type

  • 익명의 Volumes
    • 다른 Container 간 데이터를 공유하지 못함
    • Container에 이미 존재하는 특정 데이터를 잠그는데 유용
    • Container가 제거되면 같이 제거됨
  • 망명된 Volumes
    • 특정 Container에 연결되지 않음
    • 여러 Container 간 데이터를 공유할 수 있음
    • Container을 종료하거나, 제거해도 존재

🔔 익명의 Volume

외부 경로보다 Container 내부 경로의 우선 순위를 높이는 목적으로 이용

  1. Dockerfile 내부에 Volume 설정을 한 경우
FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

VOLUME [ "/app/feedback" ]

CMD [ "node", "server.js" ]
  1. Image로 Container를 생성 및 실행할 때, 지정하는 경우
docker run -d -p 3000:80 --rm --name feedback-app -v /app/feedback feedback-node:feedback

🔔 망명된 Volume

Container를 제거해도 삭제되지 않음
다른 버전의 Image의 Container에서 이전 버전의 데이터를 사용할 목적으로 이용

  1. Image로 Container를 생성 및 실행할 때, 이름을 지정하는 경우
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback feedback-node:feedback

About Bind Mounts

Application을 개발하는 동안,
Code를 변경하면 바로 Container에 반영이 될 수 있도록 이용

📙 특징

  • 특정 Container에 연결되지 않음
  • 여러 Container 간 데이터를 공유할 수 있음
  • Container을 종료하거나, 제거해도 존재
  • 호스트의 어느 위치에 데이터가 저장되어 있는지 알고 있음
  • Volumes보다 영구적이고, 편집 가능한 데이터에 적합

🔔 How to set Bind Mounts

  • macOS / Linux: -v $(pwd):/app
  • Windows: -v "%cd%":/app

[ 잘못된 케이스 ]

Dockerfile의 RUN npm install 명령어를 실행하면,
Container 내부 저장소에 node_modules 파일을 생성하고 모듈을 설치하는데
로컬 호스트 저장소와 Container 저장소가 일치하지 않아 에러가 발생함

docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback -v "C:\ejlim\lecture\docker\chapter03\data-volumes-03-adj-node-code:/app" feedback-node:volumes

[ 올바른 케이스 ]

수정한 위의 Dockerfile을 빌드하여 새 Container을 생성하거나
아래의 명령어처럼 -v /app/node_modules 옵션을 추가하여 Container을 생성하면 됨

docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback -v "C:\ejlim\lecture\docker\chapter03\data-volumes-03-adj-node-code:/app" -v /app/node_modules feedback-node:volumes
docker run -e CHOKIDAR_USEPOLLING=true -d -p 4000:80 --rm --name feedback-app -v feedback:/app/feedback -v "C:\ejlim\lecture\docker\chapter03\data-volumes-04-added-nodemon:/app" -v /app/node_modules feedback-node:volumes

기타

💭 .dockerignore

Dockerfile의 명령어 COPY . . 에서 로컬 호스트의 파일로 덮어쓰지 않을 파일의 리스트들을 정의해놓는 파일

  • Dockerfile

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

    node_modules

💭 환경 변수

  1. Dockerfile에 정의하는 경우
  • server.js의 일부

    app.listen(process.env.PORT);
  • Dockerfile

    FROM node:14
    
    WORKDIR /app
    
    COPY package.json .
    
    RUN npm install
    
    COPY . .
    
    ENV PORT 80
    
    EXPOSE $PORT
    
    # VOLUME [ "/app/node_modules" ]
    
    CMD [ "npm", "start" ]
  1. .env 파일에 정의하는 경우
  • server.js의 일부
    app.listen(process.env.PORT);
  • .env
    PORT=8000
  • CLI
    docker run -d -p 3000:80 --env-file ./.env --rm --name feedback-app -v feedback:/app/feedback -v "C:\ejlim\lecture\docker\chapter03\data-volumes-08-args-and-env:/app" -v /app/node_modules feedback-node:volumes

💭 빌드 인수 (ARG)

  1. 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" ]
  2. 빌드할 때 정의하는 경우 (개발용)

    docker build -t feedback-node:dev --build-arg DEFAULT_PORT=8000 .

Docker 명령어

  • docker volume ls
  • docker volume prune
  • docker run -v [volume name] [container 폴더 경로]
  • docker run --env PORT=[port number]
  • docker run --env-file [로컬 file .env 경로]
profile
👩‍💻 Junior Backend Developer

0개의 댓글