Sharding Cluster 만들기(2) : docker compose 파일

arky uhm·2025년 5월 23일

MongoDB

목록 보기
9/14

✅ docker-compose_replica_shard.yml

version: "3.8"

services:
  # --- Config Server Replica Set (CSRS) ---
  config1:
    image: mongo:latest
    hostname: config1
    container_name: config1
    restart: always
    ports:
      - "30011:27017"
    volumes:
      - ./data/config1:/data/db
      - ./mongod_config.conf:/etc/mongod.conf
      - ./logs/config1:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongod", "--config", "/etc/mongod.conf", "--configsvr"]
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  config2:
    image: mongo:latest
    hostname: config2
    container_name: config2
    restart: always
    ports:
      - "30012:27017"
    volumes:
      - ./data/config2:/data/db
      - ./mongod_config.conf:/etc/mongod.conf
      - ./logs/config2:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongod", "--config", "/etc/mongod.conf", "--configsvr"]
    depends_on:
      - config1
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  config3:
    image: mongo:latest
    hostname: config3
    container_name: config3
    restart: always
    ports:
      - "30013:27017"
    volumes:
      - ./data/config3:/data/db
      - ./mongod_config.conf:/etc/mongod.conf
      - ./logs/config3:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongod", "--config", "/etc/mongod.conf", "--configsvr"]
    depends_on:
      - config1
      - config2
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  # --- Shard 1 Replica Set (Shard1RS) ---
  shard1_a:
    image: mongo:latest
    hostname: shard1_a
    container_name: shard1_a
    restart: always
    ports:
      - "30021:27017"
    volumes:
      - ./data/shard1_a:/data/db
      - ./mongod_shard.conf:/etc/mongod.conf
      - ./logs/shard1_a:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongod", "--config", "/etc/mongod.conf", "--shardsvr"]
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  shard1_b:
    image: mongo:latest
    hostname: shard1_b
    container_name: shard1_b
    restart: always
    ports:
      - "30022:27017"
    volumes:
      - ./data/shard1_b:/data/db
      - ./mongod_shard.conf:/etc/mongod.conf
      - ./logs/shard1_b:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongod", "--config", "/etc/mongod.conf", "--shardsvr"]
    depends_on:
      - shard1_a
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  shard1_c:
    image: mongo:latest
    hostname: shard1_c
    container_name: shard1_c
    restart: always
    ports:
      - "30023:27017"
    volumes:
      - ./data/shard1_c:/data/db
      - ./mongod_shard.conf:/etc/mongod.conf
      - ./logs/shard1_c:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongod", "--config", "/etc/mongod.conf", "--shardsvr"]
    depends_on:
      - shard1_a
      - shard1_b
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  # --- Mongos Routers ---
  mongos1:
    image: mongo:latest
    hostname: mongos1
    container_name: mongos1
    restart: always
    ports:
      - "30001:27017"
    volumes:
      - ./mongos.conf:/etc/mongos.conf
      - ./logs/mongos1:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongos", "--config", "/etc/mongos.conf"]
    depends_on:
      - config1
      - config2
      - config3
      - shard1_a
      - shard1_b
      - shard1_c
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  mongos2:
    image: mongo:latest
    hostname: mongos2
    container_name: mongos2
    restart: always
    ports:
      - "30002:27017"
    volumes:
      - ./mongos.conf:/etc/mongos.conf
      - ./logs/mongos2:/var/log/mongodb
      - ./certs:/etc/ssl/mongodb
    command: ["mongos", "--config", "/etc/mongos.conf"]
    depends_on:
      - config1
      - config2
      - config3
      - shard1_a
      - shard1_b
      - shard1_c
    networks:
      - shardMongoCluster_net
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

