Node.js Dockerfile 생성과 docker-compose 작성하기

정태호·2022년 11월 19일
0

Dockerfile

Dockerfile을 생성하면 docker를 이용하여 가상 컨테이너에서 독립적인 환경으로 어플리케이션을 운용할 수 있다.
이때 컨테이너 내부의 실행 환경을 Dockerfile에 작성하여 해당 파일만 있으면 어떤 공간에서도 동일한 실행환경을 보장하며 파일을 실행하는 것만으로 간단히 서비스를 제공할 수 있다.

Dockerfile

# 가져올 베이스 이미지를 선택
# node:[16.17.0,16-alpine] 등으로 원하는 이미지를 선택할 수 있다.
FROM node:16.17.0

# 컨테이너 생성 전 수행될 명령어를 RUN을 통해 작성할 수 있다.
RUN mkdir -p /app

#root 작업 디렉토리 설정 이후 ./에 대한 위치가 된다.
WORKDIR /app

#Dockerfile 이 존재 하는 디렉토리 -> Docker workdir 디렉토리에 복사한다.
COPY ./ ./

#복사한 파일중 package.json을 이용하여 의존성 설치 한다.
RUN npm install

# 포트를 맵핑한다.
EXPOSE 8000

# tail -f dev/null 파일을 열고 갱신 여부를 감시한다.
CMD ["tail","-f","dev/null"]

#환경 변수를 추가한다.
ENV NODE_ENV=develop

CMD 는 컨테이너의 생성 및 실행 시 실행할 명령어로 위의 코드를 실행할 경우 docker가 종료되지 않고 계속 돌아가게 유지 할 수 있다.
이때 CMD와 ENTRYPOINT로 실행할 명령어를 지정할 수 있는데

ENTRYPOINT npm run start:pm2
CMD tail -f /dev/null

와 같이 작성 하더라도 두개의 명령어는 독립적으로 실행 되지 않는 것에 주의 해야 한다.

Docker image 실행시 NodeJS 프로젝트 자동 실행시키기

NodeJS 프로젝트를 실행시킬 경우 백그라운드 실행을 위해 pm2 패키지를 이용하게 된다.
그리고 이미지 실행시 이를 CMD를 통해 자동으로 백그라운드 실행을 위해 명령어를 작성 하더라도 도커의 컨테이너는 종료되게 되는 경우가 있다.

CMD npm run start:pm2 && tail -f /dev/null
# npm 스크립트 명령어 뒤에 && 이후의 명령어가 포함되어 실행되어 버린다

위와 같이 작성하여 pm2를 이용한 백그라운드 실행과 tail -f 명령어를 통한 컨테이너 종료를 막기 위해 작성 할 수 있지만 이 경우 컨테이너는 바로 종료되어 버리고 만다.

CMD pm2 start app.js && tail -f /dev/null

으로 작성 해 주어야만 정상적으로 pm2가 실행된 후 tail 명령어를 실행하게 되니 작성에 주의 하자.

docker-compose.yml

docker-compose는 여러개의 컨테이너를 실행하고 그 안에서 실행한 CLI 명령어 및 실행 순서를 파일로 관리 할 수 있다는 장점이 있습니다.

version: "3"
services:
  db: # Dockerfile을 이용하지 않고 이미지를 바로 사용한다
    image: mysql:8.0.1
  volumnes:
      - ./db/data:/var/lib/mysql
  ports:
      - 3306:3306
  app:
    build: # build의 다음 명령어에 대해 root를 현재 디렉토리로 설정한다.
      context: /
      dockerfile: Dockerfile
    environment:
      - DB_HOST=db
      - DB_PORT=3306
      - DB_NAME=test
      - DB_USERNAME=test
      - DB_PASSWORD=test
    depends_on: #의존성을 설정하며 db 컨테이너가 실행된 후에 실행된다
      - db
    ports: # docker 외부 포트 : docker 포트 로 매핑한다
      - "3000:3000"
    command: # Dockerfile의 CMD와 같은 역할을 한다
      - pm2 start app.js && tail -f /dev/null
    volumes: # docker-compose root : 컨테이너 root/app 으로 매핑시키며 외부 폴더 내용이 그대로 해당 컨테이너 디렉토리에 반영된다 
      - ./:/app

참조자료

Dockerfile
https://wooono.tistory.com/123
https://blog.d0ngd0nge.xyz/docker-dockerfile-write/

docker-compose
https://jizard.tistory.com/324

0개의 댓글