Dockerを使用してOS Xで開発環境をセットアップする正しい方法は何ですか?


94

はじめに

DockerとBoot2Dockerを使用してOS Xで開発環境をセットアップする良い方法がわかりません。私が直面している問題は、次のようにソースコードを管理する方法です。

  1. インストール済みのツール(テキストエディター、IDE、gitなど)を使用して、OS Xのコードを変更できます。
  2. これらの変更はDockerコンテナーに反映されるため、テストを再実行したり、Webページを更新したりすると、変更をすぐに確認できます。

理論的には、これはソースコードをボリュームとしてマウントすることで簡単に実行できるはずです。

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

残念ながら、これにはOS Xで完全に使用できなくなる2つの主要な問題があります。

問題#1:VirtualBox(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でマウントされたフォルダーに変更が加えられた場合は機能しません。

私が試した回避策

私はソリューション(SO上のすべてのものを含む)を検索し、それらのいくつかを試しましたが、成功したものは見つかりませんでした。

  1. Boot2DockerをNFSを使用するよう切り替えましたが、速度は同じくらい遅くなりました。
  2. 私はVagrant + NFSを試しましたが、それも同じくらい遅かったです。
  3. Sambaマウントを試しましたが、Dockerコンテナーでフォルダーが常に空で表示されました。
  4. Unisonファイルシステムを使用しようとしましたが、短時間でファイルを同期できましたが、その後も接続エラー表示され続けました。
  5. Jekyllポーリングを有効にしましたが、変更が反映されるまでの遅延が大幅に増加しました。
  6. 私は「Vagrantを使用したOS Xでより速く、よりフレンドリーなDocker」であるDinghyを試してみて、いくつかの改善を得ました。Jekyllのコンパイルが10〜15倍遅くなる代わりに、2〜3倍遅くなりました。それはより良いですが、まだ完全に使用可能ではありません。

実際に機能し、DockerとOS Xを使用してコードを生産的に開発できるソリューションを誰かが見つけましたか?

更新:ついに解決策!

私はようやくBoot2Docker + rsyncを使用して生産的に見えるソリューションを見つけました。これを自分の回答で設定する方法の詳細と、docker-osx-devと呼ばれるオープンソースプロジェクトをキャプチャしました。


OSX用の公式のDockerインストーラーをNFSと一緒に試しましたか?私の知る限り、これはOS X上のDockerに限定された問題ではなく、より大きなコードベースを備えたOS X上のVagrantベースの開発でもあります(同様の問題がありますが、Vagrantでも発生します)。NFSが唯一の実行可能で許容できるソリューションであることがわかりました。
James Mills

@JamesMills:DockerとBoot2Dockerをインストールするための公式の指示に従いました。NFSの設定に関する公式の指示はありますか?私はそれらをGitHubの要点で見つけただけで、使用した後は高速に見えませんでした。NFSをどのようにセットアップしましたか?
Yevgeniy Brikman、2015年


6
Dockerを使用する正しい方法は、OS XではなくLinuxをネイティブで実行するか、すべての開発作業をLinux VM内で実行することです。「boot2docker」統合は、混乱と失望を引き起こすだけの大きな醜いハックです。
larskは

7
@larsks:それは役に立ちません。
Yevgeniy Brikman、2015年

回答:


46

私はこれまでに見つけた最高のソリューションを使用して、自分の答えを追加することにしました。より良いオプションが見つかったら、これを更新します。

これまでのところ最高のソリューション

OS XでDockerを使用して生産的な開発環境をセットアップするために私が見つけた最良のソリューションは、Boot2Docker + Rsyncです。rsyncを使用すると、Dockerコンテナーでのビルド時間は、OSXで直接ビルドを実行するのと同等になります!さらに、ファイルウォッチャーコードはポーリングを必要としないため(inotifyrsyncは通常のフォルダーを使用するため機能します)、ホットリロードはほぼ同じくらい高速です。

セットアップには、自動インストールと手動インストールの2つの方法があります。

自動インストール

Boot2DockerをRsyncで設定するためのすべての手順をdocker -osx-devというオープンソースプロジェクトにパッケージ化しました。コードは少しラフですが、私は数週間、3つの異なる技術スタックを持つ3つのプロジェクト間を簡単に切り替えるためにそれをうまく使用してきました。試して、バグを報告し、PRを送信してください!また、詳細については、私のブログ投稿「OS X上のDockerを使用した生産的な開発環境」も参照してください。

