기본 Node.js/Nest.js 어플리케이션을 도커화 하기 (번역)

chichi·2023년 1월 2일
0

원문은 Dockerizing a basic Node.js/Nest.js application 에서 확인하실 수 있습니다.


오늘날 우리는 Node.js 어플리케이션을 도커화(dockerize) 하고 있습니다. (또한) 우리는 오늘날 Nest.js 를 사용하고 있습니다.
그러나 (Nest.js의 명령어와 프로세스는) Express.js와 같은 다른 프레임워크를 통해 빌드된 Node.js 어플리케이션과 거의 같습니다.

Nest.js는 무엇이고, 왜 사용하나요?

Nest.js 는 진보적인(발전된) Node.js 프레임워크 입니다. Express 또는 기타 유사한 프레임워크를 사용할 때, Node.js 프로젝트를 구성하는(structure) 방법은 매우 다양합니다. 그러나 (이러한 다양성은) 여러 사람이 같은 프로젝트에서 작업할 때 문제가 될 수 있습니다. Nest.js 는 이런 상황에서 도움이 됩니다. (Nest.js는) 프로젝트 생성 시 특정 패턴을 따르게 하고, 앱의 서로 다른 모듈들을 분리하는 데 도움을 줍니다.

Nest.js 시작하기

먼저 Nest.js CLI 를 설치해야 합니다. 터미널에서 다음 명령어를 실행합니다.

npm i -g @nestjs/cli

설치가 완료되면 이와 같이, 매우 쉽게 새 Nest.js 앱을 스캐폴드(프로젝트 구성)할 수 있습니다.

nest new example-app

초기화 후, 프로젝트 디렉토리로 이동하여 바로 프로젝트를 시작할 수 있습니다.

cd example-app

yarn start:dev

프로젝트는 기본적으로 localhost 의 3000번 포트에서 실행됩니다. 브라우저를 열고 http://localhost:3000/ 으로 이동하면, 'Hello World'를 응답받게 됩니다!
(역주: 해당 내용은 nestjs 공식 가이드에서도 확인할 수 있습니다.)

Docker란 무엇이며, 왜 사용해야 합니까?

Docker는 당신의 어플리케이션을 컨테이너화(containerizng)하는 방법입니다. (이를 통해) 다른 런타임이나 종속성 또는 버전에 대해 걱정할 필요가 없도록 합니다. 도커 이미지가 로컬 시스템에서 실행되면, (그 이미지는) 모든 시스템에서 실행됩니다. 어플리케이션을 쉽게 배포(deploying)하거나, 다른 사람과 (어플리케이션을) 공유하기 좋습니다. 이제 어플을 단계별로 도커화(dockerize) 해 보겠습니다.

1단계: 도커(Docker) 설치

도커 설치를 위해 Docker 설치 가이드 로 이동하세요.

2단계: 프로젝트에 도커(docker) 추가

root 디렉토리에 Dockerfile 이라는 새 파일을 추가합니다.

3단계: Docker 명령어(commands) 추가

Dockerfile 에 다음 코드를 추가합니다.

FROM node:12

WORKDIR /app

ADD package.json /app/package.json

RUN npm install

ADD . /app

EXPOSE 3000

CMD ["npm", "run", "start"]

코드를 한 줄씩 분석해 봅시다.

FROM node:12

여기서는 앱이 실행될 기본 이미지를 설정합니다. 여기서 우리는 node:12 를 선택합니다. 이것은 도커 허브에서 찾을 수 있는 node의 공식 이미지입니다.
(역주: 2023.1 기준 최신 LTS 는 18 입니다. 최신 버전은 Node.js 공식 홈페이지 에서 확인할 수 있습니다.)

WORKDIR /app

app 이라는 작업 디렉토리를 설정합니다.

ADD package.json /app/package.json

package.json 을 작업 디렉토리로 이동합니다.

RUN npm install

root 디렉토리에 일반적인 npm 을 설치합니다.

ADD . /app

컨텐츠를 app 디렉토리로 이동합니다.

컨테이너에 3000번 포트를 노출함으로써, 컨테이너가 컨테이너 외부와 통신할 수 있도록 합니다. 어플리케이션을 실행하는 포트에 의존합니다. nest의 경우 일반적으로 3000 입니다.

