概要
Dockerを使うとLinux環境で動く多くのサーバー機能をmacOS環境に輸入することができ、Macminiの機能の幅がかなり広がる。各種WebUIにVPNサーバーなど、大量の機能=コンテナをホストOSに影響を与えないまま統括管理できるため環境もスッキリする。
しかしホストのリソースを流用して負荷軽減を図る仕組み上、どうしても動かないものが一部存在する。特にネットワーク機能が欠如しており、それを埋めるためには本格的なアップデートが必要になるため数年単位で実現していない(ここで2016年からブチギレ議論されている)。
これは仮想環境を調達すれば克服可能なんだけど、そうすると今度はメモリ管理の問題が浮上する。macOS上で動かす分にはmacOSの優れた動的メモリ管理に任せられるが、仮想マシンは固定でメモリを割り当てる必要があるためかなりのメモリを持っていく。
macOSではOllamaをはじめとしてメモリをかなり食うアプリを稼働させる予定だったため、macOSに残すメモリを削るわけにもいかない。しかしマイクラサーバーをはじめとした高負荷のコンテナを動かすにはメモリの余裕を持ったDocker環境が必要で、そのDocker環境は高度なネットワーク機能を要するVPNサーバーやHomebridgeのために仮想環境に置く必要があった。
これを解消するために、macOSと仮想環境にそれぞれDocker環境を構築し、macOSのDockerで足りるものは全てmacOSに投げることにした。
仮想マシンで要するメモリを最小にして割り当てを限界まで絞ることで、出来る限りmacOSの動的なリソース配分に全て任せてしまおうという寸法。実際Ollamaとマイクラサーバーは同時に動かさないため、それぞれが停止時にメモリを解放することでメモリ不足は起こらなくなる。
これに伴い2つのDockerを管理する必要が出てきたが、これを解決したのがPortainer。2つのDockerを1つのWebUIで管理可能だった。
基本機能

メモリ・ネットワークといった各種リソースの使用状況に加え、稼働中のコンテナの確認や停止・再開が可能。ちなみにPortainer自身のコンテナは停止できないようになっているので安心。
Pullしてあるイメージやボリューム、変換/使用中のポートやコンテナのIPアドレスまでも確認可能。
イメージのPullも可能で、この画面から新しくコンテナを生成することが出来たりもする。
日本語に対応していないことが惜しくなるほどに多機能で、あらゆる面で隙がない。
コンテナのアップデート(Re-pull+Recreate)
Dockerコンテナを扱っていると地味に困る点として、コンテナ本体のアップデートに手間取ることが挙げられる。
コンテナは一つの環境であるため、Pullしたイメージだけでなくコンテナ本体までも一度削除して入れ直す必要がある。ボリュームに保管されるべきデータは消えないとは言え、特にアプデ頻度の多いOpen WebUIなんかだと毎回やるのはかなり面倒。わたしは数ヶ月忘れていて、一回やった瞬間あらゆる要素が様変わりしてビックリしたほど。

しかしこれも、Portainerなら非常に簡単に行える。
コンテナ一覧から更新したいコンテナの詳細へ飛び、Recreateを押すだけで再作成が可能。
この時Re-pullをオンにしておけば、1発で最新版イメージでのコンテナ再作成が完了するのだ。

しかもこのRecreateはコンテナ作成時に行うであろうあらゆる設定を反映させるので、これまた編集が面倒な環境変数も手軽に変えられる。


コンテナの詳細からDuplicate/Editを選ぶと、最下部で環境変数を追加/編集できてしまう。
これをRecreateなりなんなりで反映させてやると、実にあっさりと環境変数の設定が完了する。
Dockerを便利に使うためのDockerコンテナという特異な存在ではあるものの、その真価は計り知れない。まだまだわたしも使いこなせていないけど、Dockerを使っている人全てに薦めたいコンテナ。
ホストとゲストの統括管理
ホストのmacOSとUTM上のAlpineLinux、それぞれのDockerを管理する必要が出てくる。
これはゲストとなるUTM上のAlpineLinuxにPortainer Agentと呼ばれるコンテナを導入し、ホストのPortainerコンテナに接続することで可能となる。

このホスト・ゲストという管理の単位はEnvironmentと呼ばれ、最初はlocal(=Portainerを動かすマシン)のみが存在する。ここに新しくゲストを追加していくことで、1つのPortainerからlocalと複数のゲストを同時に管理可能になる。
今回はlocalとゲスト1つを管理したいため、Portainerをセットアップした後からゲスト1つのみ追加する。
手順

