2014-11-20 5 views
3

저는 방글라데시와 도커에게 매우 익숙하며 다음 프로젝트에서 어떻게 작동하는지 보려고합니다. 지금까지는 MongoDB 공유 클러스터를 설정하는 데 다소 시간이 걸렸습니다.방글라데시와 도커를 사용하여 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 

내가 파편과 설정 서버를 위로 (내가 생각하는) 얻을 관리했지만, 여기에 지금까지 가지고 그 Vagrantfile입니다 configdb에 대한 호스트 : 포트를 전달해야하기 때문에 라우팅 서버가 분명히 작동하지 않습니다. (어떻게해야합니까?)

그리고 라우팅 서버에서 다음과 같은 몽고 명령을 실행해야합니다.

$ 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)를 사용하여 시작할 때 이러한 명령을 수동으로 (스크립트 또는 무언가를 통해) 실행할 수 있습니다. –

답변

0

서버가 통신하려면 라우팅 서버가 샤드에 액세스 할 수 있도록 포트 포워딩을 올바르게 구성해야하며 그 반대의 경우도 마찬가지입니다.

Vagrant와 함께 포트 전달을 구성 할 수 있으며이 경우 Docker 컨테이너에 맞게 ports을 적절하게 구성해야합니다. Vagrant Networking Configuration 페이지 및 Vagrant's Docker provider configuration 페이지를 참조하십시오.

주목할만한 점은 결국 도커 컨테이너간에 link을 구성하고 Docker provider 구성에서도 수행 할 수 있습니다. 컨테이너 연결에 대한 자세한 내용은 Docker documentation입니다.

그런 다음 라우팅 서버에 샤드를 추가하려면 Vagrant's Shell Provisioner을 사용할 수 있습니다. 이 기능을 사용하면 시스템에서 사용자 정의 쉘 스크립트를 실행할 수 있습니다.

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

미안 해요, 나 자신을 위의 명령을 테스트하지 않았기 때문에하지이에서 일하게 될 것입니다 확인하십시오 mongo 클라이언트가 실행되는 인라인 스크립트, 당신은 다음과 같은 것을 사용할 수 있습니다 것을 제공 상자,하지만 이것은 일반적인 아이디어를 제공합니다. (사실, 나는 거기에 따옴표가있는 것이 틀림 없다고 확신한다. :)).

다른 Ruby 소스 파일에서와 동일한 방식으로 Vagrant 파일에서 변수를 만들 수 있으며 유지 관리를 위해 IP 및 포트 번호를 반복하지 않기 위해 재사용 할 수 있습니다.

vagrant <name of the instnance> ssh을 실행하여 컨테이너에 대한 셸 액세스를 얻고 ('실행 중'상태에있는 경우) 명령을 내부로 실행할 수 있습니다. 이는 네트워크 및 프로비저닝 논리를 디버깅 할 때 유용 할 수 있습니다.

실례지만, MongoDB를 사용하여 이러한 아이디어를 정확히 테스트하지는 않았지만 다른 유형의 서비스와 만 테스트했습니다. 그러나 MondoDB에 적용된 동일한 원칙이 잘 작동해야한다고 생각합니다.

관련 문제