手動設定

  1. インストールBoot2Dockerをbrew 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に必要な基本フォルダを作成し、それらに適切な権限を設定します。たとえば/foo/bar、OS Xからフォルダーを同期する場合は/foo/bar、Boot2Docker VM上にを作成する必要がありますboot2docker 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。同期時にフォルダー--exclude .gitを除外するために使用するなど、有効にしたいさまざまな設定についてrsyncのドキュメントを確認してください.git
  7. ファイルウォッチャーを使用してファイルの同期を維持します。たとえば、rsyncにパイプ接続されたfswatchbrew install fswatch)を使用できます。
  8. この時点で、を使用docker runしてDockerコンテナーを起動し、-vフラグを使用して、同期しているフォルダーをマウントできるはずですdocker run -v /foo/bar:/src some-docker-image
  9. 通常どおり、OS Xでコードを更新します。変更はrsyncを使用して非常に迅速に伝播し、通常のファイル監視コードは変更を通常どおり(つまりを使用してinotify)取得し、すべてのファイルがコンテナに対して「ローカル」であるため、ビルドは高速に実行されます。
  10. 実行中のWebサイトをテストする必要がある場合は、boot2docker ipコマンドを実行して、それがどのIPにあるかを確認します。

共有してくれてありがとう!rsyncが「一方向のみ」であると彼らが言った場合、それは私が2つのコンテナー間でファイルを共有するためにOS Xファイルシステムを使用できないことを意味しますか?例:コンテナ1はソースファイルを監視してバイナリをコンパイルし、コンテナ2はコンパイルされたバイナリを実行するために使用されます(この例ではHaskellを使用)。
ニコラスヘリー

1
@NicolasHery:私の理解では、rsyncは変更をOS XからDockerコンテナーにコピーしますが、その逆はコピーしません。したがって、Dockerコンテナーによって生成されたファイル(コンパイルされたバイナリなど)はOS Xでは表示されません。ただし、これらのファイルがとしてマークされたフォルダーに生成されたVOLUME場合、別のコンテナーにそのボリュームへのアクセス権を与えることができます--volumes-from国旗。まだ試していませんが、うまくいくと思います。
Yevgeniy Brikman、2015年

1
すばらしい答えです。ほとんどのボイラープレートを実行するdocker -machine(github.com/docker/machine)のドライバーを作成できます。
dom

1
@dom:私はそのアイデアが好きですが、ドッカーマシン用のドライバーを作成する方法を知っていますか?リポジトリへのプルリクエストは唯一の方法ですか、それともドライバーを外部で作成することは可能ですか?
Yevgeniy Brikman、2015年

1
このチュートリアルは、Windowsの新しい1.9.1バージョンでも有効ですか?それを使用できますか、それともDockerにはすでにこの「問題」の新しい解決策がありましたか?

18

更新Mac用のdockerがベータ版になり、ハック機能がなくなったため、エッセイのようなハッキングや回避策を講じることなく、ローカル開発にとってそのルートを使用する方がはるかに合理的である可能性があります。

しないでください。私はそれがおそらく望んでいる答えではないことを知っていますが、OSXでローカル開発を行うだけでなく、ローカルソースコード+ Docker化された実行を取得することのコスト/メリットを正直に評価します。

ある時点で、すべての問題、セットアップ作業、および運用上の問題点は十分に解決される可能性がありますが、現時点では、これは正味の損失であると考えています。

問題#1:Virtual Box(vboxfsを使用)にマウントされたボリュームが非常に遅い

しばらく待つと、ほぼ確実に改善されます。

問題#2:ファイル監視が壊れている

この問題の修正が近い将来行われるかどうかはわかりません。このタイプの機能が開発ワークフローの鍵である場合、私はこれを契約違反者と見なします。rbenv / bundlerを使用してjekyll / ruby​​のインストールを管理し、OSXでローカルに実行するのと比較すると、過去10年間以上成功しているように、大きなR&Dの取り組みに値するものではありません。

「クラウド」が私のローカル開発設定にまったく関与していないのと同じように、現時点では、Dockerはテスト/ステージング/デプロイメント、およびデータベースや他のサードパーティコンポーネントの実行に有利ですが、実際にコーディングしているアプリケーションはそのまま実行されますOSX上で。


1
同感です。OSXで開発し、システム内で直接アプリを実行します(ライブリロードなど)。次に、アプリが完成したら、テスト、ステージング、本番用にドッキングします。
ItalyPaleAle 2015年

4
ええと、それは少し失望の言葉です。私はステージング/実稼働環境で常に同等のものを持っています。私がOS Xでコーディングしているとき、それは常に異常値だったのは開発者です。Dockerのドキュメントでは、これが解決された問題であるように思われました。もう1日努力して、何か機能するかどうかを確認します。
Yevgeniy Brikman、2015年

ピーター、今日でもこの答えは有効だと思いますか?ほんの数か月後のことですが、@ Yevgeniyのプロジェクトと、現在修正されている2つの問題だけを考えると、コスト/メリットはすでに価値があると言えます。だよね?
cregox、2015年

1
それは個人的な好みのものです。私はコンサルタントとして私が行き来する膨大な量のプロジェクトのため、私はまだこれを台無しにしないでしょう。私がフルタイムでほとんど同じプロジェクトで数週間/数か月働いていた場合、rsync / fswatchをセットアップする価値があるかもしれません。
Peter Lyons

