确定。我正在玩不同的工具来准备开发环境。 Docker是不错的选择。我在docker中创建了整个开发环境,可以在其中构建一个项目。
此项目的源代码位于docker容器之外(在主机上)。这样您就可以使用IDE编辑它并使用docker来构建它。
然而,有一个问题
a)OS X上的Docker使用VM(VirtualBox VM)
b)文件共享速度相当慢(比主机上的文件IO慢)
c)项目有类似gazzilion的文件(夸大问题#a和#b)。如果我在docker中移动源代码,我在IDE中会遇到同样的问题(它必须访问共享文件,而且速度很慢)。
我听说了一些解决方法,以使其快速。但是,我似乎无法找到有关此主题的任何信息。
更新1
我使用了Docker文件共享功能(意思是我运行)
docker run -P -i -v <VMDIR>:<DOCKERDIR> -t <imageName> /bin/bash
然而,VM和Docker之间的共享并不是一个问题。它很快。
瓶颈在主机和VM之间共享。
答案 0 :(得分:2)
我使用的解决方法是不使用boot2docker,而是使用vagrant VM provisioned with docker。安装文件夹host-&gt; vagrant-&gt; docker。
没有这么大的代价在缺点方面,我必须预先将文件夹映射到vagrant(基本上是我的整个工作目录),并预先公开从vagrant box到主机的一系列端口,以便直接从那里访问docker服务。 / p>
从好的方面来说,当我想清理未使用的码头垃圾(图像,卷等)时,我只需要破坏流浪者的vm并重新创建它:)
<强>精化强>
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "trusty-docker"
config.vm.box_url = "https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box"
config.vm.provision "docker"
#by default we'll claim ports 9080-9090 on the host system
for i in 9080..9090
config.vm.network :forwarded_port, guest: i, host: i
end
#NB: this folder mapping will not have the boot2docker issue of slow sync
config.vm.synced_folder "~/work", "/home/vagrant/work"
end
拥有:
host$ vagrant up && vagrant ssh
vagrant$ docker run -it --rm -v $(pwd)/work:/work ubuntu:12.04 find /work
答案 1 :(得分:2)
遗憾的是,Windows和OS X用户目前正在努力解决的一个典型问题是无法轻易解决,尤其是在Windows用户的情况下。主要的罪魁祸首是VirtualBox&#39; vboxfs
用于文件共享,尽管它非常有用,但会导致文件系统I / O不佳。
在很多情况下,开发客户虚拟机内部的项目源会被抓取,主要的两个是由包管理器和具有相当大历史的Git存储库引入的第三方资源。
显而易见的方法是将尽可能多的项目相关文件移到vboxfs
之外的其他地方。例如,将包管理器目录符号链接到项目的vboxfs
树中,例如:
mkdir /var/cache/node_modules && ln -s /var/cache/node_modules /myproject/node_modules
对于在我的SSD上运行几十个依赖项的Node.js应用程序,仅此一次就将启动时间从大约28秒缩短到了大约4秒。
不幸的是,这不适用于管理Git存储库,不能映射/截断您的历史记录并承诺丢失数据,除非Git存储库本身是在guest虚拟机中配置的,这会强制您拥有两个存储库:一个用于克隆用来给客人充气的环境和包含实际来源的环境,巩固这两个世界变得非常痛苦。
解决问题的最佳方法是:
vboxfs
以支持共享传输机制,从而在访客中产生更好的I / O,例如Network File System。不幸的是,对于Windows用户来说,获得NFS服务支持的唯一方法是运行Windows的企业版(我相信Windows 10仍然适用)。如果您的开发人员完全受到Linux和OS X用户的攻击,则选项1可能是可行的。创建一个Vagrant计算机并在主机和来宾之间配置NFS shares并获利。如果你确实有Windows用户,那么,除了购买企业许可证之外,最好只是让他们重新分配他们的磁盘并在访客虚拟机中工作。
我个人使用Windows主机并且在我的SSD上有一个64 GB的分区,我直接挂载到我的Arch Linux客户端并在那里运行。我还切换到GPT和UEFI,并且可以选择直接启动到Arch Linux,以防我想要规避虚拟化硬件的开销,给我两个世界中最好的一点而不妥协。
答案 2 :(得分:2)
两个步骤可以很好地改善您的表现:
切换到NFS 。你可以use this script to do this。
将您的VBox网卡驱动程序切换为FAST III
。您可以在default
计算机上执行此操作:
VBoxManage modifyvm default --nictype1 Am79C973
VBoxManage modifyvm default --nictype2 Am79C973
答案 3 :(得分:1)
我运行一个简单的监视脚本,只要有任何更改,就可以将容器内的rsync从共享源代码卷启动到仅容器的卷。我的入口点仅从容器中读取,以避免性能问题,并且rsync工作得非常好,特别是如果你正确设置它以避免像.git文件夹和库不经常更改的那样。
答案 4 :(得分:0)
我找到的几条信息
我开始使用Vagrant使用VirtualBox并在其中安装Docker。它提供了更大的灵活性
Vagrant VirtualBox配置中的默认共享非常慢
NFS共享速度更快。但是,它可能会相当慢(特别是如果您的构建过程将创建需要写回此共享的文件)。
Vagrant 1.5+有一个rsync选项(使用rsync将文件从主机复制到VM)。它更快,因为它不必回写任何更改。
此rsync选项具有自动同步功能(可以连续同步)。
这个rsync选项消耗了大量的CPU,人们想出了一个可以克服它的宝石(https://github.com/smerrill/vagrant-gatling-rsync)
所以,Vagrant + VirtualBox + Rsync共享文件夹+自动rsync + vagrant gatling看起来对我的案例来说是一个不错的选择(仍在研究它)。
我尝试了流浪汉。但是,它会导致非确定性行为。我不知道是否将新文件复制到VM中。如果需要1秒钟就不会有问题。但是,这需要花费20秒的时间(用户可以切换窗口并在尚未同步新文件时开始构建)。
现在,我正在考虑一些复制ONLY文件的方法。我还在研究阶段。想法是使用FSEvent来监听文件更改并仅发送已更改的文件。看起来有一些工具可以做到这一点。
顺便说一句。使用FSEvent在内部进行加密。它触发完整rsync的唯一问题(它开始比较40k文件的日期/时间和大小)