使用Vagrant Docker提供程序从boot2docker转发端口
我试图利用Vagrant 1.6的Docker提供程序,我似乎遇到了障碍。我可以成功地启动Docker容器和来宾操作系统,但是我无法从主机操作系统访问我在容器中启动的服务。这是我的流浪汉档案:使用Vagrant Docker提供程序从boot2docker转发端口,vagrant,docker,vagrantfile,boot2docker,Vagrant,Docker,Vagrantfile,Boot2docker,我试图利用Vagrant 1.6的Docker提供程序,我似乎遇到了障碍。我可以成功地启动Docker容器和来宾操作系统,但是我无法从主机操作系统访问我在容器中启动的服务。这是我的流浪汉档案: VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.network :forwarded_port, guest: 8000, host: 8000 con
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
我的理解是,在OSX上运行vagrant-up--provider=docker
将启动一个运行boot2docker的VM,然后它将运行我的容器。运行vagrant docker logs
似乎可以确认我的容器已创建,服务已启动,但现在我一辈子都不知道如何从我的OS X主机访问服务。如果我使用的是标准的VirtualBox提供程序,我希望使用config.vm.network:forwarded\u port
指令来处理转发,但添加这一指令似乎没有任何区别
我需要做什么才能从我的OS X主机访问此服务
更新:作为参考,这是图像的Docker文件:好的,所以我终于找到了答案,结果证明解决方案是根本不使用boot2docker。根据我在《流浪者》源代码、阅读问题和重新观看Docker提供商介绍视频中所做的一些深入研究,结果表明,您需要使用代理VM来托管容器,而不是boot2docker 为了进行设置,我修改了我的Vagrantfile,以包含一个用于
vagrant\u 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。内联shell脚本强制Vagrant重新登录到该框中,以便在安装Docker后使用它。最后,我在这个文件中转发我需要的端口,而不是原来的端口(同时仍然在原来的文件中使用ports
config选项)
就像默认的boot2docker策略一样,Vagrant将足够聪明,可以将代理VM的现有实例重新用于使用它的任何映像
希望这对以后的人有所帮助。要从boot2docker转发端口(与从不使用boot2docker的自定义代理VM转发端口相反),您需要通过VirtualBox手动添加端口转发,或者在运行
vagrant up
后运行以下脚本:
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"
你在Dockerfile中暴露端口了吗?是的!我在原始帖子中添加了一个指向图像Dockerfile的链接,以供参考。