Docker 조금씩 사용해보기

hs·2022년 9월 14일
0

docker 컨테이서 생성

  • docker build ./ (현재 디렉토리)
    • -t : tag의 약자. 컨테이너 이름 짓기
  • Node 베이스 이미지를 통해 임시 컨테이너를 생성한 후 docker 이미지를 만든다.
    • Base image → 임시 컨테이너 → docker image
    • 그렇기 때문에 생성할 때 none 이라는 이미지가 생성되었다가 사라진다.

docker 이미지 실행

  • docker run { 이미지 이름 }
    • -it : 실행을 이어 가겠다. 바로 종료시키지 않겠다.
    • -p : 포트 포워딩. 어떤 포트로 접속해도 연 서버로 프록시
    • -d : detach 터미널을 바로 탈출

Dockerfile

# 베이스 이미지를 명시해준다.
FROM node:{Version}

# 모든 파일들을 포함시키기 위해서 (ex. package.json, app.ts)
COPY ./ ./

# 추가적으로 필요한 파일들을 다운로드 한다.
RUN npm install

#컨테이너 시작시 실행될 명령어들을 작성한다.
CMD [ "npm", "run","start"]

위가 기본틀의 예시이다. (NestJS 기준)

WORKDIR /usr/src/app

WORKDIR = 이미지 안에서 어플리케이션 소스 코드를 가지고 있을 디렉토리를 생성하는 것

이 디렉토리가 어플리케이션의 working 디렉토리가 된다.

문제점 및 사용이유

  • Root 디렉토리에 모두 합쳐지기 때문에
    1. 원래 있던 home, lib 등 이름이 겹치는 것들은 덮어 씌우기가 된다.
    2. 정리정돈이 안된다.

package.json

위 Dockerfile 에서는 COPY를 통해 한 번에 모든 파일을 불러왔지만 실제로는 조금 다르다.

FROM node:{Version}

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install

COPY ./ ./

CMD [ "npm", "run","dev" ]

이러한 이유는 코드가 수정이 되고 다시 빌드를 할 때 발생한다. ( 위의 Dockerfile을 수정전, 아래의 Dockerfile을 수정후라 부르겠다. )

핵심 - Dockerfile을 빌드 할 때 캐싱이 발생한다.

그렇기 때문에 수정전에 경우 재빌드를 할 때 종속성이 변경된 것이 아니라 소스만 변경되었으면 package.json을 통해 다시 한 번 RUN npm install 을 수행하게 된다.

이에 따라 수정후의 경우는 소스 변경의 경우 npm install 이 따로 실행되지 않는다.

  • 문제 발생 package-lock.json은 실제 package.json에 정의된 node module의 dependencies tree를 정의하기 때문에 package-lock.json파일도 반드시 필요하다. 그렇기에
    COPY package*.json ./
    와 같이 써야한다.
    npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!
    또 위와 같은 에러가 나타났는데 이는 npm 버전에 나타났던 문제인데 핵심은
    FROM node:{Version}
    이 부분에서의 문제였다. package

Docker Volume

기존 방식은 COPY를 통해 도커 컨테이너에 새롭게 빌드하여 진행

Volume 방식은 도커 컨테이너에서 로컬의 소스들을 참조(Mapping) 하여 진행

docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app chsu00/hello-docker
profile
무엇이든 끝까지 보람차게

0개의 댓글