11

我正在尝试使用 Vagrant 1.6 的 Docker 提供程序,但我似乎遇到了障碍。我可以成功启动 Docker 容器和来宾操作系统,但是我无法从主机操作系统访问我在容器中启动的服务。这是我的流浪文件:

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

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

我需要做什么才能从我的 OS X 主机访问此服务?

更新:作为参考,这里是图像的 Dockerfile:https ://github.com/moul/docker-icecast/blob/master/Dockerfile

4

2 回答 2

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

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

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 的现有实例。

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

于 2014-06-01T21:12:51.950 回答
2

要从 boot2docker 转发端口(与从不使用 boot2docker 的自定义代理 VM 转发端口相反),您需要通过 VirtualBox 手动添加端口转发,或者在运行后运行以下脚本vagrant up

export PORT=3306
export REASON=mysql
export HOST_VM=`VBoxManage list runningvms | grep docker-host | awk '{ print $1 }' | sed 's/"//g'`
VBoxManage controlvm $HOST_VM natpf1 "docker-$REASON-$PORT-port-forward,tcp,127.0.0.1,$PORT,,$PORT"
于 2014-06-18T14:09:49.333 回答