第一次无法从客户端访问具有Vagrant的虚拟机

时间:2015-07-15 21:19:37

标签: docker vagrant virtualbox packer

我正在尝试使用Nginx与docker和vagrant运行Rails项目。如果我使用流浪盒ubuntu / trusty64,一切都很好,我配置VM,一切都很好。但我想从ubuntu / trusty64创建自己的盒子,这就是我所有问题开始的时候。

所以我使用packer和这个模板创建了这个框:

{
      "variables": {
        "home": "{{env `HOME`}}"
      },
      "provisioners": [
        {
          "type": "shell",
          "execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}'",
          "override": {
            "virtualbox-ovf": {
              "scripts": [
                "scripts/docker.sh",
                "scripts/ansible.sh",
                "scripts/cleanup.sh",
                "scripts/zerodisk.sh"
              ]
            }
          }
        }
      ],
      "post-processors": [
        {
          "type": "vagrant",
          "override": {
            "virtualbox": {
              "output": "ubuntu-14-04-x64-virtualbox.box"
            }
          }
        }
      ],
      "builders": [
        {
          "type": "virtualbox-ovf",
          "headless": "true",
          "boot_wait": "10s",
          "source_path": "{{user `home`}}/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-trusty64/14.04/virtualbox/box.ovf",
          "ssh_username": "vagrant",
          "ssh_password": "vagrant",
          "ssh_port": 22,
          "ssh_wait_timeout": "10000s",
          "shutdown_command": "echo 'shutdown -P now' > /tmp/shutdown.sh; echo 'vagrant'|sudo -S sh '/tmp/shutdown.sh'",
          "vboxmanage": [
            [ "modifyvm", "{{.Name}}", "--memory", "512" ],
            [ "modifyvm", "{{.Name}}", "--cpus", "1" ]
          ]
        }
      ]
    }

然后将框添加到vagrant框中的pedrof / base-box并使用此Vagrantfile启动VM:

Vagrant.configure(2) do |config|
  config.vm.provider 'virtualbox' do |v|
    v.memory = 2048
    v.cpus = 2
  end

  config.vm.box = 'pedrof/base-box'
  config.vm.synced_folder '.', '/vagrant', type: 'nfs', mount_options: ['nolock,vers=3,udp,noatime,actimeo=1']
  config.vm.network :private_network, ip: '172.17.8.100'
  config.vm.provision 'shell', path: "docker/build.sh"
  config.vm.provision 'shell', path: "docker/init.sh", run: 'always'
end

启动VM并使用docker-compose启动docker容器。一切都很好,除了我无法从浏览器访问http://172.17.8.100,但ping响应来自主机。我运行curl从VM内部命中Nginx并且它使用正确的索引页面进行响应,但是VM之外没有任何内容。奇怪的是,如果我使用vagrant reload重新加载流浪汉,一切正常。

我是否错误地构建了盒子? Vagrantfile中缺少什么东西?

1 个答案:

答案 0 :(得分:0)

我假设您在Vagrant框内启动了一个docker容器。容器是Web服务器,您希望使用浏览器访问Web服务器。然后,您需要将端口转发到主机。

首先,您的容器端口必须映射到盒子端口。这是由-p Docker Parameter完成的。示例:-p 8080:8080。然后该端口将在框内可用。你说,你可以在盒子里面访问,所以我认为这已经正确配置了。

尝试将此端口转发至开箱即用。将其添加到您的Vagrantfile

...
config.vm.network "forwarded_port", guest: 8080, host: 8080
...
  

现在尝试使用http://localhost:8080

访问端口8080

如果你想让http://172.17.8.100工作,那么你必须将容器端口映射到需要root访问权限的盒子端口的端口80上。