컨테이너화는 응용 프로그램, 그 종속성 및 라이브러리를 번들로 묶어 어떤 종류의 인프라에서도 플러그 앤 플레이처럼 사용할 수 있도록 하는 것입니다. 각 번들을 컨테이너라고합니다.
Node.js 서비스를 왜 컨테이너화해야 하나요?
지난 섹션에서 논의한 바에 따르면, Node.js 서비스를 컨테이너화한다는 것은 앱, 그 종속성, 라이브러리 및 심지어 구성을 하나의 컨테이너로 묶는 것을 의미합니다.Node.js 서비스입니다. 컨테이너화는 다음과 같은 이점이 있습니다.
- 휴대용.모든 앱 요구 사항을 컨테이너에 번들로 묶었기 때문에 동일한 이미지를 개발, 스테이징 및 프로덕션에 설치할 수 있습니다.
- 빠르고 가벼움. 컨테이너는 가상 머신(VM)이나 베어 메탈보다 훨씬 빠릅니다. 왜냐하면 컨테이너는 앱의 요구 사항만 실행하므로, 역사적으로 VM이나 베어 메탈은 전체 머신을 시작하고 모든 앱을 실행했기 때문입니다.
- 확장 가능한. 위의 두 가지 이점으로 인해 컨테이너는 빠르고 효율적이며 배포하기 쉬워 확장 가능성이 매우 쉬워집니다.
이 기사에서는 Node.js 앱을 컨테이너화하는 데 특히 초점을 맞출 것입니다.
전제 조건
도구 및 소프트웨어
Docker (Docker Engine 및 Docker CLI)
저희는 컨테이너를 관리하기 위해Docker를 설치해야 합니다. Docker Engine은 런타임을 처리하고 CLI는 명령줄을 통해 상호 작용할 수 있습니다.
Node.js 및 npm/yarn 설치 (초기 개발/테스트용)
라이브러리 의존성을 설치하고 서비스를 실행하기 위해 Node.js와 npm이 설치되어 있어야 합니다.
여러 컨테이너 관리를 위한 Kubernetes 또는 Docker Compose (선택 사항)
여러 컨테이너를 관리하기 위해 Kubernetes 또는 Docker Compose가 필요합니다.
기초
Node.js 애플리케이션 구조:
- 독자가 프로젝트에서 메인 파일(
app.js
또는index.js
)의 역할과package.json
,yarn.lock
과 같은 다른 파일들의 역할을 이미 이해하고 있을 것으로 예상됩니다. - 이 글에서는 또한 컨트롤러, 미들웨어 및 라우트와 같은 프로젝트의 다른 측면에 대해서는 다루지 않습니다.
기본 Docker 명령어 및 Dockerfile 문법
Docker 명령어:
docker ps -> Lists all the containers running on the system
docker pull -> Pulls any image from the docker hub or official registry of Docker
docker build -> Creates an image from the docker file
docker run -> Starts a container from an exiting image
docker stop -> Stops a container if it has crashed or if you want to switch the container
핵심 Dockerfile 명령어:
FROM -> Every DockerFile
WORKDIR -> Set the working directory inside the container
COPY (or ADD) -> Transfers the application's files to the image
RUN -> Executes commands during build time
CMD -> Sets the default command to be run when the container is started from the image
EXPOSE -> Specifies the port the container listens on
ENV -> Sets environment variables used during build and runtime
커버된 모든 테이블과 Node.js 구조는 컨테이너화 및 Node.js 서비스를 배포하는 데 충분합니다.
Node.js 서비스 설정
Node.js 환경 설정은 간단한 과정입니다. 확인하세요 당신이 컴퓨터에 Node.js가 설치되어 있는지. 만약 당신이 의문이 있다면, 부록 (1)을 참조하세요. 설치 후, 터미널을 열고 설치를 확인하세요당신의 설치를 확인하려면 다음을 입력하세요.
node -v
npm -v
프로젝트 디렉토리를 만들고 초기화하세요 당신의 프로젝트를 다음과 같이:
npm init -y
express 모듈을 설치하세요
npm install express
서버 파일을 만드세요, 서버라고 부르겠습니다.mjs, 여기서 라우트와 라우트에 해당하는 로직을 추가할 수 있습니다. 이 기사는 주로 컨테이너화에 관한 것이기 때문에 엔드포인트 로직을 매우 간단하게 유지할 것입니다. 다음과 같은 것:
import express from "express";
const app = express();
const port = 8080;
app.get('/', (req, res) => {
res.send('Welcome to my demo service!');
});
app.listen(port, () => {
console.log(`Demo Service is running on port ${port}`);
});
이제 귀하의 서비스가 시작할 준비가 되었습니다. 터미널에서 프로젝트 디렉토리로 이동하여 이 명령어를 실행하세요:
node server.mjs
서비스가 실행 중입니다. 우리가 다음 주소를 방문하면 http://localhost:3000를, 우리는 다음을 볼 수 있습니다:
“내 서버에 오신 것을 환영합니다”
Dockerfile 생성하기
Dockerfile이 무엇인지 검토해봅시다. Dockerfile은 도커 이미지를 구축하기 위한 지침을 포함합니다. 루트 디렉토리에 Dockerfile을 생성합시다. 이 단계에서, Dockerfile 지침에서 논의한 대로 다음 작업을 수행해야 합니다:
FROM node:18-alpine => Indicate the base image to use. Here we're using the official Nodejs 14 image.
WORKDIR /usr/src/app => Sets the working directory in the container.
COPY package*.json ./ => Duplicate the package.json and package-lock.json files to the working directory.
RUN npm install => Installs the app package dependencies.
COPY . . => Copies the remaining of the app to the working directory.
EXPOSE 8080 => Exposes the port our app is listening on.
CMD ["node", "app.js"] => Defines the command to start your Node.js application.
Docker 이미지 빌드 및 실행
터미널의 루트에서프로젝트으로 이동하여 다음 명령을 실행합니다:
docker build -t image-name .
여기서 이미지-이름
은 Docker 이미지의 이름입니다. 끝에 있는 .
는 현재 디렉토리로 컨텍스트를 설정합니다.
이미지가 빌드된 후에, 우리는 컨테이너를 생성하고 다음 명령을 사용하여 Node.js 앱을 실행합니다:
docker run --name container-name -p 8080:8080 image-name
위 작업이 성공적으로 완료되면, 여러분은 서비스가 작동 중임을 확인할 수 있습니다. docker ps
를 실행한 다음 이전과 동일한 localhost URL로 이동합니다.
이미지를 레지스트리에 푸시하기
이제 당신의 이미지가 준비되었으니, 레지스트리에 푸시할 시간입니다. 이 글의 범위 내에서, Docker Hub에만 푸시해 봅시다. Docker Hub는 Docker 컨테이너 이미지를 저장, 공유 및 관리하는 클라우드 기반 서비스입니다.
https://hub.docker.com/에서 계정을 만들고 당신의 계정으로 로그인합니다.
docker login
로그인한 후, 로컬에서 빌드한 이미지를다음과 같이 추가할 수 있습니다:여기서:
docker tag image-name:tag dockerhub-username/repository-name:tag
tag
는latest
또는 버전 번호입니다.repository-name
은 원하는 저장소 이름입니다.
다음으로, 이미지를 다음과 같이 푸시합니다:
docker push dockerhub-username/repository-name:tag
결론
우리가 볼 수 있듯이, 컨테이너화는 의존성을 분리하여 복잡한 워크플로우와 서비스를 빠르고 휴대 가능하며 확장 가능하게 만듭니다. 한번 구현되면 전체 팀이 혜택을 받습니다.저는 다중 단계 빌드와 컨테이너 네트워킹과 같은 고급 기능을 탐색하도록 권장합니다.또한 쿠버네티스와 같은 오케스트레이션 도구 및 CI/CD 파이프라인 통합에 대해 학습해 개발 워크플로우를 최적화하는 것을 고려해보세요.
부록
Source:
https://dzone.com/articles/containerization-of-a-nodejs-service