CMD ["npm", "run", "start"]

마지막으로 명령을 실행하여 어플을 시작합니다. 모든 dockerfile 은 오직 하나의 CMD 명령어(command)를 가집니다.
(역주: 여러 개의 CMD 명령어가 있을 경우, 마지막 명령만 유효합니다. 공식 문서 를 참고하세요.)

4단계: Docker 이미지 빌드

다음 명령을 실행하여 도커 이미지를 빌드합니다. 프로젝트의 동일한 루트 디렉토리에서 이 명령어을 실행하십시오.

docker build . -t example-app

여기서 -t 를 사용해 이미지의 이름을 지정했습니다. 우리는 이미지에 이름을 정해줄 수 있습니다. 일관성을 위해, 여기서는 프로젝트 이름을 사용하고 있습니다. 이미지를 구축하는 데는 시간이 걸립니다.

5단계: 도커 이미지 실행

(명령어를) 실행하여 이미지를 볼 수 있습니다.

docker images

(명령어는) 머신(machine)의 모든 이미지를 나열합니다.

이미지에 'latest' 태그가 있음을 알 수 있습니다. 이것은 기본적으로 제공됩니다. 원한다면 image의 태그를 바꿀 수 있습니다. 이제 이미지를 실행하기 위해 우선 Ctrl+C 를 눌러 프로젝트가 실행중인 인스턴스를 중지한 후, 다음 명령을 실행합니다.

docker run --rm -it -p 3000:3000/tcp example-app:latest

이 명령은 여러 부분으로 구성되어 있지만, 3000:3000/tcp 를 살펴보는 것이 가장 중요합니다. 여기서 첫 번째 3000 은 실행중인 도커 이미지에 매핑하려는 로컬 호스트의 포트를 의미합니다. 그리고 두 번째 3000 은, 이전에 설정한 도커 컨테이너 내부에서 노출한 포트입니다.
작동 여부를 확인하기 위해, 이전과 같이 브라우저로 이동 해 보겠습니다. http://localhost:3000/ 가 예상대로 작동하는지 확인하세요.

6단계: 가지고 놀기

이제 코드를 변경하고, 이미지를 다시 빌드한 다음 다시 실행하여 도커 이미지에 변경 사항이 있는지 확인할 수 있습니다.
여기에서 프로젝트 코드를 찾을 수 있습니다.

https://github.com/Mohammad-Faisal/example-nestjs-app

LinkedIn 또는 저 Mohammad Faisal 의 개인 웹사이트를 통해 제게 연락 해 주세요.


역자 후기

NestJS 나 NodeJS 를 로컬에서 운용하는 법은 알지만, 도커에서 어떻게 왜 쓰는지는 몰라 고민이었습니다. 그러던 중 Medium Daily Digest 메일에서 해당 아티클이 올라와, 공부 겸 번역을 해 보았습니다. 2020년에 나온 아티클이기 때문에 지금과 다른 부분이 있고, 그 차이를 확인하고 현재에 맞게 코드를 고치는 과정에서 docker 에 대해 공부할 수 있었습니다.

3단계: 도커 명령어 추가

아티클에서 제시한 명령어를 실행했을 때 서버가 제대로 작동하지 않아, 구글링을 통해 작동하는 도커 명령어를 확인하였습니다. dockerfile.dockerignore 와 관련된 자세한 내용은 dev_leewoooo 님의 NestJs Docker Image 만들기 를 참고 해 주세요.

dockerfile

FROM node:18 AS builder

WORKDIR /app

COPY . .

RUN yarn

RUN yarn build

FROM node:18-alpine

WORKDIR /app

ENV NODE_ENV production

COPY --from=builder /app ./

CMD ["yarn", "start:prod"]

.dockerignore

node_module
dist

5단계: 도커 이미지 실행

docker run --rm -it -p 3001:3000/tcp example-app:latest

5단계 내용이 잘 이해되지 않는다면 3000 을 3001 로 바꿔 이미지를 실행하고 http://localhost:3001 에 들어 가보는 것도 좋습니다.

profile
번역글 위주로 다루려 합니다. 오역 및 기타 사항은 해당 게시글에 댓글로 남겨주시면 답변드리겠습니다. 좋은 하루 되세요!

0개의 댓글