在OS X上用Docker设置开发环境的正确方法是什么?

介绍

我无法find一个好的方法来在OS X上使用Docker和Boot2Docker来设置开发环境。 我遇到的问题是如何pipe理源代码,以便:

  1. 我可以使用已经安装的工具(文本编辑器,IDE,git等)修改OS X上的代码。
  2. 这些修改反映在Docker容器中,所以如果我重新运行testing或刷新网页,我可以立即看到我的更改。

理论上,通过将我的源代码安装为一个卷,这应该很容易:

docker run -it -v /path/to/my/source/code:/src some-docker-image 

不幸的是,这有两个主要的问题,使得它在OS X上完全无法使用:

问题#1:在Virtual Box(使用vboxsf)上挂载的卷非常慢

例如,如果源代码是Docker镜像的一部分,这里是Jekyll编译我的主页需要多长时间:

 > docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash root@7aaea30d98a1:/src# time bundle exec jekyll build [...] real 0m7.879s user 0m7.360s sys 0m0.600s 

这里是完全相同的Docker镜像,除了这次,我从OS X安装源代码:

 > docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash root@1521b0b4ce6a:/src# time bundle exec jekyll build [...] real 1m14.701s user 0m9.450s sys 0m3.410s 

问题#2:文件观看被打破

SBT,Jekyll和grunt中的默认监视机制使用inotify等技术,如果它们在Docker容器中运行,并且在OS X中对更新后的文件夹进行更改,则这些技术不起作用。

我尝试过的解决方法

我寻找解决scheme(包括所有这些),并尝试了其中的一些,但还没有find一个成功的:

  1. 我切换Boot2Docker使用NFS ,但它也一样慢。
  2. 我尝试了Vagrant + NFS ,而且速度也一样慢。
  3. 我尝试了一个Samba安装 ,但该文件夹在Docker容器中总是显示为空。
  4. 我试图使用unison文件系统 ,它简要地工作同步文件,但是保持显示连接错误 。
  5. 我启用了Jekyll中的投票function,但这大大增加了延迟,直到我的更改被提取。
  6. 我尝试了一种“在OS X上使用Vagrant更快,更友好的Docker”,并取得了一些进展。 而不是jekyll编译慢10-15倍,是2-3倍慢。 这样比较好,但还不够好用。

有没有人find一个实际的解决scheme,并允许您高效地开发与Docker和OS X的代码?

更新:最后一个解决scheme!

我终于find了一个使用Boot2Docker + rsync的解决scheme。 我已经捕获了如何在自己的答案中设置这个细节,以及一个名为docker-osx-dev的开源项目。

我决定添加我自己的答案,迄今为止find的最好的解决scheme。 我会更新这个,如果我find更好的select。

迄今最好的解决scheme

我发现在OS X上使用Docker设置高效的开发环境的最佳解决scheme是: Boot2Docker + Rsync 。 使用rsync,Docker容器中的构build时间与直接在OSX上运行构build相当。 此外,文件观察者代码不需要轮询(因为rsync使用普通文件夹,所以inotify工作),所以热重新加载几乎一样快。

有两种方法可以进行设置:自动安装和手动安装。

自动安装

我已经将用Rsync设置Boot2Docker的所有步骤打包到一个名为docker -osx-dev的开源项目中。 代码有点粗糙,但我已经成功使用了几个星期,可以轻松地在3个不同的技术栈之间切换3个项目。 尝试一下,报告错误,并提交一些PR! 另外,请参阅我的博客post, 在OS X上使用Docker的高效开发环境以获取更多信息。

