Dockerはコードを管理するには素晴らしいですが、macOSでは痛いほど遅いです。VirtualboxやParallelsを使うことで、macOS上のRails on Dockerをずっと速くできます(M1ではなんと20倍も…)。私はベンチマークを走らせたので、あなたはその必要はありません。
何年も前から、Railsアプリに取り組むときは、プロジェクトに参加する人が誰でもvagrantアップしてコーディングを始められるように、リポジトリにVagrantファイルを埋め込んでいました。
Dockerはその後有名になり、Docker ComposeでデータベースやRedis、メールサーバなどの依存関係を起動できる便利さから、Vagrantの有力な候補となりました。私はDockerが遅いので、macOSでは両方使っています。
DockerはLinuxでは素晴らしいのですが、macOSではストレスを感じるほど遅く、M1ではなおさらひどいです。
どのように遅いのか?どうすれば速くなるのか?Linux VM上で実行してみてください。
環境
テストの実行時間を比較するために使用した2種類のPC。
- A MacBook Pro 16インチ 2019、32G RAM、8コアIntel i9 2.3Ghz
- Mac mini M1 2020、RAM 16G
それぞれのパソコンで使っていた3種類の環境。
- Dockerデスクトップ
- Parallels (M1)とVirtualBox (Intel)
- ネイティブ(自作機使用)
空のRailsリポジトリをブートストラップし、rails g scaffold post
を実行して、最小限の、しかし実行可能なデフォルトのテスト環境を手に入れました。その後、Bundleを使用してテストを実行します。
git clone git@github.com:penso/vagrant-vs-docker-rails.git
$ docker-compose up
$ time docker-compose run app bundle exec rake test
まとめ
MacOSでDocker Desktopを使わないでください。どうしても使いたいなら、Linux VMの中で使ってください。
Dockerは自動化するのにとても便利ですが、このような単純なコードでテストを実行するには、20倍以上の発生率になります。この差は、より大きなプロジェクトになればなるほど大きくなるかもしれません。