使用Vagrant Docker提供程序从boot2docker转发端口

时间:2014-05-30 06:59:07

标签: vagrant docker vagrantfile boot2docker

我正在尝试使用Vagrant 1.6的Docker提供商,而我似乎遇到了麻烦。我可以成功地启动Docker容器和来宾操作系统,但是我无法访问我从主机操作系统中在容器中启动的服务。这是我的Vagrantfile:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.network :forwarded_port, guest: 8000, host: 8000

  config.vm.define "icecast" do |v|
    v.vm.provider "docker" do |d|
      d.image = "moul/icecast"
      d.ports = ["8000:8000"]

      d.env = {
        # SOURCE_PASSWORD: 'password',
        ADMIN_PASSWORD: 'password',
        # PASSWORD: 'password',
        # RELAY_PASSWORD: 'password'
      }
    end
  end
end

我的理解是在OS X上运行vagrant up --provider=docker将启动运行boot2docker的VM,然后运行我的容器。运行vagrant docker-logs似乎确认我的容器已创建且服务已启动,但现在我无法知道如何从我的OS X主机访问该服务。如果我使用标准的VirtualBox提供程序,我希望config.vm.network :forwarded_port指令可以处理转发,但添加它似乎没有任何区别。

如果能够从OS X主机访问此服务,我需要做什么?

更新:供参考,以下是图片的Dockerfile:https://github.com/moul/docker-icecast/blob/master/Dockerfile

2 个答案:

答案 0 :(得分:17)

好的,所以我终于想出来了,事实证明解决方案是根本不使用boot2docker。根据我通过Vagrant来源,读取问题以及重新编写Docker提供程序介绍视频所做的一些潜水,事实证明您需要使用代理VM来托管容器而不是boot2docker。

要进行此设置,我修改了我的Vagrantfile以包含vagrant_vagrantfile的配置选项:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "icecast" do |v|
    v.vm.provider "docker" do |d|
      d.image = "moul/icecast"
      d.ports = ["8000:8000"]

      d.env = {
        # SOURCE_PASSWORD: 'password',
        ADMIN_PASSWORD: 'password',
        # PASSWORD: 'password',
        # RELAY_PASSWORD: 'password'
      }

      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end
end

然后我添加了一个Vagrant将用于启动代理VM的附加文件(Vagrantfile.proxy):

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision "docker"
  config.vm.provision "shell", inline:
    "ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill"

  config.vm.network :forwarded_port, guest: 8000, host: 8000
end

使用Docker配置程序会自动为您安装代理VM上的Docker。内联shell脚本强制Vagrant重新登录到框中,以便在安装后可以使用Docker。最后,我在这个Vagrantfile中转发了我需要的端口而不是原始端口(同时仍使用原始版本中的ports配置选项。)

与默认的boot2docker策略一样,Vagrant将足够智能,可以为任何使用它的图像重用代理VM的现有实例。

希望这对未来的人有所帮助。

答案 1 :(得分:2)

要从boot2docker转发端口(而不是从不使用boot2docker的自定义代理VM转发端口),您需要通过VirtualBox手动添加端口转发,或者在运行{{1}后运行以下脚本}:

vagrant up