はじめに

社内で書いたメモが思ったより好評だったので、記事にします。

割と詳細は省いて書いており、

等の人にとっては全く不要な文章なので、別の記事を読むなり、間違っている部分をXで指摘するなどして下さい。

この文章の対象読者は

みたいな解像度でコンテナを「使って」いる人です。

そういった人が

なぜmacOSではDockerを使うためにcolimaを起動するのか

を理解し、colima経由でDockerを使っていて何かトラブルに遭遇した時に解決の糸口を見つけられるようになってもらう事が目標です。

概要を理解してもらうのが目的なので、細かい部分の説明は省いています。

気になったら自分で調べながらコンテナランタイムを実装してみて下さい。

ちなみに自分はcolima/limaの実装を読んだわけではないので、書いてあることは嘘かもしれないです。

コンテナとは

起源はBSDにあるものの、今日ではおもにLinuxにおいてネットワークやファイルシステムなどの環境を隔離するシステム。

なぜmacOSではDockerを使うためにcolimaが必要になるのか

別にcolimaである必要はない。

colimaを使わなくてもDockerは使える。が、colima/limaが何をしているのかを簡単に説明する

lima

limaはmacOSでVMをいい感じに作成・操作するためのソフトウェアです。

実際に作成しているのはqemuだったりVirtualizationFramework/HypervisorFrameworkだったりするけど、そこは割愛。

なぜDockerを使うのにVMが必要なのか

コンテナのshellに入るとLinuxの環境で動いていることがわかる

DockerはLinux Kernelの機能を使って実装された、Linuxのためのソフトウェアなので、Linuxの環境がないと動かない。

また、Dockerは環境を隔離してくれるが、Kernelはホストのものを使っている。

なのでやっぱりLinuxが必要になる。そのためにVMが必要なのだ。

colima

colimaが何をしているかは半分想像にすぎないが、おそらくlimaで作成したVMに必要なツール(Dockerなど)をインストールし、Dockerの操作に必要なインターフェースをホストのmacOSと共有しているはず。

Dockerはデーモンとクライアントで構成されており、dockerコマンドはクライアントとしてデーモンと通信を行う。

その通信に使われるのがdocker.sockで、colimaを使うとデフォルトでは$HOME/.colima/default/docker.sockにマウントされる。

この実態はcolimaで作成したVMの/var/run/docker.sockにある。

トラブルシューティング

これは自分が実際に遭遇した例だが、colima経由でDockerを使っていたら

みたいな状況になった

ここからトラブルシューティングの開始。

使用しているイメージは、他の人もよく使っているものなので問題はなさそう。

というわけでホストを疑う。

colima sshでホストに入り、journalctlでログを見ながらコンテナを起動してみると、OOM Killerでプロセスが殺されている事がわかった。

というわけでVMに割り当てるメモリを増やして解決

VirtualizationFrameworkではmemory ballooningが行われるっぽいので大量にあげた。

まとめ

colimaを使っていて問題に遭遇したら、コンテナだけでなくVMの問題の可能性もあるので、そっちのログも見たり共有したりしましょう。

おわりに

この記事はn01e0 Advent Calendar 2023の3日目の記事です。

明日はあるかわかりません

また、IPFactory OB Advent Calendar 2023の3日目の記事も兼ねています。