Install Docker on macOS
Docker installation on macOS
https://docs.docker.com/engine/installation/mac/#/docker-for-ma
こんにちは。エンジニアの志村です。
Docker for Mac便利ですね!
日本語でも様々な記事が出てきています。
私もVagrant + Dockerをメインに使用しておりましたが、ついにDocker for Macに乗り換えました。
弊社では、dev環境をDockerにしているのですが、Vagrant + Dockerの時は快適に開発が出来ました。
ただ、VMを使わなくなった途端にめちゃくちゃ動作が重くなりました。
docker-compose --service-port ●●という感じで、rails serverとwebpack-dev-serverを立ち上げるのですが、ブラウザからの読込が劇的に遅い…。seedデータ突っ込むのもめちゃくちゃ遅い…
フォーラムでも話題になっていますね。
私の環境でいうと、Vagrant + Dockerの時よりも、体感10倍近く速度が落ちました…。
このDockerの中の人の回答を見ると、osxfsを用いてファイルシステムイベントを検知・監視していることが主な原因っぽいですね。
勿論、その他環境により差異はありますが、ファイルシステムを監視する方法を替えれば解決できそうです。
ファイル同期で速度早いと良く言われているのがrsyncですね。
docker-dev-osxという選択肢もありますが、これはDocker for Mac未対応…
どうしようかなーとフォーラムを眺めているとdocker-syncなるものがありました。
フォーラムの中でも評価が良く、結構な人が使ってそうなのでdocker-syncを使用したいと思います。
docker-syncはRubyベースで書かれています。
1. docker-sync, fswatchをインストールします。
$ gem install docker-sync
$ brew install fswatch
ファイルの同期に関してはrsync, unisonが選択出来ます。
rsyncがホスト→ゲストの一方向の通信なのに対し、unisonはNFSのように双方向の通信が可能なようです。
今回はrsyncを使用します。
unisonに関してはまた記事を書ければと思います。
$ brew tap homebrew/dupes
$ brew install rsync
※ schema.rb, Gemfile.lock等、ゲスト(Docker)側で生成されるファイルに関してはdocker cpコマンドを使用するとホスト側に持ってくることが出来ます。
# Docker内のschema.rbをPC側に持ってくる
$ docker cp コンテナ:/var/www/db/schema.rb ./db/schema.rb
2. docker-syncの設定
docker-syncはymlファイルに設定を記述します。
Railsを触っている身としては普段から使用しているのでありがたいです。
docker-syncはDocker Composeを使用します。
production環境やstaging環境でもDockerを使用している方は、docker-compose.ymlの他に、開発環境用のymlファイルを用意する必要があります。
私は開発環境のみなので、docker-compose.ymlを直接編集してしまいます。
公式のwikiに載っているので参考下さい。
docker-sync.yml
docker-compose.yml
docker-compose.ymlにはversion1, version2と2種類の記述方法があります。
ここではversion2を使用します。
このような感じです。
環境によって差異があると思いますので、適宜調整をお願いします。
一番重要なのは、volumesのsync volumeの設定と、アプリケーション(Rails)側のコンテナでvolumesを指定する部分です。
3. docker-syncの起動
$ docker-sync start
もしくは
$ docker-sync-stack start
で起動します!
docker-sync-stack startの場合は、docker-sync startと同時にdocker-compose upも行われます。
私はpry-byebugを使用したいので、普段docker-compose run --service-port webで起動しています。
ターミナルを一枚docker-sync startに使用し、さらにdocker-compose run --service-port webを起動させるようにしています。
ベンチマークはとっていないのですが、Vagrant + DockerをNFSで同期させたのと同じ、もしくはそれ以上に早くなりました!
GUIで様々な設定が出来、VMとかも必要ないのでDocker for Macは便利ですね。
是非docker-syncを使って快適な開発環境を構築してみては如何でしょうか?
Cluexではビジネスサイド、エンジニアサイド共にメンバーを募集しています!
お気軽にご連絡下さいませ!