Environmentsの右上からAdd environmentをクリックし追加画面へ。
今回はゲストのAlpine側にも通常のDocker環境を構築したので、Docker Standaloneを選択してStart Wizard。

そうすると追加スタイルの画面が出てくるのでAgentを選択。書かれているLinux用コマンドをAlpine側で実行し、Portainer Agentのコンテナを追加。SSH接続しておけばコピペできるので楽。
その後下部のnameに好きな識別名、Environment addressにゲストのIPアドレスとポート番号である9001を打ち込む(これはAgentのdocker runで指定されている)。Connectで接続完了。

以降、Home含む画面にlocalとは別に識別名が現れ、こちらをクリックするとゲストのコンテナを管理可能になる。再起動・変更・追加削除その他全て可能。
最終的な構成
ホストはMac mini(M1,2020)、ユニファイドメモリは8GB。
ゲストはAlpineLinux(Standard)。CPU2コア/メモリ2GBを割り当て、主にVPNとHomebridgeを担当させる。

ゲストで起動しているコンテナは以下。

HomebridgeとIKEv2 VPNサーバーはLinuxが必須らしくこちらで動かした。
管理用のPortainer Agentと、仮想マシンとのファイルやり取りにSambaサーバー。
Homebridge UIで仮想マシンのメモリ状況を監視している限り常時1GB余っているのでかなりの余裕を持って動作できている。
そしてカメラのRTSP配信もこちらで行った。macOSに繋いだUSBカメラ(Logicool C270)をDockerコンテナに認識させられなかったため、USBデバイスを仮想マシンに繋いでAlpineからDockerに認識させてRTSP配信することにした。
ちなみにこのAlpineのDockerにカメラを認識させる際にVirtualだとダメだったので、カメラを扱う場合AlpineはStandard必須。
USBカメラを敢えてRTSP配信することで、Homebridge Camera UIを使ったHomekit セキュアビデオへの対応が可能になる。CPU負荷は多少かかるが元々メモリ不足なだけでCPUは余りある高性能だし、iCloudの自動保管その他の機能がフル活用できるのでおすすめ。
ホストとなるmacOS上のDockerコンテナは以下の通り。

Ollama用にOpen WebUIと、マイクラサーバーであるCrafty。CraftyはWebUIでBE/Java両方のサーバーを自由自在に立てられるので、レンタルサーバー的な設定と運用が可能になる。
Craftyでマルチプレイをしているとバニラの2人ですら1GB~2GB程度軽く持っていくため、ここはホストで動かすことにした。
更にmacOSでそのまま動かしているOllamaは5分放置でメモリを解放するため、OllamaとCraftyを同時に使わない限りCraftyとOllamaがメモリを食い合うことはないというわけ。
まあマイクラと生成AIの組み合わせはどっかで研究されてたりするけど、わたしは使う予定ないので問題なし。
OllamaでGemma2-JPN(2B)使用直前と直後のメモリ消費はこんな感じ。


生成中に負荷がかかってもスワップ領域はほぼ変わらずなので、ギリギリではあるが足りていると言っていいだろう。


Qwen2.5-Coder 7Bを使っている時は流石にスワップが増加するが、ある程度の生成速度は保てている。
8GBメモリのMacで7~8B程度のモデルを動かしながら仮想マシン含めた全てのサーバー機能を扱えるため、メモリ管理はとりあえず成功したと言っていい。
今後の可能性等
Docker自体をクラスタ化することで更に踏み込んだ管理が行えるようになるらしいので、とりあえずそれは検討中。とはいえここまで来ると完全に個人向けの範疇を超えてしまうので、果たして自宅サーバーに適用していいものか悩みどころ。
Macを買い替えても結局モデルの大型化によりメモリ管理問題は付いて回るため、安直に買い換えるのはちょっと踏みとどまっている。
とはいえPhi-4はかなり便利そうで、13B前後のモデルを扱えるM4Macminiは購入検討しているところ。
アメリカでは整備済製品も出てきたらしいし、8万円程度で買えるなら予算内にも収まる。ついでにSSDをドックに内蔵してしまえばスティックSSDも余るけど、できればSATAHDDも内蔵したいのでM2Proかもとか悩んでたり。
このまま今のM1Macminiでどこまでやれるのかを突き詰めて、不可能なラインに当たったら買い替えを検討しようと思う。
M1MaxのMacStudioやM2ProのMacminiであればゲーミングPCとしての役割もついでに期待出来そうだし、更に快適な自動化環境を目指せる・・・かも。




