Colima(Lima + Docker)で開発をしてみている

ふとDocker Desktop for Mac以外の環境でDockerイメージを使った開発できるか試したくなったのでやってみています。

私が今選択しているのは Colima というツールです(このエントリ時点でv0.2.2です)。

github.com

Colimaは何をしているかというとLimaとDocker(や、必要に応じてcontainerdやKubernatesも)をいい感じに設定してくれるツールです*1

Lima

LimaはmacOS上でLinuxVMを起動して使えるようにしてくれるツールです。

github.com

READMEでは

Lima can be considered as a some sort of unofficial "macOS subsystem for Linux", or "containerd for Mac".

と書いてありますので、上記のようなイメージを持ってもらうと良さそうです。

Colima

Limaだけでも便利なのですが、Colimaはそこからさらに1コマンドで

  • Limaの設定ファイルを生成してLinux環境を作ってくれる
  • Linux on Limaの環境にDockerをインストールしてセットアップしてくれる
  • ホスト側(つまりmacOS側)のDocker CLIとDocker on Linux on Limaを透過的に接続できるような設定をホスト側にしてくれる

ということをしてくれます。

Colimaのはじめ方

1. Docker Desktop for Mac のアンインストール

まず、Docker Desktop for Macをアンインストールする必要があります。これが一番大きな障壁かもです。

FAQにも

Can it run alongside Docker for Mac?

No, except when started with Containerd runtime. Colima assumes to be the default Docker context and will conflict with Docker for Mac. You should run either, not both.

とあり、Colimaの「Docker CLIとDocker on Linux on Limaを透過的に接続できるような設定」が競合すると思われます。

ちなみに、全く保証はできませんが 私の環境では、Docker Desktop for Macをアンインストールしても、再インストールしたら使っていたDockerコンテナやDockerイメージは残っていました。「試しにColimaを使ってみる」もできそうです。 全く保証はできませんが

とりあえず、Docker Desktop for Macをアンインストールする必要があります。

私の場合はDocker Desktop for MacをHomebrew Caskでインストールしていたので、以下のコマンドを実行してアンインストールしました。

$ brew uninstall --casks docker

2. Colima(とLima)とDockerのインストール

Homebrewで以下をインストールします。

  • Colima(と依存しているLima)
  • ホスト側で docker コマンドと docker compose コマンドを使うためのDockerとdocker-compose
$ brew install colima docker docker-compose
$ ln -sfn $(brew --prefix docker-compose)/bin/docker-compose ~/.docker/cli-plugins/docker-compose # docker-composeを `docker compose` とサブコマンドとして実行できるようにするためにsymlink

3. colima start でDocker on Linux on Limaを起動

あとはColimaを通じてLima上のLinuxを起動して、その上でDockerデーモンを起動するだけです。

Colimaは起動時にVMで使用するコンピューティングリソースやマウントするホスト側のディレクトリを指定できます。指定した設定はLimaの設定ファイルに反映されます*2

私は以下のように実行しています。

$ colima start --cpu 8 --memory 8 --disk 128 --mount '~/src:w' --mount '~/tmp:w'

特に、私はソースコードghq~/src 以下に置いているので --mount ~/src:w というように :w を渡して書き込み可能にしています*3

あとは普通にホスト側から docker ps なり docker pull なりすれば良いです。

たったこれだけです。今までと同じようにDockerなのも良いと感じています。

Colima環境の現時点の課題

今2週間ほどColima環境を使っているのですが、ただ1つを除いて特に問題なくDockerを使った開発ができています*4

その1つの課題というのがホストからマウントしているファイルシステムに関するものです。

ホストとLima VM間はSSHで接続されています。 マウントはsshfsを使用していますし、Colima環境ではホストとDocker on Linux on Limaのdocker.sock の共有もSSHを経由して実行されています。 そのためホスト側のファイルシステムをLima VMを経由してマウントしているファイルを、Dockerコンテナ内からパーミッション変更などをすると失敗します。

以下のIssueが上記の問題に関係するものだと思います。

github.com

環境によっては厳しい条件かもしれません。私の場合は今のところはワークアラウンドは考えたり手元でそのワークアラウンドを適用したりできているので大丈夫です。ただ少し面倒ですね。

というわけで

Colimaの利用レポートでした。

*1:v0.1.xまではBashで書かれていたのですが、最近v0.2.xからGoでリライトされました。それくらいシンプルです

*2:デフォルトだと ~/.lima/colima/lima.yml になると思います

*3:前までは--mountオプションはなく、Limaの設定ファイルを書き換える必要があったのですが、https://github.com/abiosoft/colima/pull/17 を通じて機能要望をし、v0.2で導入してもらいました

*4:この間に更新しているOSSなDockerイメージなどは全部Colima環境です。 https://github.com/k1LoW?tab=packages