在OS X上用Docker设置开发环境的正确方法是什么?
介绍
我无法find一个好的方法来在OS X上使用Docker和Boot2Docker来设置开发环境。 我遇到的问题是如何pipe理源代码,以便:
- 我可以使用已经安装的工具(文本编辑器,IDE,git等)修改OS X上的代码。
- 这些修改反映在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一个成功的:
- 我切换Boot2Docker使用NFS ,但它也一样慢。
- 我尝试了Vagrant + NFS ,而且速度也一样慢。
- 我尝试了一个Samba安装 ,但该文件夹在Docker容器中总是显示为空。
- 我试图使用unison文件系统 ,它简要地工作同步文件,但是保持显示连接错误 。
- 我启用了Jekyll中的投票function,但这大大增加了延迟,直到我的更改被提取。
- 我尝试了一种“在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的高效开发环境以获取更多信息。
手动设置
- 安装Boot2Docker :
brew install boot2docker
。 - 运行Boot2Docker,但禁用了VirtualBox共享文件夹:
boot2docker init && boot2docker start --vbox-share=disable
。 - 运行
boot2docker shellinit
并将打印出来的环境variables复制到~/.bash_profile
文件中。 - 在Boot2Docker虚拟机上安装rsync:
boot2docker ssh "tce-load -wi rsync"
。 - 在Boot2Docker虚拟机上创build所需的基础文件夹,并为它们正确设置权限。 例如,如果要同步OS X中的
/foo/bar
文件夹,则需要在Boot2Docker VM上创build/foo/bar
:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
。 - 运行rsync将文件同步到Boot2Docker虚拟机:
rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
。 检查rsync文档以获取可能要启用的各种设置,例如使用--exclude .git
在同步时排除.git
文件夹。 - 使用文件观察器保持文件同步。 例如,您可以使用fswatch (
brew install fswatch
)传送到rsync。 - 此时,您应该可以使用
docker run
来启动Docker容器,并使用-v
标志来挂载您正在同步的文件夹:docker run -v /foo/bar:/src some-docker-image
。 - 照常更新OS X上的代码。 更改应该使用rsync快速传播,正常的文件观察者代码应该像往常一样(即使用
inotify
)来获取更改,并且构build应该快速运行,因为所有文件都是“本地”容器。 - 如果您需要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的