好吧,我终于想通了,结果证明解决方案是根本不使用 boot2docker。根据我对 Vagrant 源代码的深入研究、阅读问题以及重新观看 Docker 提供程序介绍视频,结果表明您需要使用代理虚拟机来托管容器,而不是 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 将使用该文件来启动代理虚拟机:
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 配置程序将自动为您在代理虚拟机上安装 Docker。内联 shell 脚本强制 Vagrant 重新登录到容器中,以便在安装后可以使用 Docker。最后,我在此 Vagrantfile 中转发我需要的端口,而不是原始端口(同时仍然使用ports
原始配置选项)。
就像默认的 boot2docker 策略一样,Vagrant 足够聪明,可以为使用它的任何映像重用代理虚拟机的现有实例。
希望这对以后的人有帮助。