Я пытаюсь создать кластер mongodb на основе этого ресурса .Имя хоста службы недоступно внутри контейнера.Я выполнил следующие шаги:
Создание виртуальных машин:
docker-machine create -d virtualbox node1
docker-machine create -d virtualbox node2
docker-machine create -d virtualbox node3
Открытие портов 2376, 7946, 4789 во всех узлах и перезапущенный докер, используяследующие команды.
sudo su
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p udp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
iptables-save > /etc/iptables.conf
/etc/init.d/docker restart
Инициализация роя и добавление к нему узлов
Node 1:
docker swarm init --listen-addr 192.168.99.100 --advertise-addr 192.168.99.100
Node 2:
docker swarm join --token <TOKEN> --listen-addr 192.168.99.101 --advertise-addr 192.168.99.101 192.168.99.100:2377
Node 3:
docker swarm join --token <TOKEN> --listen-addr 192.168.99.102 --advertise-addr 192.168.99.102 192.168.99.100:2377
На узле диспетчера для маркировки каждого узла:
docker node update --label-add mongo.replica=1 $(docker node ls -q -f name=node1)
docker node update --label-add mongo.replica=2 $(docker node ls -q -f name=node2)
docker node update --label-add mongo.replica=3 $(docker node ls -q -f name=node3)
Создание сети для Mongo Service Cluster:
docker network create --driver overlay --internal mongo
Создание Mongo Service:
docker service create --replicas 1 --network mongo --mount type=volume,source=mongodata1,target=/data/db --mount type=volume,source=mongoconfig1,target=/data/configdb --constraint 'node.labels.mongo.replica == 1' --name mongo1 mongo:3.2 mongod --replSet example
docker service create --replicas 1 --network mongo --mount type=volume,source=mongodata2,target=/data/db --mount type=volume,source=mongoconfig2,target=/data/configdb --constraint 'node.labels.mongo.replica == 2' --name mongo2 mongo:3.2 mongod --replSet example
docker service create --replicas 1 --network mongo --mount type=volume,source=mongodata3,target=/data/db --mount type=volume,source=mongoconfig3,target=/data/configdb --constraint 'node.labels.mongo.replica == 3' --name mongo3 mongo:3.2 mongod --replSet example
Инициализация набора реплик:
docker exec -it $(docker ps -qf label=com.docker.swarm.service.name=mongo1)
\ mongo --eval 'rs.initiate({ _id: "example",
\ members: [{ _id: 1, host: "mongo1:27017" },
\ { _id: 2, host: "mongo2:27017" },
\ { _id: 3, host: "mongo3:27017" }],
\ settings: { getLastErrorDefaults: { w: "majority", wtimeout: 30000 }}})'
Я получаю следующую ошибку для последней команды:
MongoDB shell version: 3.2.21
connecting to: test
{
"ok" : 0,
"errmsg" : "No host described in new configuration 1 for replica set example maps to this node",
"code" : 93
}
После некоторых проверок я узнал, что имена хостовmongo1, mongo2, mongo3
не доступны в контейнере.
Я не уверен, где я делаю неправильно.Любая помощь будет полезна для решения этой проблемы.