Dockerを"使える"人がcolimaで困らないために
はじめに
社内で書いたメモが思ったより好評だったので、記事にします。
割と詳細は省いて書いており、
- Docker/runc/containerd/podmanなどの実装を理解している
- コンテナランタイムを自作したことがある
- colima/limaの実装を理解している
- VirtualizationFramework/HypervisorFrameworkを直に叩いてmacOSでVMを建てている
等の人にとっては全く不要な文章なので、別の記事を読むなり、間違っている部分をXで指摘するなどして下さい。
この文章の対象読者は
- Dockerfileやdocker-compose.ymlを書くとコンテナが使える
- colimaを使うとmacOSでもDockerが使える
- コンテナは隔離された環境で動いている
みたいな解像度でコンテナを「使って」いる人です。
そういった人が
なぜ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 statusに応答が無い
- colima listではrunningになっている
みたいな状況になった
ここからトラブルシューティングの開始。
使用しているイメージは、他の人もよく使っているものなので問題はなさそう。
というわけでホストを疑う。
colima ssh
でホストに入り、journalctl
でログを見ながらコンテナを起動してみると、OOM Killerでプロセスが殺されている事がわかった。
というわけでVMに割り当てるメモリを増やして解決
VirtualizationFrameworkではmemory ballooningが行われるっぽいので大量にあげた。
まとめ
colimaを使っていて問題に遭遇したら、コンテナだけでなくVMの問題の可能性もあるので、そっちのログも見たり共有したりしましょう。
おわりに
この記事はn01e0 Advent Calendar 2023の3日目の記事です。
明日はあるかわかりません
また、IPFactory OB Advent Calendar 2023の3日目の記事も兼ねています。
Comments