OSXでdockerを使った開発環境を組もうとすると、docker入りのVagrant boxを自作しないとならなかったり、docker-machineのファイル共有をセットアップする必要があったりと、開発を始めるまでの手間が多い。
dinghyは上記のような手間を省略し、OSXとdocker環境をシームレスにしてくれるプロダクトで、次の特徴がある。
- ホストマシン(OSX)側のファイルをコンテナにマウントできる
- マウントだけでなくファイルシステムのイベントもサポートする。つまり、webpackなどのファイル更新を検出してタスクを走らせるツールと相性がいい。
- DNSを内包しているので、Macの/etc/hostsを書き換えたり等、自前で名前解決が不要。
- HTTPプロキシを内包しているので、1つのVMに複数のウェブアプリを簡単に起動できるようになっている。
- docker-compose.ymlがそのまま使える。つまりdinghy用に大きなカスタムは不要。
導入方法
Docker三種の神器を入れておく。
brew install docker docker-compose docker-machine
dinghyも入れる。
brew tap codekitchen/dinghy
brew install dinghy
あと、Virtualboxも入ってなければ入れておく。
dinghyの仮想マシンを作る
仮想マシンを作る:
dinghy create --provider=virtualbox
しばらくすると仮想マシンが起動するので、docker用の環境変数をdinghyで調べてセットする。
dinghy shellinit
export DOCKER_HOST=tcp://192.168.99.100:2376
export DOCKER_CERT_PATH=/Users/suin/.docker/machine/machines/dinghy
export DOCKER_TLS_VERIFY=1
export DOCKER_MACHINE_NAME=dinghy
環境変数のセット:
eval $(dinghy shellinit)
ホストマシンでdocker ps
を実行してみる。今回は、証明書がinvalidになっていたので、証明書を再作成して解決。
% docker ps
An error occurred trying to connect: Get https://192.168.99.100:2376/v1.22/containers/json: x509: certificate is valid for 192.168.99.101, not 192.168.99.100
証明書の再作成:
docker-machine regenerate-certs dinghy
参考: x509 certificate error on switching networks · Issue #136 · codekitchen/dinghy
docker images
で調べると、既にdinghyのリバースプロキシが入っている。
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
codekitchen/dinghy-http-proxy 2.0.3 1ad9531485c1 2 weeks ago 248.5 MB
docker-composeでファイル共有をやってみる
ホストマシン上のファイルをdockerコンテナに共有するためのdocker-composeの書き方を試してみる。今回はPHPのコンテナを起動してみる1。
ホストマシン側に共有するコードを作っておく。
mkdir src
echo '<?php phpinfo();' > src/index.php
docker-composeの設定を書く。ポイントは、volumes
のホストマシン側のパスは相対パスにしておくこと。ちなみに、expose
のポート番号とenvironment
のVIRTUAL_HOST
をセットしておくことで、dinghyがDNSにそのホスト名を登録してくれるので、ホストマシンからはそのホスト名でアプリにアクセスできるようになる。
web:
image: php
command: php -S 0.0.0.0:8080
expose:
- "8080"
environment:
- VIRTUAL_HOST=php.docker
working_dir: /code
volumes:
- ./src:/code
docker-compose up -d
http://php.docker/ にアクセスするとPHPの情報が表示される。
ファイルを追加してみる:
echo '<?php var_dump($_SERVER);' > src/server.php
http://php.docker/server.php にアクセスすると追加したプログラムの実行結果が表示される。
おわり
dinghyを使うことでVagrantをメンテしなくて良くなる。Vagrantまわりで苦労している場合は、dinghyを試してみてはいかがだろうか。
参考
-
ファイル共有を試すだけならnginxでもよかったが、公式のnginxイメージはサーバ名がlocalhost固定で、dinghyが発行するサーバ名に対応するのが面倒だったのでPHPのビルトインサーバを使うことにした。 ↩