手动设置

  1. 安装Boot2Docker : brew install boot2docker
  2. 运行Boot2Docker,但禁用了VirtualBox共享文件夹: boot2docker init && boot2docker start --vbox-share=disable
  3. 运行boot2docker shellinit并将打印出来的环境variables复制到~/.bash_profile文件中。
  4. 在Boot2Docker虚拟机上安装rsync: boot2docker ssh "tce-load -wi rsync"
  5. 在Boot2Docker虚拟机上创build所需的基础文件夹,并为它们正确设置权限。 例如,如果要同步OS X中的/foo/bar文件夹,则需要在Boot2Docker VM上创build/foo/barboot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
  6. 运行rsync将文件同步到Boot2Docker虚拟机: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo 。 检查rsync文档以获取可能要启用的各种设置,例如使用--exclude .git在同步时排除.git文件夹。
  7. 使用文件观察器保持文件同步。 例如,您可以使用fswatch ( brew install fswatch )传送到rsync。
  8. 此时,您应该可以使用docker run来启动Docker容器,并使用-v标志来挂载您正在同步的文件夹: docker run -v /foo/bar:/src some-docker-image
  9. 照常更新OS X上的代码。 更改应该使用rsync快速传播,正常的文件观察者代码应该像往常一样(即使用inotify )来获取更改,并且构build应该快速运行,因为所有文件都是“本地”容器。
  10. 如果您需要testing正在运行的网站,请运行boot2docker ip命令来查明它的IP地址。

更新 :现在, Docker for Mac已经处于testing中,并且没有黑客function,如果没有散文的攻击和解决方法,这条路线对于本地开发来说可能更合理。

不要 。 我知道这不是你可能希望得到的答案,但是要诚实地评估试图获得本地源代码+ dockerized执行的成本/收益,而不是在OSX上进行本地开发。

在某个时刻,所有的问题,设置的努力和运作的痛点都可以得到很好的解决,但是现在我认为这是一个净亏损。

问题#1:在Virtual Box(使用vboxfs)上挂载的卷非常慢

等一会儿,这几乎肯定会改善。

问题#2:文件观看被打破

我不确定在不久的将来会解决这个问题。 如果这种types的function对于您的开发工作stream程来说是关键的话,那么我会认为这是一个瑕疵。 与仅仅使用rbenv / bundler来pipe理你的jekyll / ruby​​安装和在OSX上本地运行它们相比,这是不值得一个重大的研发努力,就像过去十年来人们一直在成功地运行一样。

就像“云”没有参与我的本地开发设置,目前,docker是testing/分期/部署和运行数据库和其他第三方组件的胜利,但我实际上编码的应用程序直接运行在OSX上。

Docker for Mac和Windows应该是在OS X(和Windows)上使用Docker进行开发的最佳方式。 作为一款Docker产品,该软件是一个“集成的,易于部署的环境,用于从Mac或Windows构build,组装和传输应用程序”。它声称能够解决OP提出的问题。 从2016年3月24日发布公告 :

  • 更快,更可靠:不再需要VirtualBox! Docker引擎运行在Mac OS X上的xhyve虚拟机或Windows上的Hyper-V虚拟机上的Alpine Linux发行版上,该虚拟机由Docker应用程序pipe理。 你不需要docker-machine来运行Mac和Windows的Docker。
  • 工具集成:Docker for Mac是一个Mac应用程序,Docker for Windows是一个Windows应用程序,包括本地用户界面和自动更新function。 Docker工具集与它捆绑在一起:Docker命令行,Docker Compose和Docker公证人命令行。
  • 为您的代码和数据安装卷:卷数据访问正常工作,包括文件更改通知(在Mac上,inotify现在可以无缝地在卷安装目录的容器内工作)。 这使编辑/testing周期能够在“容器”开发中。
  • 轻松访问本地主机networking上运行的容器:适用于Mac和Windows的Docker包含一个用于容器的DNS服务器,并与Mac OS X和Windows联网系统集成在一起。 在Mac上,即使连接到一个非常严格的公司VPN,也可以使用Docker。
  • Mac版Docker从头构build,能够适应OS X沙箱安全模式,我们正在与苹果紧密合作来实现这一目标。

免责声明:我可能会有偏见,因为我是docker同步的作者。

我可能尝试了所有在这里命名的解决scheme,包括更多(见compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ),但他们基本上或者失败的一面性能(大多数)或在docker机(或没有)使用/强制执行。

build立了http://docker-sync.io来合并所有的解决scheme,并提供最好的策略(实现几个,你可以select)。;

它可以与rsync(单向同步)一起使用,包括用户的权限修正和一致性(双向同步)。 它既不强迫你进入docker-machine或特定的hypervisor,也不要求你有docker for Mac。 它适用于所有这些。

