2014-11-20 125 views
3

我對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

回答

0

爲了讓服務器進行通信,我猜你需要正確配置端口轉發,以便路由服務器能夠訪問分片,反之亦然。

使用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的相同原則也應該可以正常工作。