我正在尝试基于this resource创建一个mongodb集群。 服务主机名在容器内不可用。 我按照以下步骤操作:
创建虚拟机:
docker-machine create -d virtualbox node1
docker-machine create -d virtualbox node2
docker-machine create -d virtualbox node3
使用以下命令在所有节点中打开端口2376、7946、4789并重新启动docker。
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
在Manager节点上,标记每个节点:
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服务集群创建网络:
docker network create --driver overlay --internal mongo
创建Mongo服务:
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
在容器中不可用。
我不确定我在哪里做错了。任何帮助将有助于解决此问题。