在Vagrant上使用docker图像构建Redis群集:无法ping机器

在Vagrant上使用docker图像构建Redis群集:无法ping机器,docker,vagrant,Docker,Vagrant,我试图在OSX上本地构建一个简单的redis集群,在virtualbox虚拟机中使用docker。具体来说,我想创建一个主redis节点(192.168.0.100),其中包含两个从节点(.101和.102)。这涉及到配置每台机器,并向每台从机发出命令,告诉它键值存储关系中的主机是谁 这非常有效,直到我决定在Vagrant文件中做一些编程工作,使配置更加灵活。结果是,我甚至无法ping.102之外的任何机器,更不用说使用redis cli命令(例如,redis cli-h 192.168.0.1

我试图在OSX上本地构建一个简单的redis集群,在virtualbox虚拟机中使用docker。具体来说,我想创建一个主redis节点(192.168.0.100),其中包含两个从节点(.101和.102)。这涉及到配置每台机器,并向每台从机发出命令,告诉它键值存储关系中的主机是谁

这非常有效,直到我决定在Vagrant文件中做一些编程工作,使配置更加灵活。结果是,我甚至无法ping.102之外的任何机器,更不用说使用redis cli命令(例如,
redis cli-h 192.168.0.100 INFO
来查看主设备是否正确设置了从设备)

我的目标/限制:

  • 在virtualbox虚拟机中运行docker:我在阅读文档时看到了几种方法。我选择这样做是因为我不想引用大量的外部文件
  • 配置后,在每个VM上运行一系列命令,以设置从机等
  • 我不想只使用boot2docker,因为我还有很多其他的东西要添加。。。twemproxy、sentinel和我想至少稍微模拟一下生产环境
我在新文件中做错了什么

编辑:我做了更多的调查。我尝试过的一件事是销毁所有图像,然后运行旧的vagrant文件来构建机器,然后用新的vagrant文件重新加载它们。在这个场景中,机器正常工作,但每次我都会看到身份验证失败消息,如
redis1:Warning:authentication failure。在机器启动后重试…
。不过,我还是能把这台机器砰砰地一声关上


新文件(使用下面的配置文件):

config.rb:

module RedisClusterConfig
    attr_reader :redisNodes 

    RedisNode = Struct.new("RedisNode", :name, :address, :port, :slaveOfAddress, :slaveOfPort)

    p = "6379" # Default redis port
    baseAddr = "192.168.0."

    # Define a triplet
    redis0 = RedisNode.new("redis0", baseAddr + "100", p, nil, nil)
    redis1 = RedisNode.new("redis1", baseAddr + "101", p, baseAddr + "100", p)
    redis2 = RedisNode.new("redis2", baseAddr + "102", p, baseAddr + "100", p)

    @redisNodes = [redis0, redis1, redis2]
end

旧文件:

# Make sure you have triggers plugin:
#     vagrant plugin install vagrant-triggers
#
# TODO:
# - We really would like to run some shell commands after everything is done, not after each machine is provisioned

Vagrant.configure(2) do |config|
    config.vm.provider "virtualbox"

    ## Redis Nodes ##

    ### Master Node###
    config.vm.define "redis0" do |a|
        a.vm.hostname = "redis0"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.100"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    ### Slave Nodes ###
    config.vm.define "redis1" do |a|
        a.vm.hostname = "redis1"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.101"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    config.vm.define "redis2" do |a|
        a.vm.hostname = "redis2"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.102"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    # After everything else has finished provisioning...
    config.trigger.after [:up, :resume, :reload] do
        # Configuring redis master/slave triplet
        system('echo Configuring redis master/slave triplet...')
        system('redis-cli -h 192.168.0.101 SLAVEOF 192.168.0.100 6379')
        system('redis-cli -h 192.168.0.102 SLAVEOF 192.168.0.100 6379')
    end

end

//,快一年了。你有没有找到解决这个问题的方法,或者你必须从头开始重新做呢?我放弃了,直接在谷歌计算引擎中构建虚拟机,实际的系统就在那里。我现在正在重建系统以使用Kubernetes(可能是通过托管版本,Google容器引擎),我认为这将使流浪部分变得更容易,因为Kubernetes修复了Docker的坏网络。//,我认为Swarm修复了Docker的坏网络?//,已经快一年了。你有没有找到解决这个问题的方法,或者你必须从头开始重新做呢?我放弃了,直接在谷歌计算引擎中构建虚拟机,实际的系统就在那里。我现在正在重建系统以使用Kubernetes(可能是通过托管版本,Google容器引擎),我认为这将使流浪部分更容易,因为Kubernetes修复了Docker的坏网络。//,我想Swarm修复了Docker的坏网络?
# Make sure you have triggers plugin:
#     vagrant plugin install vagrant-triggers
#
# TODO:
# - We really would like to run some shell commands after everything is done, not after each machine is provisioned

Vagrant.configure(2) do |config|
    config.vm.provider "virtualbox"

    ## Redis Nodes ##

    ### Master Node###
    config.vm.define "redis0" do |a|
        a.vm.hostname = "redis0"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.100"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    ### Slave Nodes ###
    config.vm.define "redis1" do |a|
        a.vm.hostname = "redis1"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.101"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    config.vm.define "redis2" do |a|
        a.vm.hostname = "redis2"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.102"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    # After everything else has finished provisioning...
    config.trigger.after [:up, :resume, :reload] do
        # Configuring redis master/slave triplet
        system('echo Configuring redis master/slave triplet...')
        system('redis-cli -h 192.168.0.101 SLAVEOF 192.168.0.100 6379')
        system('redis-cli -h 192.168.0.102 SLAVEOF 192.168.0.100 6379')
    end

end