docker-compose NodeJS(NestJS) 적용하기 -1

 이번에는 docker-compose를 이용하여 컨테이너를 생성하도록 하겠습니다.


진행하기 전에 Docker와 Docker-Compose가 설치되 있어야 하고 OS는 Ubuntu(Linux)를 사용합니다. 


docker install by terminal : ubuntu 20.04

docker-compose Ubuntu Install


해당 프로젝트 폴더안에서 Dockerfile을 생성합니다.

Dockerfile 생성 방법에 대해서는 아래 링크를 참고해 주시기 바랍니다.

링크 3 : docker 도커를 이용하여 이미지(IMAGE) 생성하기 : NestJS 사용


아래는 해당 Dockerfile입니다.

# Base 이미지를 사용합니다.
FROM node:16.19.0

# Docker Container안의 디렉토리를 설정합니다. 설정을 안할시 Root리렉토리로 설정됩니다.
WORKDIR /nestjs

# package.json을 도커 이미지에 복사합니다.
COPY package.json /nestjs

# yarn.lock를 도커 이미지에 복사합니다.
COPY yarn.lock /nestjs

# yarn install을 실행하여 node_modules를 생성합니다.
RUN yarn install

# 해당 디렉토리에 있는 모든 파일, 폴더를 도커 이미지로 복사합니다.
# .dockerignore에 있는것은 제외
COPY . /nestjs

# 해당 도커 이미지에서 build를 해서 dist폴더를 생성합니다.
RUN yarn build

# 해당 이미지의 포트를 EXPOSE합니다.
# 표시만 할뿐 실제 도커 컨테이너의 포트가 노출되지 않는다.
EXPOSE 3000

# 도커 이미지를 이용하여 컨테이너를 생성시 nodejs 자동 실행
CMD ["yarn", "start:dev"]


불필요한 파일이나 폴더가 저장되는것을 막기 위해 '.dockerignore'을 생성해 줍니다.

dist
node_module
Dockerfile
.git
.gitignore
docker-compose.yaml


현재 PostgreSQL, Reids에 연결을 안하지만 'docker-compose.yaml'파일을 작성하면서 추가하도록 하겠습니다.


networks:
# 해당 도커 컴포즈로 실행한 컨테이너는 동일한 네트워크를 공유한다.
backend_network:
services:
# 해당 예제에서 사용할 DB(postgres 12)
db:
# Pull받을 DB 이미지
image: 'postgres:12'
# 해당 DB의 데이터를 volume으로 저장(postgres)
volumes:
- db_example:/var/lib/postgresql/data
# 해당 도커 환경을 설정한다.
# 위 DB에서는 사용자(USER)와 비밀번호(PASSWORD)를 설정한다.
environment:
POSTGRES_USER: alex
POSTGRES_PASSWORD: password
networks:
- backend_network
# 재시작시 자동 실행이 필요하면 restart이 'always'이다.
restart: always
# 로그가 쌓이면 해당 인스턴스의 하드를 과도하게 점유하게 된다.
# 로그를 제한한다.
logging:
driver: "json-file"
options:
# 로그의 파일 갯수
max-file: "3"
# 로그의 파일 크기(10m = 10 MB : megabites)
max-size: "10m"

cach:
image: 'bitnami/redis:latest'
environment:
- ALLOW_EMPTY_PASSWORD=yes
networks:
- backend_network
restart: always
logging:
driver: "json-file"
options:
max-file: "3"
max-size: "10m"

backend:
# 이미지 생성을 위해 해당 디렉토리에 있는 Dockerfile를 build한다.
# docker-compose파일에 같은경로로 Dockerfile이 있을시 '.' 을 찍으면 된다.
# 같은경로가 아닐시 상대경로로 지정해서 실행한다.
build: .
ports:
- '4000:3000'
networks:
- backend_network
environment:
- REDIS_URL=redis://cach:6379
- PG_HOST=db
- PG_USERNAME=alex
- PG_PASSWORD=password
- PG_DATABASE=startup
- PG_PORT=5432
- PG_SYNC=true
- SALT=apple
- RES_SALT=res_apple
- EXPIRESTOKEN=24h
- RES_EXPIRESTOKEN=720h
# 해당 서버가 실행되기전 반드시 실행되고 있어야 하는 컨테이너를 설정합니다.
depends_on:
- db
- cach
restart: always
logging:
driver: "json-file"
options:
max-file: "3"
max-size: "10m"

volumes:
db_example:


이제 해당 디렉토리(docker-compose.yaml 존재 경로)에서 아래 CLI를 실행합니다.

$ docker-compose up -d

해당 CLI의 끝에 -d는 detatch모드 입니다.


이미지가 존재하지 않는다면 'docker-compose'에서 자동으로 생성합니다.





만약 코드 수정후 이미지를 새로 만들려면 '--build' 를 붙이시면 됩니다.



해당 도커 컨테이너가 모두 정상적으로 실행된 것을 알수 있습니다. 여기서 postgres, redis는 오직 docker-compose_backend_1만 접근이 가능합니다. 그리고 실제적으로 외부(or localhost)에서는 4000포트로 docker-compose_backend_1에 접속할수 있습니다.




해당 컴포즈를 끌시는 아래와 같이 CLI를 입력하면 됩니다.

$ docker-compose down



해당 gitHub(branch : docker-compose_NodeJS_NestJS_적용하기-1 -> docker-compose_NodeJS_NestJS_적용하기-1)


이후글 : docker-compose NodeJS(NestJS) 적용하기 -2

댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)