[nodejs] Docker 컨테이너를 활용한 Node.js 마이크로서비스 아키텍처

마이크로서비스 아키텍처는 각기 다른 기능을 수행하는 여러 작은 서비스들로 구성되는데, 이를 독립적으로 배포하고 확장할 수 있습니다. Node.js는 이러한 서비스들을 만들기에 적합한 언어입니다. 또한, Docker를 사용하면 서비스들을 격리된 환경에서 실행할 수 있어 확장성을 높일 수 있습니다.

도커 컨테이너에서 Node.js 애플리케이션 실행

도커는 컨테이너 기술을 통해 응용프로그램을 배포하기 위한 오픈플랫폼입니다. Node.js 애플리케이션을 도커 컨테이너 내에서 실행하면 개발, 테스트 및 배포를 간편하게 할 수 있습니다.

# Dockerfile
FROM node:14

WORKDIR /usr/src/app

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

EXPOSE 3000
CMD ["node", "app.js"]

위의 Dockerfile 예시에서, Node.js를 기반으로 하는 도커 이미지를 생성하고, 포트 3000을 노출하며 애플리케이션을 실행합니다.

도커 컴포즈를 사용한 멀티 컨테이너 관리

도커 컴포즈를 사용하면 여러 개의 컨테이너를 정의하고 실행할 수 있습니다. 이를 통해 여러 Node.js 마이크로서비스들을 쉽게 관리할 수 있습니다.

version: '3'
services:
  users:
    build: ./users
    ports:
      - "3001:3000"
  posts:
    build: ./posts
    ports:
      - "3002:3000"

위의 docker-compose.yml 파일은 usersposts 두 개의 Node.js 마이크로서비스를 정의하고 각각 다른 포트로 노출시킵니다.

마이크로서비스 간 통신

마이크로서비스들은 서로 통신해야 하는데, 이 때 내부 주소 또는 도메인을 사용하여 통신할 수 있습니다. 또는 도커 네트워크를 사용하여 컨테이너들 사이의 통신을 관리할 수도 있습니다.

// 서비스 간 통신 방법
const axios = require('axios');
const usersResponse = await axios.get('http://users:3000');
const postsResponse = await axios.get('http://posts:3000');

위의 예시에서는 axios를 사용하여 usersposts 서비스 간에 HTTP 요청을 보내고 있습니다.

Node.js와 Docker를 활용하면 마이크로서비스 아키텍처를 빠르게 구축하고 실행할 수 있습니다. 이를 통해 애플리케이션의 확장성과 유지보수성을 개선할 수 있습니다.

참고문헌: