Study & Project ✏️/Docker

[docker-compose] - node.js docker-compose 예제, docker-compose network간 통신

JM 2023. 9. 11. 00:48
반응형

docker-compose를 이용해 컨테이너 간 통신을 해보고 네트워크 구성을 해보자.

  • Dockerfile을 이용한 buildDockerfile 실행 및 터미널 접속을 해봤었다.
    실제 프로그램은 웹서버 - DB, 프론트 - 백서버 등 다양한 컨테이너들이 합쳐져서 실행되는데, 해당 프로세스를 구성하기 위해 docker-compose를 이용해 한번에, 편하게 컨테이너를 구성해봤다.

  • 우선 server-response는 앞전에 진행했던 예제를 사용해서 구성하고, 5초에 한번씩 server-response로 요청을 보내는 server-request를 똑같이 만들어보겠다.

npm init, Dockerfile 생성 및 기타 설정은 server-response에서 참고하길 바란다.

// server-request index.js
function sendGetRequest() {
    // http://<targer containerID>:<port>
    fetch('http://server-response:5001/', {
        method: 'GET'
    })
        .then(response => {
            if (!response.ok) {
                throw new Error('네트워크 오류');
            }
            return response.text();
        })
        .then(data => {
            console.log('데이터를 받았습니다:', data);
        })
        .catch(error => {
            console.error('오류 발생:', error);
        });
}

setInterval(sendGetRequest, 5000);

해당 코드에서 중요한 부분은 fetch를 보내는 url의 주소가 target container ID라는 점이다.


이제 response와, request 부분을 완성했으니, 두 컨테이너의 오케스트레이션을 위한 docker-compose를 작성해보자

  • docker-compose는 빌드할때 별도 네트워크를 지정하지 않아도 같은 빌드 컨테이너를 default 네트워크에 묶어준다.
    docker-compose를 실행하는 디렉토리는 다음과 같다.
# docker-compose.yml
version: '1.0'

services:
  server-response:
    build:
      context: ./server-response
      dockerfile: Dockerfile
    ports:
      - 5001:5001

  server-request:
    depends_on:
      - server-response
    build:
      context: ./server-request
      dockerfile: Dockerfile
  • docker-compose는 services에 컨테이너를 묶고, build, port 등등의 옵션으로 컨테이너를 빌드한다.
    • build - context : build하려는 Dockerfile이 위치한 디렉토리 위치
    • build - dockerfile : build하려는 Dockerfile명
    • ports : <외부 : 내부> 포트 연결 옵션
    • depends_on : 선행되는 build 옵션 표시
  • 여기서 한가지 의문점이 들 수 있는데, 바로 Dockerfile에 있는 EXPOSE와 docker-compose에 있는 ports 옵션의 차이점이다.
    • Dockerfile의 EXPOSE : 도커 컨테이너가 실행될 때 listen 할 포트 번호
    • docker-compose의 ports : 도커 컨테이너의 <외부 : 내부> 포트 연결

      ports 옵션을 통해 server-response의 5001번과 외부에서 접속하는 5001번을 연결시켜준다.

이제 docker-compose up을 실행시켜 두 컨테이너의 상호작용을 볼 수 있다.