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

时间:2015-05-07 00:39:39

标签: macos docker development-environment boot2docker

简介

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

  1. 我可以使用我已安装的工具(文本编辑器,IDE,git等)修改OS X上的代码。
  2. 这些修改反映在Docker容器中,因此如果我重新运行测试或刷新网页,我可以立即看到我的更改。
  3. 理论上,通过将源代码作为卷安装,这应该很容易实现:

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

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

    问题#1:Virtual Box上安装的卷(使用vboxsf)非常慢

    例如,如果源代码是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
    

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

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

    我尝试过的解决方法

    我搜索了解决方案(包括SO上的所有解决方案)并尝试了其中一些解决方案,但未找到成功解决方案:

    1. switched Boot2Docker to use NFS,但速度一样慢。
    2. 我尝试了Vagrant + NFS,这也一样慢。
    3. 我尝试了Samba mount,但该文件夹在Docker容器中始终显示为空。
    4. 我尝试使用unison file system,它曾短暂地用于同步文件,但之后保留了showing connection errors
    5. 我启用了polling in Jekyll,但这显着增加了延迟,直到我的更改被提升为止。
    6. 我尝试了dinghy,一个更快,更友好的Docker on OS X with Vagrant"并获得一些改进。而不是jekyll编译慢10-15倍,它慢2-3倍。这样更好,但仍然不太可用。
    7. 有没有人找到一个真正有效的解决方案,并允许您使用Docker和OS X高效地开发代码?

      更新:最后的解决方案!

      我终于找到了一个使用Boot2Docker + rsync看起来很有效的解决方案。我已经在my own answer以及名为docker-osx-dev的开源项目中捕获了有关如何设置此内容的详细信息。

10 个答案:

答案 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以获取更多信息。

手动设置

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

  • 更快更可靠:不再需要VirtualBox! Docker引擎在Mac OS X上的xhyve虚拟机或Windows上的Hyper-V VM上运行在Alpine Linux发行版中,该VM由Docker应用程序管理。您不需要docker-machine来运行Docker for Mac和Windows。
  • 工具集成:Docker for Mac是Mac应用程序,Docker for Windows是Windows应用程序,包括本机用户界面和自动更新功能。 Docker工具集与它捆绑在一起:Docker命令行,Docker Compose和Docker Notary命令行。
  • 代码和数据的卷安装:卷数据访问正常工作,包括文件更改通知(在Mac上,inotify现在可以无缝地在卷装入目录的容器内工作)。这使得“in container”开发的编辑/测试周期成为可能。
  • 轻松访问本地主机网络上正在运行的容器:适用于Mac和Windows的Docker包含用于容器的DNS服务器,并与Mac OS X和Windows网络系统集成。在Mac上,即使连接到限制性很强的公司VPN,也可以使用Docker。
  • Docker for Mac从头开始构建,以便能够适应OS X沙箱安全模型,我们正在与Apple密切合作以实现这一目标。

答案 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

enter image description here

工具箱中的内容:

  • Docker客户端
  • Docker Machine
  • Docker Compose(仅适用于Mac)
  • Docker Kitematic
  • VirtualBox的