Dockerfile,docekr-compose.yml작성

코드깎는 노인·2020년 5월 19일
0

Dockerfile

FROM node:alpine

WORKDIR '/app'

COPY package.json /app/package.json
RUN npm install
RUN npm install react-scripts@3.0.1 -g
COPY . .

CMD ["npm", "run", "start"]

FROM node:alpine : 사용할 이미지,alpine이란 도커에 필요한 기능을 담은 경량 리눅스.node: 를 추가하여 node 이미지와 함께 node에 필요한 alpine의 기본 기능을 가진 base image를 가져옴

WORKDIR '/app' : 해당 명령어의 아래 명령어들은 container의 해당 경로 내의 폴더에서 실행
COPY package.json /app/package.json:로컬머신에 있는 package.json을 컨테이너의 app폴더에 복사

볼륨을 사용하는 이유

도커의 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이라 쓰기가 불가능하다. 그렇기에 컨테이너 계층에 변화되는 데이터들이 저장이 되는데, 이럴 경우, 컨테이너가 삭제가 되면 그동안 작업한 내용이 지워지므로 볼륨을 사용한다. 만약 우리가 소스코드를 변경하면 컨테이너는 우리 소스파일의 스냅샵을 가져간다. 따라서소스코드가 바뀔 때마다 지금 상황에서는 항상 새로 build를 해줘야 하고 이는 정말 귀찮고 번거로운 작업이다.그래서 소스코드를 컨테이너 안에 mount 시킬 것 이다. 즉 컨테이너 안의 코드가 우리의 로컬 소스코드를 reference 하도록 해주는 것이다.

docker-compsoe.yml

version: "3.7"

services:
  cinerium:
    container_name: cinerium
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ".:/app"
      - "/app/node_modules"
    ports:
      - 3000:3000
    environment:
      - CHOKIDAR_USEPOLLING=true
docker-compose up --build
docker-compose stop

cinerium : 컨테이너명
conext: 도커를 빌드할 디렉토리
".:/app": 호스트의 어플리케이션폴더 .을 컨터이너 /app에 마운트시켜 호스트(로컬머신)의 소스파일이 자동적으로 컨테이너 안쪽으로 반영.즉 변경 후 docker-compose up --build실행시 변경사항 반영.
"/app/node_modules": 도커가 이미지를 빌드할때 node_module디렉토리는 앱 디렉토리안에 만들어진다.그리고 모든 의존성이 여기서 설치된다.런타임중 도커밖의 로컬머신(호스트)디렉토리가 도커인스턴스에 마운트되며(이것은 노드모듈이 설치되어있지 않은상태이다) 방금 설치된 노드모듈 폴더를 숨긴다.docker-compose.yml로 마운트된 볼륨을 삭제하면 확인할 수 있다.해결방법은 anonymous volume(/app/node_modules)을 사용하여 노드모듈을 저장하는 것이다. anonymous volume은 앱디렉토리가 마운트되기전의 빌드된 도커이미지를 복사한다.
참고
CHOKIDAR_USEPOLLING=true:polling mehcanism( 한 프로그램이나 장치에서 다른 프로그램이나 장치들이 어떤 상태에 있는지를 지속적으로 체크)으로 hot-reloading가능하게 함.
docker-compose up --build:docker-compose.yml파일 실행시켜 build와 run동시에 실행\
docker-compose up --build:docker-compose로 실행된 컨테이너 종료

profile
내가 볼려고 만든 블로그

0개의 댓글