当前位置: 首页 > 面试题库 >

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

裴俊雅
2023-03-14
问题内容

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


问题答案:

好的,所以我终于弄清楚了,事实证明,解决方案是完全不使用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的现有实例重用于任何使用它的映像。

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



 类似资料:
  • 我正在使用Spring Security 4.0.1,并希望使用多个身份验证提供程序使用基于Java的配置进行身份验证。如何指定提供程序顺序? 我希望使用AuthenticationManagerBuilder,因为这就是<code>WebSecurityConfigurerAdapter。configureGlobal()公开,但我看不到任何指定顺序的方法。我需要手动创建ProviderMana

  • 本文向大家介绍postgresql 使用Npgsql提供程序从.NET访问Postgresql,包括了postgresql 使用Npgsql提供程序从.NET访问Postgresql的使用技巧和注意事项,需要的朋友参考一下 示例 Npgsql是Postgresql最受欢迎的.NET提供程序之一,它ADO.NET兼容并且与其他.NET数据库提供程序几乎相同地使用。 典型的查询是通过创建命令,绑定参数

  • 我已经创建了身份提供程序,并且从浏览器中它工作正常。 参考:密钥斗篷身份提供程序后代理登录抛出错误 从浏览器,我可以使用外部IDP登录,如果外部IDP用户不在keycloak中,它会在keyclock中创建,这绝对没问题,并重定向到仪表板。 但我的问题是,我们如何用keycloak rest api实现这个流程? 是否有任何api用于使用外部IDP登录,并将获得外部IDP的令牌以及密钥斗篷的令牌?

  • 问题内容: 我正在尝试制作一个使用 Redis* 作为后端的 Java应用程序 。由于 Redis 是一个非常快速的键值存储,我想使用它,但是 redis 可以与1个客户端一起使用,因此它没有user:pass身份验证的选项。我想找到一种实现某种身份验证的方法,因此我尝试了带有 redis2 扩展名的 nginx 。我这样做是因为我可以使用 客户端证书 和HTTPS。但这使我的应用程序非常慢。 *

  • 本文向大家介绍F# 使用CSV类型提供程序,包括了F# 使用CSV类型提供程序的使用技巧和注意事项,需要的朋友参考一下 示例 给定以下CSV文件: 您可以使用以下脚本读取数据:            

  • 我正在尝试使用pact来验证spring boot微服务。我已经从consumer生成了pact文件,并在provider端使用pact Broker验证了它。 我有另一个用例,在根据实际的服务响应验证pact文件之前,我需要执行一些代码。我读过关于状态改变URL和状态改变与闭包来实现它,但没有得到一个如何实现这一点的例子。有人能帮忙吗? 如果这个客户不存在,那么我将需要通过读取pact文件中的更