[MongoDB | Docker] DockerCompose로 MongoDB ReplicaSet 구성하기.
docker-compose를 이용해 간단히 MongoDB ReplicaSet을 구성하는 방법에 대해 알아보도록 합니다.
참고 소스는 다음 git 저장소에서 확인할 수 있습니다: MongoDBReplicaSetTest
0. Docker Desktop 설치
Docker Container로 배포를 위해선 개발 환경에 docker가 설치되어 있어야 합니다. 공식 홈페이지로 이동해 Docker Desktop을 설치합니다: www.docker.com/products/docker-desktop
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이 구성된 겁니다.