我无法找到使用Docker和Boot2Docker在OS X上设置开发环境的好方法。我遇到的问题是如何管理源代码,以便:
理论上,通过将源代码作为卷安装,这应该很容易实现:
docker run -it -v /path/to/my/source/code:/src some-docker-image
不幸的是,这有两个主要问题使它在OS X上完全无法使用:
例如,如果源代码是Docker镜像的一部分,这里是Jekyll编译homepage需要多长时间:
> 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
SBT,Jekyll和grunt中的默认监视机制使用诸如inotify之类的技术,如果它们在Docker容器中运行并且在OS X中对安装的文件夹进行了更改,则这些技术不起作用。
我搜索了解决方案(包括SO上的所有解决方案)并尝试了其中一些解决方案,但未找到成功解决方案:
有没有人找到一个真正有效的解决方案,并允许您使用Docker和OS X高效地开发代码?
我终于找到了一个使用Boot2Docker + rsync看起来很有效的解决方案。我已经在my own answer以及名为docker-osx-dev的开源项目中捕获了有关如何设置此内容的详细信息。
答案 0 :(得分:46)
我决定用我迄今为止找到的最佳解决方案添加我自己的答案。如果我找到更好的选项,我会更新。
我发现在OS X上使用Docker设置高效开发环境的最佳解决方案是: Boot2Docker + Rsync 。使用rsync,Docker容器中的构建时间与直接在OSX上运行构建相同!此外,文件观察程序代码不需要轮询(inotify
,因为rsync使用普通文件夹),所以热重新加载几乎一样快。
有两种设置方法:自动安装和手动安装。
我已经将使用Rsync设置Boot2Docker的所有步骤打包到一个名为docker-osx-dev的开源项目中。代码有点粗糙,但我已成功使用它几周,可以轻松地在3个项目之间切换3个不同的技术堆栈。尝试一下,报告错误,并提交一些PR!另外,请参阅我的博客文章A productive development environment with Docker on OS X以获取更多信息。
brew install boot2docker
。boot2docker init && boot2docker start --vbox-share=disable
。boot2docker shellinit
并将其打印出来的环境变量复制到~/.bash_profile
文件中。boot2docker ssh "tce-load -wi rsync"
。/foo/bar
文件夹,则需要在Boot2Docker VM上创建/foo/bar
:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
。rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
。检查rsync文档以了解您可能要启用的各种设置,例如在同步时使用--exclude .git
排除.git
文件夹。brew install fswatch
)管道传输到rsync。docker run
启动Docker容器,并使用-v
标志来安装您正在同步的文件夹:docker run -v /foo/bar:/src some-docker-image
。inotify
),并且构建应该快速运行,因为所有文件都是容器的“本地”。 / LI>
boot2docker ip
命令以查找其所在的IP。答案 1 :(得分:18)
更新:既然docker for mac处于测试状态且具有非黑客功能,那么在没有文章价值的黑客的情况下,对于本地开发来说,走这条路可能更合理和解决方法。
<强>唐&#39;吨即可。我知道这不是你可能希望的答案,但要认真评估尝试获取本地源代码+ dockerized执行与仅在OSX上进行本地开发的成本/收益。
在某些时候,所有问题,设置工作和操作上的痛点都可以得到很好的解决,但截至目前我对此的看法是净损失。
问题#1:Virtual Box上安装的卷(使用vboxf)非常慢
等一会儿,这几乎肯定会有所改善。
问题#2:文件观看被破坏
我不确定在不久的将来可以解决这个问题。如果这种类型的功能对您的开发工作流程至关重要,我会认为这是一个破解者。与仅仅使用rbenv / bundler管理你的jekyll / ruby安装并在OSX上本地运行它们相比,它不值得进行重大的研发工作,就像人们在过去十年里成功地做了一样。
就像&#34;云&#34;没有参与我的本地开发设置,目前,docker是测试/暂存/部署以及运行数据库和其他第三方组件的胜利,但我实际编码的应用程序直接在OSX上运行。< / p>
答案 2 :(得分:12)
适用于Mac和Windows的Docker 将是在OS X(和Windows)上使用Docker进行开发的最终方式。作为Docker产品,该软件是一个“集成,易于部署的环境,用于从Mac或Windows构建,组装和运送应用程序。”它旨在解决OP提出的问题。来自This is a good example:
答案 3 :(得分:3)
免责声明:我可能有偏见,因为我是docker-sync的作者。
我可能尝试过这里命名的所有解决方案,包括更多(请参阅compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync),但它们基本上要么在性能方面失败(大部分都是),要么在docker-machine上失败(或者没有使用/强制执行。
http://docker-sync.io已经构建为合并所有解决方案并提供最佳策略(实现几个,您可以选择)。
它可以与rsync(单向同步)一起使用,包括用户的权限修复,以及unison(双向同步)。它既不会强迫你进入docker-machine或特定的hypervisor,也不要求你拥有适用于Mac的docker。它适用于所有人。
性能EugenMayer / docker-sync / wiki / 4.-性能不受影响,就像你根本没有共享。
docker-sync及其更改观察器已经过优化,可以处理12k文件没有问题的项目。
试一试,如果你愿意,我很乐意听到反馈!
答案 4 :(得分:2)
我感觉到你!我想我已经尝试过你尝试过的所有东西,不幸的是它仍然很慢。然后我发现了这条评论https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254,建议使用Vagrant和Parallels而不是Virtualbox。这让我可以使用nfs,我确实看到了我的项目(Drupal)的巨大性能提升。
这是Vagrant文件。您需要做的就是安装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
答案 5 :(得分:2)
我也在使用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
答案 6 :(得分:1)
我已经在OS X(2011年中期的Macbook Air)+ Boot2Docker + Docker-compose环境中开发了几周。没有遇到主要的性能问题,但我在开发时避免运行任何类型的构建(为什么不使用像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
让我的环境运行的便利性是值得的性能成本(我经常处理具有不同堆栈的多个项目)。
PS:nodemon
是少数使用vboxsf的文件观察者之一(请参阅https://github.com/remy/nodemon/issues/419)。
答案 7 :(得分:0)
Docker Unison就像一个魅力! https://github.com/leighmcculloch/docker-unison
双向同步,性能非常好!
答案 8 :(得分:-1)
让docker作为开发工具工作是可能的。但它会受到伤害。我在这里记录了这个过程:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
答案 9 :(得分:-4)
此方法是最新的(2015年9月)最简单的在Mac上安装Docker的方法: link here:
使用 Docker Toolbox link to instructions here:
安装Docker这是一个完整的Docker安装程序包, 其中包括以下Docker工具:
用于运行docker-machine二进制文件的Docker Machine
用于运行docker二进制文件的Docker Engine
Docker Compose用于运行docker-compose二进制文件
Kitematic,Docker GUI 为Docker命令行环境预配置的shell
Oracle VM VirtualBox