콘텐츠로 이동

🚀 컨테이너 구성 정보

학습 안내

MDRM 솔루션을 구성하는 주요 마이크로서비스들의 역할과 Docker Compose 환경 설정을 학습합니다. docker-compose.yml 파일을 통해 각 컨테이너의 역할과 상호작용을 이해할 수 있습니다.

1. 서비스 구성 개요

MDRM은 가용성과 확장성을 확보하기 위해 마이크로서비스 아키텍처(MSA)를 채택하고 있습니다. 모든 주요 컴포넌트는 Docker 컨테이너로 실행되며, 이를 통합 관리하기 위해 Docker Compose를 사용합니다.

주요 컨테이너 역할 정의

컨테이너 명 기능 및 역할 주요 포트
nginx-gateway 웹 서비스 진입점 (API Gateway 및 정적 파일 서빙) 80, 443
mdrm-ui / dashboard-ui 관리자 콘솔 및 통합 대시보드 화면 -
mdrm-iam 계정 인증 및 권한 관리 (Keycloak 기반) -
mdrm-postgres 메인 시스템 데이터베이스 5433
mdrm-rabbitmq 각 서비스 간 통신을 위한 메시지 브로커 5673
mdrm-controller 솔루션의 핵심 비즈니스 로직 제어 -
workflow-controller 워크플로우 설계 및 복구 시나리오 엔진 -
task-worker 할당된 작업을 실제 수행하는 워커 유닛 -

2. 환경 변수 설정 (.env)

docker-compose.yml에서 사용하는 동적 변수들은 같은 디렉토리에 위치한 .env 파일에 정의되어 있습니다. 설치 환경에 따라 이 파일의 내용을 수정하여 경로 및 포트를 변경할 수 있습니다.

MDRM_HOME=/mdrm/data
HOSTNAME=UZOOGOM-LINUX
MDRM_PORT=443

주요 변수 설명

변수명 용도 설명
MDRM_HOME 데이터 및 설정 저장 경로 솔루션의 바이너리, 로그, DB 데이터가 저장되는 최상위 경로입니다.
HOSTNAME 서비스 접속 주소 (FQDN) 웹 브라우저 접속 및 서비스 내부 인증 시 사용되는 호스트네임입니다.
MDRM_PORT 서비스 리스닝 포트 Nginx가 외부 요청을 받을 포트 번호입니다.

3. docker-compose.yml 상세 분석

MDRM 설치 디렉토리의 docker-compose.yml 설정 내용입니다. 이 설정은 서비스 간의 의존성, 볼륨 마운트, 환경 변수 등을 정의합니다.

환경 변수 활용

docker-compose.yml 내의 ${MDRM_HOME}, ${HOSTNAME} 등은 앞에서 살펴본 .env 파일의 값을 참조하여 동작합니다.

