【问题标题】:What's the right way to set up a development environment on OS X with Docker?使用 Docker 在 OS X 上设置开发环境的正确方法是什么?
【发布时间】:2015-05-07 00:39:39
【问题描述】:

简介

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

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

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

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

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

问题 #1:VirtualBox(使用 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,这是一个“在 OS X 上使用 Vagrant 更快、更友好的 Docker”,并得到了一些的改进。 Jekyll 编译不是慢了 10-15 倍,而是慢了 2-3 倍。这更好,但仍然不太好用。

有没有人找到真正有效的解决方案,让您可以使用 Docker 和 OS X 高效地开发代码?

更新:终于找到解决方案了!

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

【问题讨论】:

  • 您已经尝试过用于 OS X 的官方 Docker 安装程序以及 NFS? AFAIK 这不仅是 OS X 上的 Docker 问题,还包括基于 Vagrant 在 OS X 上进行更大代码库的开发(我们也有类似的问题,但 Vagrant )。我发现 NFS 是唯一可行且可接受的解决方案。
  • @JamesMills:我按照官方说明安装了 Docker 和 Boot2Docker。有设置 NFS 的官方说明吗?我只在 GitHub gist 中找到了它们,并且在使用它们之后,它似乎并没有更快。你是如何设置 NFS 的?
  • 使用 Docker 的正确方法是在本地运行 Linux 而不是 OS X,或者在 Linux VM 中完成所有开发工作。 “boot2docker”集成是一个丑陋的大黑客,除了播下混乱和失望之外什么也没做。
  • @larsks:这没有帮助。

标签: macos docker development-environment boot2docker


【解决方案1】:

我决定用迄今为止我找到的最佳解决方案添加我自己的答案。如果我找到更好的选择,我会更新这个。

迄今为止最好的解决方案

我发现在 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. 安装Boot2Docker:brew install boot2docker
  2. 运行 Boot2Docker,但禁用 VirtualBox 共享文件夹:boot2docker init && boot2docker start --vbox-share=disable
  3. 运行boot2docker shellinit 并将它打印出来的环境变量复制到您的~/.bash_profile 文件中。
  4. 在 Boot2Docker 虚拟机上安装 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. 使用文件观察器保持文件同步。例如,您可以将fswatch (brew install fswatch) 通过管道传输到 rsync。
  8. 此时,您应该可以使用 docker run 启动 Docker 容器并使用 -v 标志挂载您正在同步的文件夹:docker run -v /foo/bar:/src some-docker-image
  9. 照常更新 OS X 上的代码。更改应该使用 rsync 快速传播,正常的文件观察程序代码应该像往常一样接收更改(即使用 inotify),并且构建应该快速运行,因为所有文件都是容器的“本地”文件。
  10. 如果您需要测试一个正在运行的网站,请运行boot2docker ip 命令来找出它所在的 IP。

【讨论】:

  • 感谢分享!当他们说 rsync 是“单向”时,这是否意味着我不能使用 OS X 文件系统在两个容器之间共享文件?示例:容器 1 监视源文件并编译二进制文件,容器 2 用于运行编译后的二进制文件(在此示例中使用 Haskell)。
  • @NicolasHery:我的理解是 rsync 会将更改从 OS X 复制到 Docker 容器,而不是相反。因此,Docker 容器生成的任何文件(例如编译的二进制文件)在 OS X 中都不会可见。但是,如果这些文件生成到标记为 VOLUME 的文件夹中,那么您可以授予另一个容器访问该文件的权限使用--volumes-from 标志的卷。我还没有尝试过,但我怀疑它会起作用。
  • 很好的答案。您可以为 docker-machine (github.com/docker/machine) 创建一个驱动程序,为您完成大部分样板文件。
  • @dom:我喜欢这个主意,但你知道如何为 docker-machine 创建驱动程序吗?将请求请求到 repo 是唯一的方法还是可以在外部创建驱动程序?
  • 本教程对 Windows 上的 1.9.1 新版本仍然有效吗?我可以使用它还是 Docker 已经为这个“问题”提供了新的解决方案?
【解决方案2】:

更新:现在 docker for mac 处于测试阶段,具有非 hack 功能,如果没有文章的 hack 和变通方法,那么对于本地开发来说,走这条路可能更合理。

不要。我知道这不是您可能希望的答案,但请诚实评估尝试获取本地源代码 + dockerized 执行与仅在 OSX 上进行本地开发的成本/收益。

在某些时候,所有问题、设置工作和运营痛点都可能得到很好的解决,但就目前而言,我认为这是一个净损失。

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

稍等片刻,这几乎肯定会有所改善。

问题 #2:文件监视中断

我不确定是否会在不久的将来解决此问题。如果这种类型的功能是您的开发工作流程的关键,我会认为这是一个交易破坏者。与仅使用 rbenv/bundler 来管理您的 jekyll/ruby 安装并在 OSX 上本地运行它们(就像人们在过去十年中一直在成功地做的那样)相比,这不值得进行重大的研发工作。

就像“云”在我的本地开发设置中的参与度为零一样,目前,docker 在测试/暂存/部署以及运行数据库和其他第三方组件方面是一个胜利,但我实际上正在编码的应用程序直接在 OSX 上运行。

