OS X上的Docker和文件共享

时间:2015-01-16 18:11:15

标签: macos performance virtual-machine docker

确定。我正在玩不同的工具来准备开发环境。 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之间共享。

5 个答案:

答案 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虚拟机中配置的,这会强制您拥有两个存储库:一个用于克隆用来给客人充气的环境和包含实际来源的环境,巩固这两个世界变得非常痛苦。

解决问题的最佳方法是:

  1. 删除vboxfs以支持共享传输机制,从而在访客中产生更好的I / O,例如Network File System。不幸的是,对于Windows用户来说,获得NFS服务支持的唯一方法是运行Windows的企业版(我相信Windows 10仍然适用)。
  2. 恢复将原始磁盘分区安装到guest虚拟机中,注意提供虚拟机管理程序原始磁盘访问的相关风险
  3. 如果您的开发人员完全受到Linux和OS X用户的攻击,则选项1可能是可行的。创建一个Vagrant计算机并在主机和来宾之间配置NFS shares并获利。如果你确实有Windows用户,那么,除了购买企业许可证之外,最好只是让他们重新分配他们的磁盘并在访客虚拟机中工作。

    Windows host and Arch Linux guest with raw disk access

    我个人使用Windows主机并且在我的SSD上有一个64 GB的分区,我直接挂载到我的Arch Linux客户端并在那里运行。我还切换到GPT和UEFI,并且可以选择直接启动到Arch Linux,以防我想要规避虚拟化硬件的开销,给我两个世界中最好的一点而不妥协。

答案 2 :(得分:2)

两个步骤可以很好地改善您的表现:

  1. 切换到NFS 。你可以use this script to do this

  2. 将您的VBox网卡驱动程序切换为FAST III您可以在default计算机上执行此操作:

  3. 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文件的日期/时间和大小)