我正在尝试使用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中缺少什么东西?
答案 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上。