如何设置与Vagrant和Docker的MongoDB

我对Vagrant和Docker非常陌生,并试图为我的下一个项目,看看它如何。 到目前为止,我一直在build立一个MongoDB共享集群。 这是目前为止的stream浪文件:

# -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # # MONGO # # Shard 1 config.vm.define "mongo-shard1" do |app| app.vm.provider "docker" do |d| d.image = "mongo:2.6.5" d.name = "mongo-shard1" d.cmd = ["mongod", "--shardsvr", "--noprealloc"] end end #Shard 2 config.vm.define "mongo-shard2" do |app| app.vm.provider "docker" do |d| d.image = "mongo:2.6.5" d.name = "mongo-shard2" d.cmd = ["mongod", "--shardsvr", "--noprealloc"] end end #Config Server config.vm.define "mongo-config" do |app| app.vm.provider "docker" do |d| d.image = "mongo:2.6.5" d.name = "mongo-config" d.cmd = ["mongod", "--configsvr", "--dbpath", "/data/db", "--noprealloc"] end end #Routing Server #THIS IS NOT DONE AND WORKING config.vm.define "mongo-routing" do |app| app.vm.provider "docker" do |d| d.image = "mongo:2.6.5" d.name = "mongo-routing" d.link("mongo-shard1:mongo-shard1") d.link("mongo-shard2:mongo-shard2") d.link("mongo-config:mongo-config") d.cmd = ["mongos", "--configdb", "config_host:port"] end end end 

然后我开始:

 vagrant up --provider=docker --no-parallel 

我已经设法得到碎片和configuration服务器(我认为),但路由服务器显然不工作,因为我需要通过一个主机:端口的configdb(我该怎么做?)

然后,我还需要在路由服务器上运行以下mongo命令:

 $ mongo mongos> sh.addShard("shard1_host:port"); mongos> sh.addShard("shard2_host:port"); 

我不知道该怎么做。 那么,将路由服务器连接到configuration和分片的最佳方式是什么? 我正在做什么,甚至正确的方式来做到这一切? 我已经试过使用谷歌search“stream浪汉docker芒戈碎片”,我得到了一堆疯狂的设置,但也许这是什么是必需的?

为了让服务器进行通信,我想你需要正确configuration端口转发,以便路由服务器能够访问分片,反之亦然。

使用Vagrant,你可以configuration端口转发,在这种情况下,我想也需要结合为Docker容器正确configuration的ports 。 请参阅“ Vagrantnetworkingconfiguration”页面和Vagrant的Docker提供程序configuration页面。

值得注意的是,最终你可能也想configurationDocker容器之间的link ,这也是在Docker提供者configuration中完成的。 有关将容器连接在一起的更多信息,请参阅Docker文档

然后,要添加分片到路由服务器,你可以使用Vagrant的Shell Provisioner 。 这个允许在计算机上启动并运行自定义shell脚本。 假设mongo客户端允许内联脚本运行,您可以使用类似于以下内容的内容:

 app.vm.provision "shell", inline: 'mongo --eval "sh.addShard(\"shard1_host:port\");"' 

对不起,我没有对自己的命令进行testing,所以不确定这个命令是否可以正常工作,但这是一个总体思路。 (实际上,我很确定引号中有错误:))。

您也可以在Vagrantfile中创buildvariables,就像您在任何其他Ruby源文件中一样,并重复使用它们以避免重复IP和端口号,从而实现更好的可维护性。

注意,你也可以运行vagrant <name of the instnance> ssh来获得对容器的访问权限(假设它处于“运行”状态),并且在里面运行命令。 debuggingnetworking和configuration逻辑时,这可能很有用。

不好意思,我没有用MongoDBtesting任何这些想法,而只是用其他types的服务。 但是我认为,适用于MondoDB的相同原则也应该可以正常工作。