Решил поделиться способом поднятия реплики с помощью docker-compose. Сам пример будут максимально приближен к боевым.
Для полноценной реплики нам понадобиться три сервера с CentOS. На все три сервера надо поставить Docker, Docker Compose и по желанию git:
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2; \
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo; \
sudo yum install -y docker-ce; \
sudo systemctl enable docker; \
sudo systemctl start docker; \
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose; \
sudo chmod +x /usr/local/bin/docker-compose; \
sudo yum install -y git;
Создайте папку, назовем ее mongo со следующей структурой:

Подробности:
- Папка backups тут предполагается хранить бекапы
- Папка config — файлы настроек:
- Файл mongo-keyfile это файл ключа аутентификации между членами реплики. В этом руководстве мы будем использовать сертификат сгенерированный openssl, но для боевых серверов рекомендуется использовать сертификат x.509. Генерация: openssl rand -base64 756 > mongo-keyfile
- Файл replica.yml это конфиг MongoDB:
net:
port: 27017 # Порт по умолчанию
bindIp: 0.0.0.0 # Открываем подключение из вне
security:
keyFile: /mongo-keyfile # Ключ авторизации
replication:
replSetName: rep0 # Название реплики, можно любое
3. Папка data — файлы базы данных
4. Файл docker-compose.yml:
version: '3.1'
services:
mongo_replica:
build:
context: ./
dockerfile: Dockerfile
command: mongod --config /etc/mongo/replica.yml # запуск
volumes: # мапим папки и файл конфига
- ./config/replica.yml:/etc/mongo/replica.yml
- ./data:/data/db
- ./backups:/backups
ports:
- 27017:27017 # задаем порт
extra_hosts: # тут мы задаем /etc/hosts для Docker
- "mongo1:195.201.218.210" # задайте
- "mongo2:195.201.218.211" # ip ваших
- "mongo3:195.201.218.212" # серверов
5. Файл Dockerfile:
# задаем версию MongoDB
FROM mongo:4.0
WORKDIR / # будем работать в корне
# Копируем ключ авторизации и задаем права
COPY ./config/mongo-keyfile .
RUN chmod 400 mongo-keyfile
RUN chown mongodb:mongodb mongo-keyfile
Далее заливка на все три сервера. Можете воспользоваться любым удобным для вас способом. Я предпочитаю завести репозиторий, залить туда проект и с помощью git clone залить на сервер, при будущих изменениях будет проще обновить, да и вероятность ошибиться в процессе заливки становиться куда меньше.
Далее выбираем, какой сервер будет у нас главным, возьмем по порядку mongo1. Заходим, переходим в папку с нашим проектом:
docker-compose up -d
docker-compose logs -f
Тут мы запустили Doker и пошли смотреть логи если все хорошо и MongoDB успешно запущен, подключаемся к mongo:
docker-compose exec mongo_replica mongo
Переключаемся в базу admin
use admin
Запускаем инициализацию реплики:
rs.initial()
Задаем админа:
db.createUser({"user": "admin", "pwd": "password", "roles":[{"role": "root", "db": "admin"}]})
Отключаем от MongoDB Ctrl+c. Затем подключаемся заново но уже под пользователем admin:
docker-compose exec mongo_replica mongo -u admin -p password --authenticationDatabase admin
Запускаем команду rs.conf() в разделе members будет указана одна запись это наш текущий сервер, обратите внимание на поле host, сейчас скорей всего какая-то абракадабра типа «67e2affc55a6:27017» это последствия запуска MongoDB в контейнере. Признаюсь долго не разбирался, как автоматом подставлять правильный host, может вы знаете? Оставьте комментарий если это так. Продолжим. Поправим конфиг:
cfg = rs.conf();
cfg.members[0].host = "mongo1:27017";
rs.reconfig(cfg);
Все, теперь идем на другие сервера запускаем docker-compose up -d и смотрим логи docker-compose logs -f. Затем возвращаемся на главный сервер подключаемся к MongoDB под нашим пользователем.
rs.add("mongo2")
rs.add("mongo3")
Готово, если звезды сошлись, реплика должна успешно заработать 🙂
По поводу подключения можно почитать здесь.