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

 dmcm0007 发布于 2023-01-12 15:02

我正在尝试使用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

我的理解是,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

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
    

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

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

    希望这将有助于未来的人.

    2023-01-12 15:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有