Docker Toolboxは、homebrewまたは別のパッケージマネージャーを使用している場合、Dockerツールボックスとしてのバージョニングに従っていない限り、Dockerツールのバージョンが同期されなくなるため、現在、この問題に対処するための正しい方法です。
taco

12

MacおよびWindows用の Dockerは、OS X(およびWindows)上のDockerで開発するための最も確実な方法です。Docker製品であるソフトウェアは、「MacまたはWindowsからアプリケーションを構築、アセンブル、および出荷するための統合された、展開が容易な環境」です。それは、OPによって提示された問題を解決できると主張しています。そのから 2016年3月24日発表

  • 高速で信頼性が高く、VirtualBoxは不要です。Dockerエンジンは、Mac OS X上のxhyve仮想マシンまたはWindows上のHyper-V VM上でAlpine Linuxディストリビューションで実行されており、そのVMはDockerアプリケーションによって管理されます。MacおよびWindows用のDockerを実行するためにdocker-machineは必要ありません。
  • ツールの統合: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を使用できます。
  • Mac用Dockerは、OS Xサンドボックスセキュリティモデルに適合するようにゼロから設計されており、Appleと緊密に連携してこれを実現しています。

私は先日これを見ただけで、これは最も有望な解決策のようです。ベータ版がリリースされたら、試してみることに非常に興奮しています。うまくいった場合は、正式に認められた回答に変更します。
Yevgeniy Brikman 16年

4
残念ながら、現在のベータ版(1.11.0-beta7)は他の方法と同じくらい遅いようですので、forums.docker.com
t /…

3

免責事項:私はdocker-syncの作者なので、偏見があるかもしれません。

私はおそらく、ここに挙げたすべてのソリューションをいくつか試してみましたが(いくつかの比較https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-syncを参照)、基本的にどちらかで失敗しましたパフォーマンス(そのほとんど)またはdocker-machine(またはなし)で使用/強制されます。

http://docker-sync.ioは、すべてのソリューションをマージし、最良の戦略を提供するように構築されています(いくつか実装して、選択できます)。

ユーザーのアクセス許可の修正を含むrsync(一方向同期)、およびunison(双方向同期)で使用できます。Dockerマシンや特定のハイパーバイザーに強制されることはなく、Mac用のDockerが必要になることもありません。それらのすべてで動作します。

EugenMayer / docker-sync / wiki / 4.-Performanceのパフォーマンスは影響を受けません。共有がまったくないようです。

docker-syncとそのchange-watchersは最適化されており、12kファイルのプロジェクトで問題なく動作します。

試してみてください。よろしければ、フィードバックをお待ちしています。


2

君の気持ち、分かるよ!私はあなたが試したほとんどすべてを試したと思いますが、残念ながらそれはまだ遅かったです。次に、このコメントhttps://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254に出会い、Virtualboxの代わりにVagrantとParallelsを使用することを提案しました。これにより、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

これにはParallelsのインストールが必要だと思いますか?
Yevgeniy Brikman、2015年

2

Parallelsとboot2dockerでVagrantも使用しています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

1

私は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で動作する数少ないファイルウォッチャーの1つです(https://github.com/remy/nodemon/issues/419を参照)。


Jekyllを使用して最初のビルドをスキップした場合でも、ファイルを変更するたびに、ファイルを再ビルドする必要があります。ソースコードがマウントされている場合は、1〜3分程度かかります。これにより、変更と再読み込みのスタイル開発を行うことができなくなります。
Yevgeniy Brikman、2015年

@YevgeniyBrikmanああ、私はそれを認識していませんでした:(最後のオプションは、boot2docker VM内でコードをライブにし、sshfsを使用してホストマシンにマウントすることです。 Dockerを開発環境として使用するためにマウントされたフォルダーのパフォーマンスが向上
Olivier Lalonde


-1

dockerを開発ツールとして機能させることが可能です。しかし、それは傷つきます。私はここにプロセスを文書化しました:

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


投稿していただきありがとうございます。マウントされたボリュームのパフォーマンスの問題はどのように解決されますか?
Yevgeniy Brikman、2015年

ああ、申し訳ありませんが、vBoxを使用して何かをマウントする必要はありません。通常の
Docker

-4

この方法は最新(2015年9月)であり、MacでDockerを設定する最も簡単な方法です。 リンクは次のとおりです。

Dockerをインストールするには、Docker Toolbox リンクを使用します。

これは完全なDockerセットアップパッケージであり 、次のDockerツールが含まれています。

docker-machineバイナリーを実行するためのDocker Machine

Dockerバイナリを実行するためのDocker Engine

docker-composeバイナリーを実行するためのDocker Compose

Kitematic、Docker GUI、Dockerコマンドライン環境用に事前構成されたシェル

Oracle VM VirtualBox

ここに画像の説明を入力してください

ツールボックスの内容:

  • Dockerクライアント
  • Dockerマシン
  • Docker Compose(Macのみ)
  • Docker Kitematic
  • VirtualBox

3
はい、残念ながら当初提示された問題は解決しませんでした。
Nick
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.