在boot2docker中不使用主机DNS的Docker容器

我在我的Mac上运行boot2docker。 OSX版本10.9.3 boot2docker版本4.3.12 Docker版本0.12.0

boot2docker映像是一个使用virtualbox的stream浪盒。 我已经尝试了一些stream浪汉箱(例如stigkj / boot2docker)。 他们都展示了这个问题。

如果我ssh进入boot2docker映像,看看/etc/resolv.conf它使用的是nameserver 10.0.2.3。

我用这个命令启动一个简单的docker映像:

docker run -i -t ubuntu /bin/sh 

查看该容器中的/etc/resolv.conf,它使用8.8.8.8和8.8.4.4作为名称服务器。

docker.log上的docker.log文件中,有这样一行:

 2014/06/30 15:25:01 Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4] 

据我所知,docker应该使用主机的名称服务器。 只有当主机使用127.0.0.1作为域名服务器时,它应该默认为google的域名服务器作为备份。

主机没有使用127.0.0.1作为名称服务器,但似乎docker认为它是。 任何build议,我怎样才能正确地检测到名称服务器?

我find了一个修复。 看起来,boot2docker映像在从主机提取DNS之前运行docker守护进程。 因此,boot2docker认为DNS启动时设置为127.0.0.1,然后机器将其更改为正确的名称服务器。

解决方法是在映像启动后重新启动docker守护进程。 在vagrant中,我通过在我的Vagrantfile的相应位置添加下面的命令来完成这个操作:

 config.vm.provision :shell, inline: "/etc/init.d/docker restart" 

看起来这是boot2docker中的一个已知问题,将在即将发布的版本中修复: https : //github.com/boot2docker/boot2docker/issues/357

信用于@oillio的问题链接和里面的讨论。

它发生在Windows 7环境以及使用boot2docker 1.0.1,我按照https://github.com/boot2docker/boot2docker/issues/357中的build议

 $ sudo udhcpc # refresh the DHCP $ sudo /etc/init.d/docker restart # restart the service