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

11

我正在尝试使用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,然后该VM将运行我的容器。运行vagrant docker-logs似乎确认了我的容器已经创建并且服务已经启动,但我现在无法想出如何从我的OS X主机访问该服务。如果我使用标准的VirtualBox提供者,我预计config.vm.network :forwarded_port指令可以处理端口转发,但添加该指令似乎没有任何效果。

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

更新:供参考,这是镜像的Dockerfile:https://github.com/moul/docker-icecast/blob/master/Dockerfile


你在 Dockerfile 中暴露了端口吗? - Thomas Uhrig
是的!我正在原始帖子中添加一个链接,以便参考该图像的 Dockerfile。 - Todd
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将使用它来启动代理虚拟机:

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 配置器将自动为代理虚拟机安装 Docker。内联 shell 脚本会强制 Vagrant 重新登录到虚拟机中,以便在安装完成后可以利用 Docker。最后,在这个 Vagrantfile 中转发我需要的端口,而不是在原始文件中(同时仍然使用原始文件中的 ports 配置选项)。

就像默认的 boot2docker 策略一样,Vagrant 将聪明地重复使用代理 VM 的现有实例,以供使用它的任何镜像使用。

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


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"

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