Docker

docker-compose로 여러 컨테이너를 동시에 실행해보자 [Docker]

rexondex 2024. 11. 14. 16:14

docker-compose를 사용하여 Spring Boot 컨테이너와 Node.js 컨테이너를 동시에 실행하고, API 통신을 완성하는 것이 목표입니다.

- Node.js 컨테이너미들웨어 역할을 하며, API Gateway 또는 Web Gateway로 동작합니다. 이 컨테이너는 Spring Boot의 H2 메모리 데이터베이스에 접근하여 데이터를 읽고 쓸 수 있고, HTML을 통해 조작 가능한 인터페이스도 제공합니다.

- Spring Boot 컨테이너백엔드 서버 역할로, 데이터베이스와 REST API를 제공합니다. Spring Boot의 RestController를 통해 Node.js에서 URI 요청을 받아 REST 통신을 수행합니다.

이 구조를 통해 Node.js는 프론트엔드 요청을 처리하고, Spring Boot는 데이터베이스와 API 요청을 관리하여, 완전한 다중 컨테이너 환경에서 원활한 데이터 통신과 관리를 가능하게 합니다.


docker-compose를 실행할 폴더 구조

 

- 두가지 마이크로서비스를 사용할 것입니다. 아래 게시물을 참고해주세요!

 

1. Node 마이크로서비스를 Docker 컨테이너화 해보자 [REST]

https://rexondex.tistory.com/38

 

Node 마이크로서비스를 Docker 컨테이너화 해보자 [REST]

노드 마이크로서비스를 도커 컨테이너화하여 실행 성공하는것이 이번 게시글의 목표입니다. # 준비물 :Node.js 설치 [ https://nodejs.org/en/download/package-manager ]Docker 설치 [ https://www.docker.com/products/do

rexondex.tistory.com

 

2. Docker로 스프링부트 JAR을 컨테이너화 해보자 [H2DB]

https://rexondex.tistory.com/36

 

Docker로 스프링부트 JAR을 컨테이너화 해보자 [H2DB]

자바 스프링부트와 AWS 클라우드 배포를 생각하던 중 도커와 쿠버네티스의 역할이 궁금해졌습니다. 그래서 이번엔 도커에 대한 궁금증을 풀기 위해 스프링부트 jar 파일을 도커 컨테이너화하고,

rexondex.tistory.com

 


 

1. docker-compose.yml 내용 작성

version: '3.8'
services:
  userservice:
    build:
      context: ./springboot   # Spring Boot 서비스 디렉터리에서 Dockerfile 빌드
    ports:
      - "8080:8080"           # Spring Boot 포트 설정
    networks:
      - my-network            # 네트워크 설정

  webgateway:
    build:
      context: ./node         # Node.js 서비스 디렉터리에서 Dockerfile 빌드
    ports:
      - "3000:3000"           # Node.js 포트 설정
    depends_on:
      - userservice           # Node.js 서비스가 Spring Boot 서비스에 의존
    networks:
      - my-network            # 동일 네트워크에 배치

networks:
  my-network:                 # 네트워크 설정
    driver: bridge

 

2. 콘솔(파워쉘 등)에서 docker-compose 실행합니다

docker-compose up --build

docker-compose 동작 확인

 


 

# 두 마이크로서비스가 동시에 실행되었는지 확인해봅니다.

 

[ localhost:3000 접속 ]

localhost:3000 / 노드 컨테이너

 

[ localhost:8080 접속 ]

localhost:8080 / 스프링부트 컨테이너

 

# 두 컨테이너 모두 제대로 실행된 것을 확인했습니다.


:: 후기 ::

Spring Boot 컨테이너에서는 Create(생성), Read(읽기), Delete(삭제) 작업을 수행할 수 있고, Node.js 컨테이너에서는 Create와 Read 작업만 수행할 수 있습니다.

localhost:8080에 접속하면 기본적인 REST 기능을 테스트할 수 있는 index.html 파일이 반환되어 인터페이스를 통해 조작할 수 있습니다. 그러나 실제 데이터 작업은 Spring Boot의 RestController 클래스에 매핑된 URI를 통해 처리됩니다.

index.html은 주로 테스트 화면 역할을 하며, 실질적인 데이터 처리 기능은 RestController 클래스가 맡고 있습니다.

Node.js 컨테이너는 Spring Boot의 RestController로 URI 요청을 보내어 Spring Boot 컨테이너가 데이터베이스 작업을 수행하도록 요청합니다. Node.js 컨테이너에서 할 수 있는 작업은 데이터 읽기(새로고침)와 데이터 생성(Create)이며, Spring Boot 컨테이너는 Read, Create, Delete 작업을 모두 지원합니다.

만약 Node.js 컨테이너에서 Delete 작업도 가능하게 하려면, index.js에 필요한 엔드포인트 요청을 추가하여, 적절한 URI로 Delete 요청을 보낼 수 있도록 설정하면 됩니다.


:: 결과 ::

docker-compose를 사용해 Spring Boot와 Node.js 두 컨테이너를 동시 실행한 후,

서로 다른 언어로 작성된 서비스 간의 상호작용을 확인할 수 있었습니다.

 

각 컨테이너가 서로 다른 포트(8080 / 3000)에서 실행되지만,

올바른 엔드포인트 요청이 전달되면 의도한 동작을 성공적으로 수행한다는 점을 확인했습니다.