C-limberの開発環境とM1 Mac Docker環境改善

システム事業部エンジニアの柿添です。
桜の季節も終わりGWもあっという間に過ぎ去りました。

半袖で過ごす日も多く、業務中はほぼ扇風機(サーキュレーター)を回し続けております。
夏本番に向けて(身体と頭を)フル稼働できるよう体力の底上げを今のうちからしておきたいと思います。

PCについて

C-limber株式会社の全エンジニアは MacBook Pro を使用しております。
(+実機確認用のWindowsラップトップPC)

個人で利用しているMacBook 等は持ち込まず、
会社から メモリとストレージを拡張したMacBook Pro を支給していただいております!(感謝!)

私はIntelマシンですが、既に何人かのエンジニアはM1マシンへ移行しています。

エディタについて

全エンジニアがJetBrains製品を利用しています。
PHPの場合はPhpStormを利用しています。

Visual Studio Code などを利用している方もいるかと思いますが、
コスト以外の理由でJetBrains製品を利用していないというのであれば、
今すぐにでも乗り換えて試して欲しいと思います。

タスクの管理

基本的にBacklogを利用しています(感謝!)

ソースコード管理

Github, Gitlabにリポジトリを置いています。

環境について

C-limberに入社する前の会社ではローカルからgitでサーバへpushして確認・XAMPPで確認などを行っていました。
C-limberへ入社してすぐの段階では今ともまた違う環境を利用していました。

過去の環境 Vagrant構成時代

ローカルマシンにVagrantのVMを用意し、ansibleで構築を行っていました。
Vagrantの構築エラー、ansibleのバージョン違いによる構築の中断等を除けば比較的楽に構築できていたかと思います。
速度も速く問題もあまり起こりませんでしたが、プロジェクトによってはDocker環境で構築されていたものも多く、
その辺りはDocker on Mac (現在のDocker Desktop)を利用したりしていました。

過去の環境 Docker on Mac構成時代

VagrantからDocker on Mac に徐々に切り替えるようにしていきましたが、速度の問題に衝突しました。
ホストマシン と Docker on Mac のファイル動機速度がとても遅く、開発中にイライラする速度であったためスピードアップが必要でした。

過去の環境 Docker on Mac + docker sync構成時代

ホストマシン と VM の同期速度を上げて開発環境の高速化をはかるために docker sync を用いて volumes の同期を行いました。
速度は速くなりましたが、環境を破壊した際に再度環境構築を行う際のスピードが遅かったため、更なる環境の変更が必要でした。

過去の環境 Docker on Vagrant構成時代

ファイルの同期はVagrantに任せて、更にVagrant VM 上にDockerコンテナを設置、
リバースプロキシコンテナを設置して開発環境がvagrant up と共に立ち上がるようshell scriptを記述した構成へ変更しました。
ファイルの同期を担うVagrantのNFS同期は超高速に稼働し、環境構築もとても楽になりました。

M1Macでの開発環境問題

M1 Mac の登場とともに Vagrantが使えなくなったため、新たな環境の構築が必要になりました。 M1 Mac でそのまま Docker Desktop を使うと非常に低速です。
Docker on Vagrantの高速環境を利用していた我々にとっては苦痛以外の何者でもありませんでした。

Google検索などしてもらうと、さまざまな恨み言や愚痴や対策方法が出てくるかと思います。

開発環境として満たしておきたいものがいくつかあったため下にまとめてみたいと思います。

  • 開発に支障を来さないレベルの速度を出せること
  • ホストマシンを壊さず汚さず環境を破壊することができること
  • 環境構築が容易であること
  • Docker Desktop 環境を維持することができること

その中で現在の環境から大きくずらさずに構築できるようにする方法がないか何パターンか試してみました。

Docker Desktop & 同期ディレクトリの変更 + lsyncd + rsync

同期ディレクトリを /var/www/html からずらし、lsyncd と rsync を用いてvolumeの同期を行おうという構成です。
結果として超高速と呼べるほど速度が出なかったため採用を見送りました。 (個人的にVM破壊をして更地にしたいというのもあったため Docker Desktopそのまま使うのもあまり好きではないという理由もあります)

Docker Desktop & docker-sync

過去同じような構成をIntelマシンでやっておりましたが、構築スピードも早くなく、速度もとても速いわけではなかったので見送りました。 (個人的にVM破壊をして…)

Lima on Docker

Lima VMのLima上でDockerを動かそうという構成です。
環境に何かあった場合はVMを破壊すれば良いので個人的にはとても好きな構成です。
実際に試してみたところこちらも速度が高速ではなかったことと、Docker Desktopとの共存が面倒であったため採用を見送りました。 (Docker on Vagrantが速すぎるのもあるかと思います)

multipass on Docker

Multipass VMのMultipass上でDockerを動かそうという構成です。 こちらも環境に何かあった場合はVMを破壊すれば良いのでとても好きな構成です。 実際に試してみたところ速度はまずまず(Docker on Vagrantには到底敵わない状況ではあります)、 構築もshellを一発叩くだけで起動するよう環境を準備しました。 ホストマシンからVMのマウント時に高速化を狙える余地がまだあるため、こちらの環境の高速化を今後進めていこうと考えております。

multipass と docker 環境をwrapした環境はTENTと名付けられ、以下コマンドで操作しています。

$ tent
Usage:
  tent [options] <command>

Common commands:
  up               Start the environment.
  down             Shut down the environment.
  official         Start the environment And start official site container.
  home             Go to the tent directory.
  hosts            Open /etc/hosts.

VM commands:
  ssh              SSH in multipass vm.
  info             show info multipass vm.
  list             show multipass list.
  unmount          unmount directory.
  dvm              delete multipass vm.

Options:
  -f, --force      Force the environment to start and stop.
  -c, --check      Check that the environment meets the necessary requirements.
  -u, --up         Start the environment.
  -d, --down       Shut down the environment.
  -s, --status     Output docker environment information.
  -h, --help       Print this help.
  -v, --version    Print the version and exit.
  -p, --project    Go to the project directory.

まとめ

爆速環境のためにlinuxマシンがあっても良いかと思いますが、 M1 Mac の更なる環境改善のためマウントの部分を高速化する、
もしくは別の環境を試しIntel製 Mac Docker on Vagrant より良い環境が構築できるよう
引き続き環境改善に取り組んでいこうと思います。

Related article

おすすめ関連記事