1. Qiita
  2. Items
  3. docker

OSXでDockerを超高速化するdinghy

  • 590
    Stock
  • 3
    Comment
Stocked

【追記 2016/06/21】
Docker for Macがリリースされました。これでVirtualBoxを使う必要はなくなったので、この記事にあるdinghyを導入する必要はありません。


OSXでDockerを使うときには、VirtualBox + Docker Machineを使う事が多いと思います。しかし、VirtualBoxの共有フォルダ機能は凄く遅いため、その上で動くDockerも共有Volumesを使うと遅くなるという問題があります。

Vagrantの場合には、NFSマウントを使う事で早くすることができますが、Docker Machineにはその機能がありません。

そこで、OSXのDocker MachineのVolumes機能をNFSに入れ替えてくれるdinghyを試してみました。

codekitchen/dinghy: faster, friendlier Docker on OS X

https://github.com/codekitchen/dinghy

  • Volume sharing機能でNFSを使い高速化します。VMWareで30秒、Virtualboxで90秒かかる中規模のRailsアプリの起動が5秒に短縮されます。
  • ファイルの変更イベントも通知されるのでguardやwebpackなどの変更検知アプリが正しく動くようになります。
  • build-in DNSとHTTP proxyを使いコンテナ内に容易にアクセスできます。

インストール

インストールは簡単で、homebrewやpackageでdockerをインストールしたあと、下記の様なコマンドを実行するだけです。

brew tap codekitchen/dinghy
brew install dinghy
dinghy create --provider virtualbox

これで完了です。もう既存のDocker Machineを使わないと言うのであれば、docker-machine rm default -yしてください。

このあとは、docker-machineコマンドの代わりにdinghyコマンドを使って操作します。なぜかコマンド体系が微妙に違うので気をつけて下さい。

$ dinghy
Commands:
  dinghy create          # create the docker-machine VM
  dinghy destroy         # stop and delete all traces of the VM
  dinghy halt            # stop the VM and services
  dinghy help [COMMAND]  # Describe available commands or one specific command
  dinghy ip              # get the VM's IP address
  dinghy nfs             # start or stop the internal nfs daemon
  dinghy restart         # restart the VM and services
  dinghy shellinit       # returns env variables to set, should be run like $(dinghy shellinit)
  dinghy ssh [args...]   # ssh to the VM
  dinghy status          # get VM and services status
  dinghy up              # start the Docker VM and services
  dinghy upgrade         # upgrade the boot2docker VM to the newest available
  dinghy version         # display dinghy version

私の環境では起動時に下記の様なエラーが出たので、証明書を再生成しました。

$ dinghy start
docker: An error occurred trying to connect: Post https://192.168.99.100:2376/v1.22/containers/create?name=dinghy_http_proxy: x509: certificate is valid for 192.168.99.101, not 192.168.99.100.
$ docker-machine regenerate-certs dinghy

環境設定

私は.zshrcを複数のマシンで共有しているので、下記の様に変更しました。

これでdinghyの有無を問わずdm-startでDocker Machineを起動できます。

# Docker
alias d="docker"
alias dc="docker-compose"
if [ -s "/usr/local/bin/dinghy" ] ; then
  alias dm="dinghy"
  alias dm-start="dinghy start && eval \"\$(dinghy shellinit)\""
  alias dm-restart="dinghy restart && eval \"\$(dinghy shellinit)\""
  alias dm-env="eval \"\$(dinghy shellinit)\""
else
  alias dm="docker-machine"
  alias dm-start="docker-machine start default && eval \"\$(docker-machine env default)\""
  alias dm-restart="docker-machine restart default && eval \"\$(docker-machine env default)\""
  alias dm-env="eval \"\$(docker-machine env default)\""
fi

if [ -s "/usr/local/bin/docker-machine" ] ; then
  dm-env > /dev/null 2>&1
fi

使い方

あとは今までと同じように動かせます。

一度起動してしまえば、違いを気にすることはほとんどないでしょう。

高速化も大きな恩恵ですが、それよりもGuardやwebpackが変更検知してくれるようになったことが一番の恩恵でした。

問題点

問題点としては、dinghyが80番ポートを使うので、80番にマッピングできないことです。なぜ80番を使うんだ。。。。せめて81番とかつかってくれればいいのに・・・

追記: コメントでhttp proxy機能を切れば80番が解放されると教えてもらいました。

volume mount配下でchownができないので npm install などが転ける問題があります。仕様なのでどうしようもないようです。

https://github.com/codekitchen/dinghy/issues/17

下記の様にして凌ぎました。

cp /usr/src/app/package.json /root/
cd /root && npm install -q
rsync -rlzuIO --ignore-errors /root/node_modules/ /usr/src/app/node_modules > /dev/null 2>&1
rm -rf /root/node_modules /root/package.json

執筆時の環境

$ docker -v
Docker version 1.10.1, build 9e83765
$ dinghy -v                             
Dinghy 4.2.0

宣伝

DevOps好きだ!と思っている方、一緒に働きませんか? 3,000万人の予約を支えるDevOpsエンジニア募集!でお待ちしています。

よければ、トレタメンバーのQiitaも見ていって下さい。

Send an edit requestYou can propose improvements about the article to the author 💪
Comments Loading...
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.