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
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에 매칭됩니다.