从Docker容器内部访问Vagrant/Virtual Box主机上仅限于本地网络的其他计算机

5
我设置了一个实验环境,使用vagrant进行搭建。它由3台机器组成,两台应用服务器安装了docker 1.4.1,一台数据库服务器安装了postgres 9.3。所有机器都运行在Centos 6.6操作系统上。
该环境是使用host-only私有网络进行设置的。以下是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环境,在我的应用程序服务器上的容器可以与数据库服务器通信。请注意,db直接安装在db-host上,而不是在docker容器中运行。此外,这意味着要模仿一个生产环境,该环境不使用vagrant,因此我希望任何docker更改也能在更正常的网络环境中工作。
1个回答

7
默认情况下,VirtualBox的私有网络是仅限主机的,因此一个虚拟机无法看到另一个虚拟机。您可以通过使用virtualbox__intnet设置将其更改为使用VirtualBox内部网络,因此您需要像这样添加一行:host.vm.network "private_network", ip: ip, virtualbox__intnet: true
关于此问题的更多信息,请参考这里:http://docs.vagrantup.com/v2/virtualbox/networking.html
请注意,这是针对VirtualBox的特定设置。如果需要与其他提供商一起使用,我认为您需要使用公共网络才能获得必要的桥接并考虑所有相关的安全问题。请参见http://docs.vagrantup.com/v2/networking/public_network.html

我最终使用了公共网络,但这似乎也是一个有用的替代方案。 - AndrewSwerlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接