如何使用Vagrant和Docker设置MongoDB

问题描述:

我对Vagrant和Docker非常陌生,并尝试将它用于下一个项目,以了解它是如何实现的。到目前为止,我一直在设置一个MongoDB共享集群。这里是Vagrantfile是我到目前为止有:如何使用Vagrant和Docker设置MongoDB

# -*- 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 

我设法让碎片和配置服务器了(我认为),但路由服务器显然不工作,因为我需要通过主机:端口为configdb(我该怎么做?)

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

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

我不知道该怎么做。那么,将路由服务器连接到配置和分片的最佳方式是什么?我正在做甚么正确的方式来做这一切?我试过使用谷歌搜索“流浪汉码头芒戈碎片”,我得到了一堆疯狂的设置,但也许这就是需要?

+0

我想你应该公开容器的mogodb端口:d.expose port [link](http://docs.mongodb.org/manual/reference/default-mongodb-port)。一种选择是为执行bash文件并执行所有需要的命令的路由服务器创建自己的Dockerfile。另一个选择是在用exec [link](http://docs.docker.com/reference/commandline/cli/#docker-exec-driver-option)启动后手动运行这些命令(通过脚本或其他) – 2014-11-24 16:44:48

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

使用Vagrant可以配置端口转发,在这种情况下,我想还需要结合为Docker容器正确配置ports。请参阅Vagrant Networking Configuration页面和Vagrant's Docker provider configuration页面。值得注意的是,最终你可能还想在Docker容器之间配置link,这也是在Docker provider配置中完成的。有关将容器连接在一起的更多信息,请参阅Docker documentation

然后,要将路由分片添加到路由服务器,可以使用Vagrant's Shell Provisioner。这个允许在机器启动并运行后在机器上执行定制的shell脚本。只要mongo客户端允许运行内嵌脚本,你可以使用类似的东西如下:

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

我很抱歉,我没有测试上面自己的命令,所以不知道这将是工作了的这个盒子,但是这给出了一个大概的想法。 (实际上,我很确定引号中有错误:))。

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

请注意,您也可以运行vagrant <name of the instnance> ssh以获取对容器的访问权限(只要它处于“运行”状态),并在其中运行命令。这在调试网络和配置逻辑时可能很有用。

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