노드 공부 차원에서 이전에 장고로 진행했던 프로젝트를 노드로 바꿔보는 작업을 하고있다. 기존에 해왔던 것처럼 로컬에 개발 환경을 구축하지 않고 도커를 이용해서 초기셋팅을 하기로 했다.
현 프로젝트에서 필요한 컨테이너는 (1) 노드 서버, (2) postgres 서버
이다. 두 개의 컨테이너를 사용하므로, docker-compose로 복수의 컨테이너를 실행시키기로 했다.
// Dockerfile
[1] FROM node:17.8.0
[2] WORKDIR /usr/src/app
[3] COPY ["./", "./"]
[4] RUN npm install
[1]: 기반이 되는 이미지이다. 노드 17.8.0 버전을 사용하도록 하고 있다.
[2]: RUN, CMD, ENTRYPOINT, COPY 등의 명령어가 실행될 경로이다.
[3]: package-lock.json, 소스 코드 파일을 포함하여 프로젝트의 모든 파일을 복사한다.
[4]: package-lock.json을 토대로 프로젝트에 필요한 모든 모듈을 설치한다.
// docker-compose.yml
version: "3.8"
services:
postgresql:
image: postgres:14.2
restart: always
volumes:
- ./postgresql/data:/var/lib/postgresql/data
ports:
- '5432:5432'
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_PASSWORD: ${DB_PW}
POSTGRES_NAME: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
TZ: "Asia/Seoul"
node:
depends_on:
- postgresql
working_dir: /usr/src/app
env_file:
- .env
build:
context: ./
dockerfile: Dockerfile
volumes:
- ./:/app
ports:
- 80:3000
command: bash -c "npm start"
노드 컨테이너는 앞서 작성한 Dockerfile을 기반으로 빌드되도록 하고있다. 반면 DB서버를 띄울 컨테이너는 많은 설정이 필요하지 않으므로 별도의 도커파일 없이 docker-compose.yml만으로 빌드되도록 했다.
도커가 중지되었을 때 항상 재시작하도록 한다.
호스트의 애플리케이션 파일과 컨테이너 내의 파일을 마운트시켜주는 설정이다. 이렇게 하면 로컬이나 컨테이너 내에서 파일 수정 사항이 생겨도 상호 간에 반영된다.
호스트의 5432포트와 컨테이너의 5432 컨테이너를 연결시킨다.
서비스 간 종속성 순서대로 컨테이너를 실행시키는 설정으로, 여기에선 postgresql을 먼저 실행시키고 node 컨테이너를 실행시키도록 하고 있다.
도커 실행 시 npm start
명령어를 실행시키도록 하고있다.
이후 docker-compose up -d
명령어를 통해 컨테이너를 실행시켜주면 된다. 현 프로젝트에서는 보다 간편한 도커 이용을 위해 vscode의 docker extension을 설치하여 컨테이너를 구동시키고 작업을 진행하고 있다.
기타 도커 관련 명령어는 추후에 따로 정리하도록 하겠다.