如何使用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");
我不知道该怎么做。那么,将路由服务器连接到配置和分片的最佳方式是什么?我正在做甚么正确的方式来做这一切?我试过使用谷歌搜索“流浪汉码头芒戈碎片”,我得到了一堆疯狂的设置,但也许这就是需要?
为了让服务器进行通信,我猜你需要正确配置端口转发,以便路由服务器能够访问分片,反之亦然。
使用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的相同原则也应该可以正常工作。
我想你应该公开容器的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