services:
  mdrm-iam:
    image: docker-registry.mantech.co.kr/mdrm-iam:latest
    container_name: mdrm-iam
    hostname: mdrm-iam
    environment:
      - KC_HOSTNAME_ADMIN_URL=https://${HOSTNAME}/mdrm-iam # keycloak admin console
    volumes:
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
      - ${MDRM_HOME}/bin/config/keycloak/import:/opt/keycloak/data/import # realm info
      - ${MDRM_HOME}:/gampkgs/data
    depends_on:
      - mdrm-postgres
    networks:
      - mdrm
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"
    restart: always

  mdrm-postgres:
    image: docker-registry.mantech.co.kr/mdrm-postgres:latest
    container_name: mdrm-postgres
    hostname: mdrm-postgres
    volumes:
      - ${MDRM_HOME}/bin/config/postgresql/postgresql.conf:/etc/postgresql/postgresql.conf
      - ${MDRM_HOME}/bin/config/postgresql/pg_hba.conf:/etc/postgresql/pg_hba.conf
      - ${MDRM_HOME}/postgresql/data/16/main:/var/lib/postgresql/data
    ports:
      - "5433:5433"
    shm_size: 4gb
    networks:
      - mdrm
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  mdrm-rabbitmq:
    image: docker-registry.mantech.co.kr/mdrm-rabbitmq:latest
    container_name: mdrm-rabbitmq
    hostname: mdrm-rabbitmq
    volumes:
      - ${MDRM_HOME}/bin/config/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    ports:
      - "5673:5673"
    networks:
      - mdrm
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  auth-controller:
    image: docker-registry.mantech.co.kr/mdrm-base:latest
    container_name: auth-controller
    hostname: auth-controller
    networks:
      - mdrm
    volumes:
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
      - gam-scripts:/gampkgs/scripts/
      - ${MDRM_HOME}/bin/app/auth-controller:/opt/mdrm
    environment:
      - spring.profiles.active=default,prod
      - CONTAINER_NAME=auth-controller
    depends_on:
      - mdrm-rabbitmq
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  workflow-controller:
    image: docker-registry.mantech.co.kr/mdrm-base:latest
    container_name: workflow-controller
    hostname: workflow-controller
    networks:
      - mdrm
    environment:
      - CONTAINER_NAME=workflow-controller
      - spring.profiles.active=default,prod
    volumes:
      - gam-scripts:/gampkgs/scripts
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
      - ${MDRM_HOME}:/gampkgs/data
      - ${MDRM_HOME}/bin/app/workflow-controller:/opt/mdrm
    depends_on:
      - mdrm-rabbitmq
      - mdrm-postgres
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  alert-controller:
    image: docker-registry.mantech.co.kr/mdrm-base:latest
    container_name: alert-controller
    hostname: alert-controller
    networks:
      - mdrm
    environment:
      - CONTAINER_NAME=alert-controller
      - spring.profiles.active=default,prod
    volumes:
      - gam-scripts:/gampkgs/scripts
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
      - ${MDRM_HOME}/bin/app/alert-controller:/opt/mdrm
      - ${MDRM_HOME}:/gampkgs/data
    depends_on:
      - mdrm-rabbitmq
      - mdrm-postgres
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  schedule-controller:
    image: docker-registry.mantech.co.kr/mdrm-base:latest
    container_name: schedule-controller
    hostname: schedule-controller
    networks:
      - mdrm
    volumes:
      - gam-scripts:/gampkgs/scripts/
      - ${MDRM_HOME}/bin/app/schedule-controller:/opt/mdrm
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
    environment:
      - CONTAINER_NAME=schedule-controller
      - spring.profiles.active=default,prod
    depends_on:
      - mdrm-postgres
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  mdrm-controller:
    image: docker-registry.mantech.co.kr/mdrm-base:latest
    container_name: mdrm-controller
    hostname: mdrm-controller
    networks:
      - mdrm
    volumes:
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
      - ${MDRM_HOME}:/gampkgs/data
      - gam-scripts:/gampkgs/scripts/
      - ${MDRM_HOME}/bin/app/mdrm-controller:/opt/mdrm
    environment:
      - CONTAINER_NAME=mdrm-controller
      - spring.profiles.active=default,prod
    depends_on:
      - mdrm-rabbitmq
      - mdrm-postgres
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  task-worker:
    image: docker-registry.mantech.co.kr/mdrm-base:latest
    container_name: task-worker
    hostname: task-worker
    networks:
      - mdrm
    environment:
      - CONTAINER_NAME=task-worker
      - spring.profiles.active=default,prod
    volumes:
      - gam-scripts:/gampkgs/scripts
      - ${MDRM_HOME}/bin/app/task-worker:/opt/mdrm
      - ${MDRM_HOME}:/gampkgs/data
    depends_on:
      - mdrm-rabbitmq
      - mdrm-postgres
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  mdrm-logstash:
    image: docker-registry.mantech.co.kr/mdrm-logstash
    container_name: mdrm-logstash
    hostname: mdrm-logstash
    ports:
      - "5001:5001"
    restart: always
    volumes:
      - ${MDRM_HOME}/bin/config/logstash/config:/usr/share/logstash/config
      - ${MDRM_HOME}/bin/config/logstash/pipeline:/usr/share/logstash/pipeline
      - ${MDRM_HOME}/bin/config/logstash/jdbc:/usr/share/logstash/jdbc
    networks:
      - mdrm
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"
  mdrm-ui:
    image: docker-registry.mantech.co.kr/mdrm-ui:latest
    container_name: mdrm-ui
    hostname: mdrm-ui
    volumes:
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
    networks:
      - mdrm
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  dashboard-ui:
    image: docker-registry.mantech.co.kr/dashboard-ui:latest
    container_name: dashboard-ui
    hostname: dashboard-ui
    volumes:
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
    networks:
      - mdrm
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"
  nginx-gateway:
    image: docker-registry.mantech.co.kr/nginx-gateway
    container_name: nginx-gateway
    hostname: ${HOSTNAME}
    volumes:
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
      - ${MDRM_HOME}/bin/config/nginx/conf.d:/etc/nginx/conf.d/
      - gam-scripts:/gampkgs/scripts
      - ${MDRM_HOME}/:/gampkgs/data/
    ports:
      - "80:80"
      - "${MDRM_PORT}:${MDRM_PORT}"
    networks:
      - mdrm
    depends_on:
      - mdrm-ui
      - workflow-controller
      - gam
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

  gam:
    image: docker-registry.mantech.co.kr/gam:latest
    container_name: gam
    hostname: gam
    environment:
      - GAMHOSTNAME=${HOSTNAME}
    volumes:
      - gam-scripts:/gampkgs/scripts
      - ${MDRM_HOME}:/gampkgs/data
      - ${MDRM_HOME}/bin/config/ssl:/gampkgs/ssl/
    networks:
      - mdrm
    depends_on:
      - mdrm-rabbitmq
      - mdrm-postgres
    privileged: true
    restart: always
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "100m"

volumes:
  gam-scripts:
networks:
  mdrm:

4. 네트워크 및 스토리지 구성

  • 네트워크 (Bridge): mdrm이라는 가상 네트워크를 통해 컨테이너 간 내부 통신이 이루어집니다.
  • 볼륨 마운트 (Persistence):
    • /gampkgs/data: 공용 데이터 저장소
    • /var/lib/postgresql/data: 데이터베이스 영구 저장 영역
    • /gampkgs/scripts: 엔진 및 에이전트 스크립트 공유 볼륨