性能EugenMayer / docker-sync / wiki / 4.-性能不受影响,就像你根本没有股票。

docker同步及其更改观察者进行了优化,并与12k文件的项目工作没有问题。

试一试,如果你喜欢,我很乐意听到反馈!

我感觉到你了! 我想我已经尝试了几乎所有的尝试,不幸的是它仍然很慢。 然后我看到这个评论https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 ,build议使用Vagrant和Parallels而不是Virtualbox。 这让我可以使用nfs,而且确实为我的项目(Drupal)看到了一个很大的性能提升。

这是stream浪文件。 所有你需要做的就是安装vagrant,把它复制到一个名为Vagrantfile的文件中,然后放在一个文件夹中。 去那个文件夹,只是做一个vagrant up而不是正常的boot2docker了。

 Vagrant.configure(2) do |config| config.vm.box = "parallels/boot2docker" config.vm.network "forwarded_port", guest: 80, host: 80 config.vm.synced_folder( "/Users/dicix/work/www", "/vagrant", type: 'nfs', nfs_udp: true, mount_options: %w[actimeo=2], bsd__nfs_options: %w[alldirs maproot=root:wheel] ) end 

我也用vagrant与parallels和boot2docker( https://github.com/Parallels/boot2docker-vagrant-box )。 开发对我来说从来都不是那么容 docker-compose和大型设置工作得很好。 我真的不觉得有延迟或大量的资源消耗。

这是我的Vagrantfile样子:

 Vagrant.configure(2) do |config| config.vm.network "private_network", ip: "192.168.33.10" config.vm.box = "parallels/boot2docker" config.vm.synced_folder "/Users", "/Users", type: "nfs", mount_options: ["nolock", "vers=3", "udp"], id: "nfs-sync" end 

我已经在OS X(2011年中期的Macbook Air)+ Boot2Docker + Docker-compose环境中开发了几个星期了。 还没有遇到主要的性能问题,但我避免在开发时运行任何types的构build(为什么不使用像jekyll serve --skip-initial-build ?)。 以下是我使用的示例docker-compose.yml文件:

泊坞窗,compose.yml:

 test: build: . volumes: - ./client:/src/client - ./server:/src/server - ./test:/src/test command: nodemon --exec jasmine-node -- test/ --verbose --autotest --captureExceptions --color environment: - DEBUG=* 

Dockerfile:

 FROM node:0.12 RUN mkdir -p /src WORKDIR /src ENV PATH=/src/node_modules/.bin:$PATH # We add package.json first so that we the # image build can use the cache as long as the # contents of package.json hasn't changed. COPY package.json /src/ RUN npm install --unsafe-perm COPY . /src CMD [ "npm", "start" ] EXPOSE 3000 

我有时候使用NFS( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ),但是在这样做的时候并没有注意到性能的巨大差异。

对我来说,一个简单的docker-compose up test的方便性docker-compose up test ,让我的环境运行是值得的性能成本(我经常工作在不同的堆栈多个项目)。

PS: nodemon是less数使用vboxsf的文件监视器之一(请参阅https://github.com/remy/nodemon/issues/419 )。

Docker Unison的作品就像一个魅力! https://github.com/leighmcculloch/docker-unison

双向同步具有非常好的性能!

让docker工作作为一个开发工具是可能的。 但是它会受到伤害。 我在这里logging了这个过程:

http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html

这个方法是最新的(2015年9月),也是在Mac上获得Docker安装的最简单的方法: link here:

您使用Docker Toolbox安装Docker 链接到这里的说明:

这是一个完整的Docker安装包,包括以下Docker工具:

Docker Machine用于运行docker-machine二进制文件

Docker Engine用于运行docker二进制文件

Docker撰写用于运行docker-compose二进制文件

Kitematic,Docker GUI是为Docker命令行环境预configuration的一个shell

Oracle VM VirtualBox

在这里输入图像说明

什么在工具箱:

  • Docker客户端
  • docker机
  • Docker撰写(仅限Mac)
  • Docker Kitematic
  • VirtualBox的