我正在尝试使用docker部署mongodb副本集。我在同一台服务器上成功地执行了以下操作:
docker run -d --expose 27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsmycompa
docker run -d --expose 27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacommeassure
docker run -d --expose 27017 --name mongodbmycompany3 dockerfile/mongodb mongod --replSet rsacommeassure
MONGODB1=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany1)
MONGODB2=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany2)
MONGODB3=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany3)
echo $MONGODB1
echo $MONGODB2
echo $MONGODB3
echo "Mongodb Replicaset init"
docker exec mongodbmycompany1 mongo 127.0.0.1:27017/mycompany --eval 'if(!rs.conf()) { rs.initiate(); cfg = rs.conf(); cfg.members[0].host = "'$MONGODB1':27017"; rs.reconfig(cfg); rs.add("'$MONGODB2':27017"); rs.add("'$MONGODB3':27017"); } rs.status();'一切都如愿了。我的复制集被初始化,mongodb结果集配置包含我的3台服务器,由它们的内部IP地址标识。这并不完美,因为我更喜欢使用服务器名称,但我没有做到这一点。Docker只使用-link参数在映像启动时传递的服务器名称填充每个/etc/host文件。如果我在其他服务器运行时添加一个新服务器。那些服务器不会对新服务器进行平分。
现在我有另外一个问题。在生产中,在同一台物理服务器上运行大量Mongodb对接映像是可能的,但这是不安全的:-如果我的物理服务器崩溃,我的Mongodb副本就会丢失,我的服务也会中断--如果我的物理服务器使用内部存储,那么我的所有坞映像都使用相同的磁盘.我会有IO问题的。
因此,我的问题是:如何在多个物理服务器上部署多个mongodb副本?当这些mongodb副本位于不同的服务器上,甚至在不同的数据中心上时,它们如何相互通信(主服务器和次要服务器可以更改) ?
发布于 2015-08-24 10:40:56
让我们假设:
10.1.1.101、10.1.1.102、10.1.1.103rsacommeassure的副本集Dockerfiles公开端口27017首先,让我们在每个服务器上启动mongodb容器(10.1.1.101 ~$用于命令提示符):
10.1.1.101 ~$ docker run -d -p 27017:27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsacommeassure
10.1.1.102 ~$ docker run -d -p 27017:27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacommeassure
10.1.1.103 ~$ docker run -d -p 27017:27017 --name mongodbmycompany3 dockerfile/mongodb mongod --replSet rsacommeassure-p 27017:27017在主机IP上公开端口27017,因此可以在服务器的主机IP地址上访问mongo。
然后您需要启动副本集,所以只需在mongodb容器上运行它(我将在这里选择server1 ):
your_laptop ~$ > mongo --host 10.1.1.101
MongoDB shell version: 2.6.9
connecting to: test
> rs.initiate()
> cfg = rs.conf()
> cfg.members[0].host = "10.1.1.101:27017"
> rs.reconfig(cfg)
> rs.add("10.1.1.102:27017")
> rs.add("10.1.1.103:27017")
> rs.status();IP是本地的,但只要服务器能够相互通信(VPN、防火墙、DMZ等),它就能与全局和服务器协同工作。顺便说一句,你应该仔细考虑安全性。
发布于 2016-04-18 10:26:16
我在不同的物理服务器上创建了一个副本集,使用了停靠机和虚拟盒作为驱动程序:
$ docker-machine create --driver virtualbox server1
$ docker-machine create --driver virtualbox server2
$ docker-machine create --driver virtualbox server3打开3个不同的终端,每个终端
$(Terminal1) eval "$(docker-machine env server1)"
$(Terminal2) eval "$(docker-machine env server2)"
$(Terminal3) eval "$(docker-machine env server3)"在每个航站楼:
$(Terminal1) docker run -d -p 27017:27017 --name mongoClient1 mongo mongod --replSet r1
$(Terminal2) docker run -d -p 27017:27017 --name mongoClient2 mongo mongod --replSet r1
$(Terminal3) docker run -d -p 27017:27017 --name mongoClient3 mongo mongod --replSet r1每个环境(server1、server2、server3)上的->设置->网络->适配器1 ->端口转发。创建一个新的规则协议TCP,主机端口- 27017,来宾端口- 27017,使主机Ip和来宾Ip空。
现在重新启动所有环境,您可以从VirtualBox或终端,从终端运行:
$(Terminal1) docker-machine restart server1
$(Terminal2) docker-machine restart server2
$(Terminal3) docker-machine restart server3重新启动容器:
$(Terminal1) docker start mongoClient1
$(Terminal2) docker start mongoClient2
$(Terminal3) docker start mongoClient3现在容器应该正在运行,您可以通过在每个终端运行$ docker来检查它们
进入第一个容器的(或另一个) Mongo
$(Terminal1) docker exec -it mongoClient1 mongo
// now we are in the Mongo Shell
$(Mongo Shell) rs.initiate()
$(Mongo Shell) cfg = rs.conf()
$(Mongo Shell) cfg.members[0].host = <server1's Ip Address>
// you should get server1's Ip Address by running $ docker-machine ls, mine was 192.168.99.100
$(Mongo Shell) rs.reconfig(cfg)
$(Mongo Shell Primary) rs.add("<server2's Ip Address>:27017")
// now we added a Secondary
$(Mongo Shell Primary) rs.add("<server3's Ip Address>:27017", true)
// now we added an Arbiter
$(Mongo Shell Primary) use planes
// now we create a new database
$(Mongo Shell Primary) db.tranporters.insert({name:'Boeing'})
// create a new collection
$(Mongo Shell Primary) db.tranporters.find()
// we obtain the inserted plane要连接到中学,您可以:
$(Terminal2) docker exec -it mongoClient2 mongo planes
// or
$(Mongo Shell Primary) db = connect ("<server2's Ip Address>:27017/planes")现在我们在蒙古壳牌的一所中学
$(Mongo Shell Secondary) rs.slaveOk()
// to allow readings from the Shell
$(Mongo Shell Secondary)db.tranporters.find()
// should return inserted plane发布于 2015-02-08 12:42:56
您可以使用"编织-码头网络“轻松地解决问题。
Weave创建了一个覆盖网络,将容器连接到不同的主机上,甚至在不同的云提供商上也是如此。Weave还提供了DNS服务,使您可以在Weave网络中按名称查找容器。
https://stackoverflow.com/questions/27187591
复制相似问题