Docker with Node

공부의 기록·2022년 5월 2일
0

Docker

목록 보기
4/4

Docker with Node

본 문서는 2022년 5월 2일 에 작성되었습니다.

  1. 간단한 Express + Redis 배포하기

Express + Redis

connect git (optional)

git init
git remote add origin https://github.com/~/저장소.git

prepare node (need)

npm init -y
{
  "script": {
    "start": "server.js"
  }
}

ADD server.js

const express = require('express');

const PORT = 8000;
const HOST = '0.0.0.0';

const app = express();

app.get('/', (req, res) => res.send('Hello world');
        
app.listen(PORT,HOST);

console.log(`Running on http://${HOST}:${PORT}`);

ADD Dockerfile

  1. FROM 베이스 이미지 설정
  2. WORKDIR COPY 파일의 저장 경로 설정
  3. COPY 지정 파일을 스냅샷에 포함
  4. RUN 추가적으로 필요한 파일을 다운로드
  5. CMD 컨테이너 시작 시 실행 될 명령어를 명시
FROM node:14

WOKRDIR /user/src/app

COPY package.json ./
RUN npm install
COPY ./ ./

CMD ["node", "server.js"]

왜, 아래처럼 하지 않는가?

COPY ./ ./
RUN npm install

수정 확인 을 하기 위해서는 docker 을 재실행 해야 합니다.
이 경우, ./ 가 하나의 묶음으로 해석되어 코드 한 줄만 수정해도 모든 node_modules 가 재설치 되게 됩니다.

따라서, 아래처럼 하게 되면 package.json 이 분리되어 결과적으로 종속성 설치 절차가 1회만 실행되게 됩니다.

COPY package.json ./
RUN npm install
COPY ./ ./

ADD docker-compose.yml

  1. version 도커 컴포즈 버전 (필수)
  2. services 동시에 실행할 도커 컨테이너 리스트
    2.1. container name 컨테이너 이름 + 하위에 추가 옵션
version: '3'		# 도커 컴포즈 버전
services:			# 실행 하려는 컨테이너 들
  redis-server:		# 컨테이너 이름
    image: 'redis'	# 컨테이너에서 사용하는 이미지
  node-app:			# 컨테이너 이름
    build: .		# 현 디렉토리에 있는 Dockerfile
    ports:			# 포트 매핑 # 로컬 포트 : 도커 포트
      - "49160:8000"

build

docker build ./ -t unchpatered/node14

~ 안에는 저장할 이름을 적으며, 관행상 계정명/이미지명:버전 으로 기록합니다.

run

docker run -p 49160:8000 unchpatered/node14

  1. 49160 로컬에서 컨테이너에 접속하기 위한 경로
  2. 8000 node application 의 지정 포트
  3. unchaptered/node14 이미지 명

docker build, run 은 작성된 파일을 기본으로 스냅샷을 만들어 이미지를 제작 실행하는 과정입니다.

volume

컨테이너를 실행할 때, volume 옵션을 줘서 일일히 build 하지 않고 run 절차에서 변화 내용을 이미지에 반영할 수 있습니다.

docker run -p 49160:8000 -v /usr/src/app/node_modules -v %cd%:/usr/src/app unchaptered/node14

  1. -v /usr/src/app/node_modules 참조하지 않을 경로
  2. -v ${pwd}:/usr/src/app 참조할 경로

왜, node_modules 를 무시할 것인가요?
로컬 환경에서 npm i 를 하지 않았으며 종속성 설치는 컨테이너 빌드 절차에서 진행이 됩니다.
따라서 실행 단계에서 이를 참조해서는 안되는 것입니다.

compose

많은 Application 은 SQL, NoSQL 데이터베이스와 연동이 됩니다.
따라서 이러한 경우 N 개의 컨테이너가 필요하지만, 이 둘은 모두 독립된 공간 에 자리하게 됩니다.

따라서 docker-compose.yml 파일을 통해서 N 개의 컨테이너를 매핑하고 동시에 실행해주어야 합니다.

docker-compose up 실행하고 출력 창 계속 보기
docker-compose up -d 실행하고 출력 창에서 나가기

docker-compose down 중지하기 (stop 이므로 안전한 종료입니다.)

추가적으로,
docker-compose up 화면에서 Ctrl+C 을 누르면 docker-compose down 과 동일하게 안전하게 종료할 수 있습니다.

profile
2022년 12월 9일 부터 노션 페이지에서 작성을 이어가고 있습니다.

0개의 댓글