首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Vagrant提供程序从boot2docker转发端口

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

Stack Overflow用户
提问于 2014-05-30 06:59:07
回答 2查看 3.9K关注 0票数 11

我试图利用Vagrant1.6的码头供应商,我似乎遇到了一个障碍。我可以成功地打开Docker容器和来宾操作系统,但是我无法从主机OS访问容器中所提供的服务。这是我的Vagrantfile文件:

代码语言:javascript
复制
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上运行vagrant up --provider=docker将启动运行boot2docker的VM,然后运行容器。运行vagrant docker-logs似乎可以确认我的容器已经创建并且服务已经启动,但是现在我无法从我的OS主机上找到如何访问服务。如果我使用的是标准的VirtualBox提供程序,我希望使用config.vm.network :forwarded_port指令来处理转发,但是添加这一点似乎没有什么区别。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-01 21:12:51

好的,所以我终于明白了这一点,最终的解决方案是根本不使用boot2docker。基于我在Vagrant源代码中所做的一些尝试,阅读问题,并重新观看Docker提供者的介绍视频,结果发现您需要使用代理VM来承载您的容器,而不是boot2docker。

为了设置这一点,我修改了我的Vagrantfile,以包括vagrant_vagrantfile的一个配置选项

代码语言:javascript
复制
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:

代码语言:javascript
复制
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的现有实例重用到任何使用它的映像中。

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

票数 17
EN

Stack Overflow用户

发布于 2014-06-18 14:09:49

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

代码语言:javascript
复制
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"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23948831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档