こんにちは、freee Developers Advent Calendar 2022 6日目の記事です! 本日はサービス基盤の yoko がお送りします。
まえがき:Mac と Docker
コンテナ型の仮想環境を高速に作成・起動できる技術として有名な Docker ですが、コンテナという隔離された環境を作るために Linux カーネルの機能を利用しています。つまり、Docker は Linux という技術によって支えられており、そのままでは MacOS や Windows 上で実行することができないはずです。
しかし、僕たちは当たり前のように Mac や Windows で Docker を動かしています。Mac では Docker Desktop for Mac がよく使われていますね。
Docker Desktop for Mac は Linux VM を立ち上げ、VM上のコンテナランタイムと通信することで、さもネイティブに Docker がいるかのような体験を提供してくれます。
また Docker Desktop 以外にも Mac 上で Docker を動かすための技術は次々と登場しており、つい先月も AWS が Finch という OSS をリリースしたことが話題になっていました。
こうした Docker Desktop の代替ツールたちは、どうやって Docker を Mac で動かせるようにしているのか、Docker Desktop と同じような開発体験は得られるのか、気になったので実際にいくつか試してみることにしました。Docker がなんで Mac で動くのか全然わからん!という人や Docker Desktop の代替ツールを探している人のお役に経てば幸いです。
検証機のスペック
- macOS Monterey バージョン 12.6
- プロセッサ 2.4 GHz クアッドコアIntel Core i5
- メモリ 16 GB 2133 MHz LPDDR3
今回検証に使用するのは1年半前に支給された Intel Mac となっております。freee では新規に配布される PC は M1 Mac になっているので、そちらでも試したかったのですが今回は Intel Mac のみです。
ツール選定
今回検証したのは以下の3つです。
この3つは全て lima によって Linux Virtual Machine を起動し、VM上でコンテナランタイム(dockerd あるいは containerd)を動かします。そして起動する VM は Mac 本体とネットワーク設定を共有するため、ポートフォワーディングを設定すれば localhost 経由でコンテナと通信できます。
lima は Intel Mac でも M1 Mac でも動きますし、CNCF にも sandbox プロジェクトとして採用されており、期待できそうなツールということで今回選択しました。
インストール・セットアップ
下準備
homebrew で Docker の関連コマンドはインストールしておきます。freee では ECR をよく使うので docker-credential-helper-ecr も一緒に入れておくことにしました。
brew install docker docker-compose docker-credential-helper-ecr
docker-credential-helper-ecr にパスが通っていると docker pull したタイミングで勝手に ECR のログイン API を呼び出してくれます。事前に aws cli の認証を通せば aws ecr login コマンドを実行しなくても良くなるので便利です。
Colima
homebrew でサクッとインストールできます。
brew install colima
インストールしたら VM を作成して起動、こちらも 1コマンドで完結します。
colima start
ちなみに start コマンドにオプションを渡せば VM の CPU数、メモリサイズ、ディスクサイズ、CPUアーキテクチャ等をカスタマイズできます。
Rancher Desktop
こちらはデスクトップアプリですが、homebrew でもインストールできます。
brew install --cask rancher
インストールが終わったらアプリを起動して初期設定に進みます。
注意点としてコンテナランタイムは containerd ではなく dockerd を選択する必要があります。
Finch
Finch は VM 上の containerd と nerdctl 経由でやり取りすることで Docker と同じようにコンテナを操作できるツールです。
GitHub から pkg ファイルをダウンロードしてインストールできます。インストールが完了すると finch コマンドが使えるようになるので VM を作成します。
finch vm init
そして finch を使用する場合は docker コマンドをエイリアスにしておきます。
alias docker='finch'
検証
ここまでの手順で僕の Mac 上には 3台の VM が起動しています。そして Colima と Rancher Desktop が起動した VM には Docker デーモンがいますが、どちらのデーモンと通信するかは docker context コマンドで切り替え可能です。
$ docker context ls --format '{{.Name}}' colima default rancher-desktop $ docker context use colima $ docker context use rancher-desktop
こうすることで複数のコンテナランタイムを共存させることができます。
いざ Docker
結論として以下のような基本的なユースケースは3者とも問題なくこなせました。
- docker run --rm public.ecr.aws/finch/hello-finch
- Finch の Hello, World!
- protobuf のビルド
- 複数人で開発する場合、Docker イメージを使うことで人によって成果物が違う問題を回避できます
- nginx で web サーバーを立ち上げ localhost 経由で接続
コンテナを動かすという点のみに着目すると Docker Desktop と何も変わりません。セットアップも簡単でしたし、Docker Desktop 以外のツールもかなり成熟してきているという印象でした。
メリット・デメリット
3つのツールを共存させ、全て使った上でどれが一番オススメかを決めるために整理しましょう。
Colima
メリット
とにかく config less
設定がめちゃ簡単です。colima start するだけで OK。ヘビーユースするならメモリサイズや CPU の割当を増やすことは必須になってきますが、オプションでサクッとできます。
充実のコマンド
colima status で VM の状態を確認できたり、colima ssh で VM にログインできたりします。他の2者でも同じことはできますが、一番こなれた印象を受けるのは Colima でした。
クロスアーキテクチャが可能
VM の CPU アーキテクチャを選べるのは今回試したツールの中では Colima だけです。他の2者はソースコードも読みましたが多分無理です。 現在の freee では Intel Mac と M1 Mac がどちらも使われているため、もしかしたらメリットになるかもしれません。
デメリット
GUI が存在しない
コマンドラインから操作することが必須です。Docker Desktop と同じようなツールを探している場合はやや合わないかもしれません。
Rancher Desktop
メリット
GUI が強力
GUI でイメージの一覧が見れたり、VM に割り当てられるリソースを調節できるのは便利です。Docker Desktop と同じような UX で Good でした。
GUI からtrivy における scan を実行できる
イメージの一覧から trivy を使った scan も実行可能です。手元に trivy をインストールする手間なく、サクッとイメージのセキュリティイシューを検出できるのは Good です。
CUI も提供されている
実は GUI だけではなく CUI も用意されています。僕の環境だと ~/.rd/bin/rdctl
にインストールされており、~/.zshrc
に追記され、パスが通るようになっていました。
# VM にログイン rdctl shell # VM を起動 rdctl start # 設定を JSON で出力 rdctl list-settings
デメリット
コンテナエンジンのデフォルトは containerd
Mac から Docker コマンドで操作するためには設定を切り替えて dockerd にする必要があります。一度設定すれば大丈夫ですが、忘れるとハマるかも。
クロスアーキテクチャは不可能
M1 Mac 上に x86_64 の VM を立てるのは無理そうです。そうすると Rancher Desktop でビルドしたイメージが他の環境で動かなかったり、逆に x86_64 のみ対応のイメージが動かせなかったりする可能性があります。(厳密には ARM の VM 上で x86_64 のイメージを動かすことは可能ですがここでは深く触れません)
Finch
メリット
AWS が提供しているツールである
Finch は今後 AWS との連携を拡張機能によってサポートしていく可能性があります。以下は公式ブログからの引用です。
私たちは、AWS のお客様がローカルコンテナを AWS クラウドサービスと簡単に統合できる拡張機能を必要としていることは承知しています。ただし、これらはオプトイン拡張であり、Finch が依存するオープンソースの中核となる機能や、アップストリームの依存関係に影響を与えたり、断片化したりすることはありません。
現状の freee では一部の例外を除き、AWS 一択といった状態なので、今後便利な拡張機能がリリースされれば Finch を使う理由が出来そうです。
現状ではまだ AWS との連携は実装されていないようなので今後に期待ですね。
デメリット
VM 関連のコマンドが少ない
VM の操作は finch vm コマンドで行えますが、対応しているのは init/start/stop/remove となっています。Colima や Rancher Desktop のように VM に ssh したり、VM に割り当てるリソースを CLI 経由で調節したりすることは出来なさそうです。
docker-credential-helper-ecr が使えない
実は nerdctl は not Docker でありながら docker-credential-helper-ecr に対応しています。(README.md でもアピールしている)そして Finch は内部で nerdctl を実行しています。
しかし、Finch では docker-credential-helper-ecr を使うことが難しいです。理由は Finch のアーキテクチャにあります。
Colima や Rancher Desktop の場合、Mac 上の docker コマンドがコンテナランタイムと通信を行いますが、Finch は Mac 上ではなく VM の shell で nerdctl コマンドを実行します。
例えば finch image ls
というコマンドを lima nerdctl image ls
に変換していると考えるとわかりやすいです(lima コマンドは lima が立ち上げた VM 上で引数に渡されたコマンドを実行します)
そして VM 上では Mac にインストールした aws cli や docker-credential-helper-ecr が使えません。VM に直接インストールしても、AWS の認証状が保存される ~/.aws/credentials
を読んでくれないためダメでした。Finch の VM はホームディレクトリ以下をホストマシンと共有するのですが、$HOME
の値が異なるため ~/.aws/credentials
は共有できないみたいです。
まとめ
最後に今回の検証をまとめます。純然たる個人的見解です。
- Docker Desktop 以外のツールでも案外簡単に Docker を使える
- ミニマムに Docker を動かしたいなら Colima が良さそう
- Docker Desktop と同じような UX を求めるなら Rancher Desktop がオススメ
- Finch は今後に期待
以上、アドベントカレンダー2022 6日目の記事でした!拝読ありがとうございます。