Programming/Databse

[MongoDB | Docker] DockerCompose로 MongoDB ReplicaSet 구성하기.

비만오리 2021. 4. 16. 23:21

 

docker-compose를 이용해 간단히 MongoDB ReplicaSet을 구성하는 방법에 대해 알아보도록 합니다.

 

참고 소스는 다음 git 저장소에서 확인할 수 있습니다: MongoDBReplicaSetTest

 

GitHub - smoh-dev/MongoDBReplicaSetTest: https://smoh.tistory.com/419

https://smoh.tistory.com/419. Contribute to smoh-dev/MongoDBReplicaSetTest development by creating an account on GitHub.

github.com

 

 

 

0. Docker Desktop 설치

 

Docker Container로 배포를 위해선 개발 환경에 docker가 설치되어 있어야 합니다. 공식 홈페이지로 이동해 Docker Desktop을 설치합니다: www.docker.com/products/docker-desktop

 

Docker Desktop for Mac and Windows | Docker

Learn why Docker Desktop is the preferred choice for millions of developers building containerized applications. Download for Mac or Windows.

www.docker.com

 

 

 

1. Replica set 구성을 위한 js 파일 작성.

 

MongoDB에서 ReplicaSet을 설정하기 위한 js 파일을 작성합니다.

 

// init/
config = {
  _id : "replication",
  members: [
    {_id:0,host : "mongo1:27017"},
    {_id:1,host : "mongo2:27017"},
    {_id:2,host : "mongo3:27017"},
  ]
}
rs.initiate(config);
rs.conf();

 

members를 보면 알 수 있듯이 mongo1, mongo2, mongo3의 세 개의 MongoDB를 사용할 예정입니다. 이번 예시에서는 mongo1 서버에서 해당 스크립트를 수행하도록 진행할 것입니다.

 

 

 

2. 쉘 스크립트 작성.

 

MongoDB 컨테이너가 올라오면 앞서 작성한 스크립트 파일을 수행 해 Replica set을 구성하도록 하는 쉘 스크립트를 작성합니다.

 

#init/setup.sh
sleep 5 | echo "Waiting for the servers to start..."
mongo mongodb://localhost:27017 /usr/src/configs/init/setReplication.js

 

 

3. dockerfile 작성

 

앞서 스크립트를 작성하면서 설명했듯이 mongo1 컨테이너에서는 우리가 작성한 스크립트가 실행되어야 합니다. 이를 위해 MongoDB 이미지를 가져와 컨테이너 실행 시 우리의 코드가 실행되는 새로운 이미지를 만들어 보도록 하겠습니다.

 

# dockerfile

FROM mongo

WORKDIR /usr/src
RUN mkdir configs
WORKDIR /usr/src/configs

COPY init/* init/

RUN chmod +x init/setup.sh

CMD ["/usr/src/configs/init/setup.sh"]

 

수행하는 내용은 간단합니다. mongo 이미지를 가져와 /usr/src/config 폴더를 만들고 그 안에 init 폴더를 그대로 복사합니다. 그리고 앞서 작성한 setup.sh 파일에 권한을 부여한 후 setup.sh를 실행시키는 게 전부입니다. 

 

 

 

4. docker-compose.yml 작성

 

이제 거의 다 끝나갑니다. 마지막으로 여러 mongodb 컨테이너를 동시에 실행시키고 ReplicaSet을 구성하기 위한 docker-compose.yml 파일을 작성합시다.

 

version: '3'
services:
  mongo1:
    image: mongo-rep:0.0.1
    build:
      context: .
      dockerfile: dockerfile
    volumes:
      - {SOMEWHERE_YOUR_VOLUME}/mongoRepl/mongo1:/data/db
    ports:
      - "27021:27017"
    networks:
      - mongo-networks
    command: mongod --replSet replication

  mongo2:
    image: "mongo"
    ports:
      - "27022:27017"
    volumes:
      - {SOMEWHERE_YOUR_VOLUME}/mongoRepl/mongo2:/data/db
    networks:
      - mongo-networks
    command: mongod --replSet replication
    depends_on:
      - mongo1

  mongo3:
    image: "mongo"
    ports:
      - "27023:27017"
    volumes:
      - {SOMEWHERE_YOUR_VOLUME}/mongoRepl/mongo3:/data/db
    networks:
      - mongo-networks
    command: mongod --replSet replication
    depends_on:
      - mongo2

networks:
  mongo-networks:
    driver: bridge

 

mongo2와 mongo3은 mongo 이미지를 그대로 가져와 사용합니다. 볼륨은 각각 자신이 설정한 볼륨 경로 내의 "mongoRepl/mongo2"와 "mongoRepl/mongo3"에 컨테이너 내부의 mongodb 데이터가 저장됩니다.

 

세 컨테이너는 depends_on으로 연결되어 있으며 bridge 네트워크를 사용해 서로 서비스 이름을 통해 통신할 수 있습니다. 추가적으로 mongo2와 mongo3은 replSet 명령어로 "replication"이라는 이름으로 ReplicaSet을 생성합니다. 이 이름은 앞서 작성한 js의 _id에 입력한 값과 동일해야 합니다.

 

mongo1은 다른 두 서비스와 달리 mongo 이미지를 그대로 사용하지 않고 앞서 작성한 dockerfile을 이용해 새로운 이미지를 빌드합니다. 이 서비스가 실행되면 다른 두 mongodb 서비스와 같이 ReplicaSet을 구성하게 됩니다.

 

이제 다음 명령어를 통해 docker-compose를 실행시켜 봅시다

 

$ docker-compose up -d

 

이제 ReplicaSet이 정상적으로 동작하는지 확인하기 위해 컨테이너에 접속해 봅시다. 먼저 컨테이너의 ID를 확인합니다.

 

$ docker ps -a

 

 

컨테이너 ID를 확인 후 아무 데나 접속해 봅니다.

 

$ docker exec -u 0 -it 51 mongo

 

 

위와 같이 "replication:PRIMARY" 혹은 "replication:SECONDARY"라고 표시되면 정상적으로 ReplicaSet이 구성된 겁니다.

 

 

 

 

반응형