networks:
  shardMongoCluster_net:
    name: shardMongoCluster_net
    
  • 주요 필드 설명
    • version: "3.8"
      . Docker Compose 파일 형식의 버전을 지정합니다. 버전 "3.8"은 특정 기능 세트를 지원하며, 최신 Docker 엔진과의 호환성을 보장합니다. 일반적으로 버전 3.x를 사용합니다.
    • services:
      • 이 섹션은 실행될 모든 컨테이너 서비스들을 정의하고 각 서비스는 하나의 독립적인 컨테이너 인스턴스를 나타냅니다.
        • 서비스_이름 (예: config1, shard1_a, mongos1, mongos2)
          • 각 서비스의 고유한 이름입니다. 이 이름은 Docker Compose 네트워크 내에서 해당 컨테이너의 호스트 이름(hostname)으로 사용될 수 있으며, docker-compose 명령에서 참조하는 이름이 됩니다.
          • 예시 : mongos.conf에서 config1:27017과 같이 컨테이너 이름으로 다른 서비스를 참조할 때 사용됩니다.
          • image: mongo:latest
            . 이 서비스에 사용할 Docker 이미지의 이름과 태그를 지정합니다. mongo:latest는 Docker Hub에서 최신 MongoDB 이미지를 다운로드하여 사용하라는 의미입니다.
          • hostname: config1 (또는 shard1_a, mongos1 등)
            . 컨테이너 내부에서 설정될 호스트 이름을 명시적으로 지정합니다. 이는 MongoDB 레플리카 셋 및 샤딩 구성에서 매우 중요합니다. MongoDB는 내부적으로 이 호스트 이름을 사용하여 멤버를 식별하고 통신합니다.
          • container_name: config1 (또는 shard1_a, mongos1 등)
            . 이 컨테이너 인스턴스에 고정된 이름을 부여합니다. docker ps 명령 등으로 컨테이너를 쉽게 식별하고 관리할 수 있게 해줍니다. hostname과 container_name을 동일하게 설정하는 것이 일반적입니다.
          • restart: always
            . 컨테이너가 예기치 않게 종료되거나 Docker 데몬이 재시작될 때, 항상 컨테이너를 재시작하도록 설정합니다. 이는 서비스의 지속성과 가용성을 높이는 데 필수적입니다.
          • ports: - "HOST_PORT:CONTAINER_PORT" (예: "30011:27017")
            . Docker 호스트의 포트(HOST_PORT)를 컨테이너 내부의 포트(CONTAINER_PORT)에 매핑합니다.
            . HOST_PORT : 외부(호스트 컴퓨터의 다른 애플리케이션, 인터넷)에서 컨테이너에 접근할 때 사용하는 포트입니다.
            . CONTAINER_PORT : 컨테이너 내부에서 서비스(MongoDB)가 실제로 리스닝하는 포트입니다.
            . 예시 : 30011:27017은 호스트의 30011번 포트로 들어오는 연결을 컨테이너 내부의 27017번 포트로 전달하라는 의미입니다.
          • volumes:
            . 호스트 머신의 파일 시스템 경로 또는 Docker 볼륨을 컨테이너 내부의 경로에 마운트합니다. 이는 데이터의 지속성, 설정 파일 주입, 로그 저장 등에 사용됩니다.
            . - ./data/config1:/data/db: 호스트의 data/config1 디렉토리를 컨테이너 내부의 /data/db 경로에 마운트합니다. MongoDB의 데이터 파일이 여기에 저장되어 컨테이너가 삭제되어도 데이터는 보존됩니다.
            . - ./mongod_config.conf:/etc/mongod.conf: 호스트의 mongod_config.conf 파일을 컨테이너 내부의 /etc/mongod.conf 경로에 마운트하여 MongoDB 서버가 이 설정 파일을 사용하도록 합니다.
            . - ./logs/config1:/var/log/mongodb: 호스트의 logs/config1 디렉토리를 컨테이너 내부의 /var/log/mongodb에 마운트하여 MongoDB 로그가 호스트에 저장되도록 합니다.
            . - ./certs:/etc/ssl/mongodb: 호스트의 certs 디렉토리를 컨테이너 내부의 /etc/ssl/mongodb에 마운트하여 TLS/SSL 인증서 파일에 접근할 수 있도록 합니다.
          • command: ["mongod", "--config", "/etc/mongod.conf", "--configsvr"]
            . 컨테이너가 시작될 때 실행될 명령어를 지정합니다. mongo:latest 이미지의 기본 명령어를 오버라이드합니다.
            . mongod : MongoDB 서버 프로세스를 시작합니다.
            . --config /etc/mongod.conf : 마운트된 설정 파일을 사용하도록 지시합니다.
            . --configsvr / --shardsvr : 해당 mongod 인스턴스가 Config Server 또는 Shard Server 역할을 하도록 명시적으로 지정합니다 (설정 파일에 clusterRole이 명시된 경우 생략 가능하지만, 명시적으로 포함하는 것이 안전).
            . mongos: Mongos 라우터 프로세스를 시작합니다.
          • depends_on:
            . 특정 서비스가 시작되기 전에 다른 서비스가 시작되어야 함을 Docker Compose에 알립니다. 컨테이너의 시작 순서를 제어하지만, 해당 서비스 내부의 애플리케이션이 완전히 "준비"될 때까지 기다리지는 않습니다.
            . 예시 : mongos1이 config1, config2, config3, shard1_a 등의 컨테이너들이 시작된 후에 시작되도록 합니다.
          • networks:
            . 해당 서비스를 어떤 Docker 네트워크에 연결할지 지정합니다
            . - shardMongoCluster_net: 이 서비스가 shardMongoCluster_net이라는 사용자 정의 네트워크에 포함되도록 합니다. 이 네트워크 내의 컨테이너들은 서로 컨테이너 이름으로 통신할 수 있습니다.
          • logging:
            . 컨테이너의 로깅 동작을 구성합니다.
            . driver: "json-file": 로그를 JSON 형식의 파일로 저장합니다.
            . options: 드라이버에 대한 추가 옵션을 지정합니다.
            . max-size: "10m": 각 로그 파일의 최대 크기를 10MB로 제한합니다.
            . max-file: "3": 보존할 로그 파일의 최대 개수를 3개로 제한합니다 (순환 로깅).
    • networks:
      • Docker Compose 파일에서 사용할 사용자 정의 네트워크를 정의합니다.
        • shardMongoCluster_net:
          • 네트워크의 논리적인 이름입니다. services 섹션에서 컨테이너들이 이 이름을 사용하여 네트워크에 연결됩니다.
          • name: shardMongoCluster_net
            . Docker 호스트에 생성될 실제 네트워크의 이름을 명시적으로 지정합니다. 이렇게 하면 Docker Compose 프로젝트 이름과 관계없이 일관된 네트워크 이름을 유지할 수 있습니다.

0개의 댓글