✅ 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 프로젝트 이름과 관계없이 일관된 네트워크 이름을 유지할 수 있습니다.