一尘不染

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

docker

我正在尝试利用Vagrant
1.6的Docker提供程序,但似乎遇到了麻烦。我可以成功启动Docker容器和来宾操作系统,但随后无法从主机OS访问容器中已启动的服务。这是我的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

我的理解是,vagrant up --provider=docker在OS
X上运行将启动运行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


阅读 217

收藏
2020-06-17

共1个答案

一尘不染

好的,所以我终于弄清楚了,事实证明,解决方案是完全不使用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
Provisioner将自动为您在代理VM上安装Docker。内联外壳脚本会强制Vagrant重新登录到该框,以便它在安装Docker后可以使用Docker。最后,我转发了该Vagrantfile中所需的端口,而不是原始端口(同时仍在原始端口中使用portsconfig选项)。

就像默认的boot2docker策略一样,Vagrant将足够聪明,可以将代理VM的现有实例重用于任何使用它的映像。

希望这对以后的人会有所帮助。

2020-06-17