1
/
5

Docker for Macが遅い問題をdocker-syncで解決する

こんにちは。エンジニアの志村です。

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を用いてファイルシステムイベントを検知・監視していることが主な原因っぽいですね。

勿論、その他環境により差異はありますが、ファイルシステムを監視する方法を替えれば解決できそうです。

docker-sync

ファイル同期で速度早いと良く言われているのがrsyncですね。
docker-dev-osxという選択肢もありますが、これはDocker for Mac未対応…

どうしようかなーとフォーラムを眺めているとdocker-syncなるものがありました。
フォーラムの中でも評価が良く、結構な人が使ってそうなのでdocker-syncを使用したいと思います。

docker-syncはRubyベースで書かれています。

docker-syncの使い方

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を使って快適な開発環境を構築してみては如何でしょうか?

We're hiring!

Cluexではビジネスサイド、エンジニアサイド共にメンバーを募集しています!
お気軽にご連絡下さいませ!


PM・Webディレクション
IT×教育で教育格差を無くす!事業を加速してくれるWebディレクター募集
Cluexは、 「IT×教育で世の中を変える」をテーマに設立されました。 世界では貧困、飢餓、紛争、資本主義による格差が起きています。世界に存在するこういった大きな問題を解決していくのは人です。そして人を育てる教育こそが世界の不平等を救うことになります。 現在は第一弾として、"子育ての情報格差を無くす"ためにママ向けメディアのmamanokoを開発しています。 https://mamanoko.jp/ 利用者は「妊娠、出産を控えるプレママ、子育て中のママ」で、主に25~40歳の240万人を超える女性ユーザーが愛用中。 「子育て」に必須なサービスとして、今最も注目を集める「ママ」向け媒体として急成⻑し続けています。
株式会社クルイト
株式会社クルイトでは一緒に働く仲間を募集しています
11 いいね!
11 いいね!
同じタグの記事
今週のランキング