【讨论】:

  • 我同意这一点。我们在 OSX 上开发并直接在系统内部运行应用程序(通过实时重新加载等)。然后,一旦应用程序完成,我们将其 dockerize 用于测试、登台和生产。
  • 嗯,这有点让人失望。在我的登台/生产环境中,我一直保持平等。当我在 OS X 上编写代码时,开发人员总是异常值。Docker 文档确实让人觉得这是一个已解决的问题。我要再努力一天,看看我能不能做点什么。
  • 彼得,你今天还觉得这个答案有效吗?仅仅几个月后,但考虑到@Yevgeniy 的项目和现在修复的 2 个问题,也许成本/收益现在已经值得了!不是吗?
  • 这是个人喜好。我仍然不会因为作为顾问而跳槽的项目数量众多而对此感到困惑。如果我是一名全职工作人员,主要在同一个项目上工作数周/数月,可能值得设置 rsync/fswatch 的东西。
  • Docker Toolbox 是当今的正确方式,因为如果您使用自制软件或其他包管理器,docker 工具版本将不同步,除非它们遵循 docker 工具箱的版本控制。跨度>
【解决方案3】:

Docker for Mac 和 Windows 将是在 OS X(和 Windows)上使用 Docker 进行开发的最终方式。作为 Docker 产品,该软件是“一个集成的、易于部署的环境,用于从 Mac 或 Windows 构建、组装和交付应用程序”。它声称能够解决 OP 提出的问题。来自其March 24, 2016 announcement

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

【讨论】:

  • 我前几天刚看到这个,它看起来确实是迄今为止最有希望的解决方案。一旦它从测试版出来,我很高兴能试一试,如果它运行良好,我会将其更改为官方接受的答案。
  • 不幸的是,当前的 Beta 版本 (1.11.0-beta7) 似乎与其他方法一样慢,因此可能需要一段时间才能使用 forums.docker.com/t/…
【解决方案4】:

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

我可能尝试了这里提到的所有解决方案,包括更多解决方案(参见编译器https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync),但它们基本上要么在性能方面失败(大多数)要么在使用的 docker-machine(或没有)方面失败/ 强制执行。

http://docker-sync.io 已构建用于合并所有解决方案并提供最佳策略(实施多个,您可以选择)。

它可以与 rsync(1 路同步)一起使用,包括用户权限修复,也可以与 unison(2 路同步)一起使用。它既不会强迫您使用 docker-machine 或特定的虚拟机管理程序,也不会要求您拥有适用于 Mac 的 docker。它适用于所有这些。

性能 EugenMayer/docker-sync/wiki/4.-性能不受影响,就好像你根本没有分享一样。

docker-sync 及其变更观察器经过优化,可以毫无问题地处理包含 12k 文件的项目。

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

【讨论】:

    【解决方案5】:

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

    这是 Vagrant 文件。您需要做的就是安装 vagrant,将其复制到一个名为 Vagrantfile 的文件中,并将其放在某个文件夹中。转到该文件夹​​,然后执行 vagrant up 而不是正常的 boot2docker up。

    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
    

    【讨论】:

    • 我假设这需要并行安装?
    【解决方案6】:

    我还在使用 Vagrant 和并行程序和 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
    

    【讨论】:

      【解决方案7】:

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

      docker-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)。

      【讨论】:

      • 即使我跳过 Jekyll 的初始构建,每次我更改文件时,它都必须重新构建,如果源代码已挂载,这仍然需要 1-3 分钟的时间。这使得不可能进行任何类型的更改和重新加载样式开发。
      • @YevgeniyBrikman 哦,我不知道 :( 我想最后一个选择是让您的代码存在于 boot2docker 虚拟机中,并使用 sshfs 将其安装在您的主机上。否则,我猜想你必须等待更好的挂载文件夹性能才能使用 docker 作为开发环境。
      【解决方案8】:

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

      双向同步,性能非常好!

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

        • 感谢发帖,但这如何解决挂载卷的性能问题?
        • 啊,对不起,您不再需要使用 vBox 来挂载任何东西。您可以通过常规 docker 界面挂载文件夹
        【解决方案10】:

        此方法是在 Mac 上获取 Docker 设置的最新(2015 年 9 月)和最简单的方法: link here:

        您使用 Docker Toolbox link to instructions here:

        安装 Docker

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

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

        用于运行 docker 二进制文件的 Docker 引擎

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

        Kitematic,Docker 图形用户界面 为 Docker 命令行环境预配置的 shell

        Oracle VM VirtualBox

        工具箱里有什么:

        • Docker 客户端
        • Docker 机器
        • Docker Compose(仅限 Mac)
        • Docker Kitematic
        • 虚拟盒子

        【讨论】:

        • 是的,但不幸的是它没有解决最初提出的问题。
        猜你喜欢
        • 2011-02-28
        • 2010-09-20
        • 2010-11-24
        • 2012-04-17
        • 2023-04-02
        • 1970-01-01
        • 2010-10-31
        • 2020-10-03
        • 2020-01-24
        相关资源
        最近更新 更多