[Docker] mongodb & replica set - ysp-laonpeople/DOC GitHub Wiki

docker를 사용한 mongodb

  • mongodb를 doceker로 구동하는 방법에 관해 설명합니다.
  • mongo-express와 함께 구동시켜 별도의 클라이언트(3t,compass등)없이 DB 관리가 가능합니다.

mongodb 단일 구성

docker-compose.yml

# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo:latest
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - "d:/docker/mongodb/configdb:/data/configdb"
      - "d:/docker/mongodb/db:/data/db"

  mongo-express:
    image: mongo-express:latest
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/

environment

    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
  • 초기 설정값으로 불필요시 제거 가능합니다.

volumes

    volumes:
      - "d:/docker/mongodb/configdb:/data/configdb"
      - "d:/docker/mongodb/db:/data/db"
  • docker의 container가 삭제되거나 재생성 되더라고 db의 내용을 유지하려면
  • 절대 경로와 마운트 설정이 필요합니다.
  • 왼쪽이 로컬 경로 오른쪽이 도커내부 경로입니다.

실행

  • docker-compose.yml 파일의 폴더로 이동합니다.
  • 다음 명령어로 실행합니다.
docker-compose up -d

mongodb express

  • image

mongodb replica set 구성

  • 장애 상황 대응을 위해 동일 구성의 DB를 replica set으로 묶어서 관리가 가능합니다.

docker-compose.yml

version: '3.8'

services:
  mongo1:
    container_name: mongo1
    image: mongo:4.4
    volumes:
      - "d:/docker/mongodb-replset/data1:/data/db"
      - "./rs-init.sh:/scripts/rs-init.sh:ro"
    networks:
      - mongors-network    
    expose:
      - 27017
    ports:
      - 27021:27017
    links:
      - mongo2
      - mongo3
    restart: always
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
    #entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0", "--journal", "--dbpath", "/data/db", "--enableMajorityReadConcern", "false", "--port", "27018" ]
  mongo2:
    container_name: mongo2
    image: mongo:4.4
    volumes:
      - "d:/docker/mongodb-replset/data2:/data/db"
    networks:
      - mongors-network  
    expose:
      - 27017        
    ports:
      - 27022:27017
    restart: always
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
  mongo3:
    container_name: mongo3
    image: mongo:4.4  
    volumes:
      - "d:/docker/mongodb-replset/data3:/data/db"
    networks:
      - mongors-network     
    expose:
      - 27017       
    ports:
      - 27023:27017
    restart: always
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]

networks:
  mongors-network:
    driver: bridge
  • mongodb 3개를 replica set으로 구성합니다.
  • mongo1이 primary가 되고 mongo2,3은 secondary가 됩니다.
  • 최소 3개 이상의 구성이 필요합니다.

rs-init.sh

  • replica set을 초기화 하기 위한 파일입니다.
  • mongo1에 command로 직접 실행해도 상관 없습니다.
  • 우선순위에 따라 mongo1을 primary로 mongo2,3을 secomdary로 설정합니다.
#!/bin/bash

mongo <<EOF
var config = {
    "_id": "dbrs",
    "version": 1,
    "members": [
        {
            "_id": 1,            
            "host": "mongo1:27017",
            "priority": 3
        },
        {
            "_id": 2,
            "host": "mongo2:27017",
            "priority": 2
        },
        {
            "_id": 3,
            "host": "mongo3:27017",
            "priority": 1
        }
    ]
};
rs.initiate(config, { force: true });
rs.status();
EOF

실행

#!/bin/bash

docker-compose up -d

sleep 5

docker exec mongo1 /scripts/rs-init.sh
  • mongodb1,2,3을 docker로 실행합니다.
  • docker가 정상 구동시까지 대기합니다.
  • mongodb1을 primary로 설정하도록 설정 파일을 실행합니다.
    • db가 정상적으로 실행되지 않을 경우 오류가 발생하며 다시 다시 실행하면됩니다.
mongodb://127.0.0.1:27021,127.0.0.1:27022,127.0.0.1:27023/?replicaset=dbrs
  • 해당 접속 문자열을 통해 replicaset에 접속합니다.

이슈사항

  • windows에서 replicaset을 docker로 구성시 port연결 오류가 발생합니다.
    • docker 내부에서는 각 replicaset에 정상적으로 접근이 가능합니다.
  • windows에서 개별 DB로 접속은 가능하지만 replicaset으로 접속시 오류가 발생합니다.
  • 물리적으로 다른 pc 3개로 구성이 필요합니다.
    • 해결을 위해 알아보았으나 찾지 못하였습니다.
    • 내부적으로는 27017을 사용하나 windows에서는 서로 다른 port에 매칭됩니다.