Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Vagrant Docker提供程序从boot2docker转发端口_Vagrant_Docker_Vagrantfile_Boot2docker - Fatal编程技术网

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

使用Vagrant Docker提供程序从boot2docker转发端口,vagrant,docker,vagrantfile,boot2docker,Vagrant,Docker,Vagrantfile,Boot2docker,我试图利用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 con

我试图利用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
我的理解是,在OSX上运行
vagrant-up--provider=docker
将启动一个运行boot2docker的VM,然后它将运行我的容器。运行
vagrant docker logs
似乎可以确认我的容器已创建,服务已启动,但现在我一辈子都不知道如何从我的OS X主机访问服务。如果我使用的是标准的VirtualBox提供程序,我希望使用
config.vm.network:forwarded\u port
指令来处理转发,但添加这一指令似乎没有任何区别

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


更新:作为参考,这是图像的Docker文件:

好的,所以我终于找到了答案,结果证明解决方案是根本不使用boot2docker。根据我在《流浪者》源代码、阅读问题和重新观看Docker提供商介绍视频中所做的一些深入研究,结果表明,您需要使用代理VM来托管容器,而不是boot2docker

为了进行设置,我修改了我的Vagrantfile,以包含一个用于
vagrant\u 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。内联shell脚本强制Vagrant重新登录到该框中,以便在安装Docker后使用它。最后,我在这个文件中转发我需要的端口,而不是原来的端口(同时仍然在原来的文件中使用
ports
config选项)

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


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

要从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"

你在Dockerfile中暴露端口了吗?是的!我在原始帖子中添加了一个指向图像Dockerfile的链接,以供参考。