从 docker 容器中访问 vagrant/virtual box host only 网络上的其他机器

Accessing other machines on a vagrant/virtual box host only network from within a docker container

我有一个使用 vagrant 设置的实验室环境。它由3台机器组成,两台安装了docker 1.4.1的应用服务器和一台安装了postgres 9.3的数据库服务器。所有机器都是 运行 Centos 6.6.

环境是使用仅主机专用网络设置的。这是 vagrant 文件

Vagrant.configure('2') do |config|
  config.vm.box = "centos-6.0-updated"

  {
    'db'    => '10.17.33.10',
    'app1'   => '10.17.33.11',
    'app2' => '10.17.33.12',
  }.each do |short_name, ip|
    config.vm.define short_name do |host|
      host.vm.network 'private_network', ip: ip
      host.vm.hostname = "#{short_name}.my.dev"
    end
  end
end

我发现当我在 app1 或 app2 上的容器内时,我无法访问数据库服务器。我认为问题在于 vagrant/virtualbox 的仅主机专用网络使用 127.0.0.x 范围内的地址。在主机上,vagrant 配置环回接口来处理向网络上的每台机器发送请求。但是在容器中,因为没有配置这个接口,容器将所有 127.0.0.x 请求视为对本地主机的请求,并将它们发送回自己。

我可以在 vagrant 端或 docker 端设置任何替代配置来缓解这个问题吗?简而言之,我想要一个 vagrant 环境,我的应用服务器上的容器可以与数据库服务器对话。请注意,数据库直接安装在数据库主机上,而不是 docker 容器内的 运行。此外,这是为了模拟不使用 vagrant 的生产环境,所以我希望任何 docker 更改也能在更正常的网络场景中工作。

默认情况下,VirtualBox 专用网络仅供主机使用,因此一个 VM 无法看到另一个。您可以使用 virtualbox__intnet 设置将其更改为使用 VirtualBox 内部网络,因此您需要像 host.vm.network "private_network", ip: ip, virtualbox__intnet: true

这样的行

这里有更多信息http://docs.vagrantup.com/v2/virtualbox/networking.html

请注意,这是特定于 VirtualBox 的。如果这也需要与不同的提供商合作,我认为您将需要使用 public 网络以获得必要的桥接并考虑所有相关问题以确保其安全。参见 http://docs.vagrantup.com/v2/networking/public_network.html