この記事はCraft Egg Advent Calendar 2021の21日目の記事です。
昨日は@arumaniさんの「iPhoneで3D空間に入って撮影できる『Unity Virtual Camera』」でした。
はじめに
注意) 捉え方によっては過激に見える発言があるかもしれませんが、OS論争するつもりは全くありませんので、ご了承ください…
最近、FreeBSDコミュニティのメーリングリストで気になるメールを発見しました。
FreeBSDでコンテナを簡単に扱えるようにしたFockerというツールが登場したみたいです。
私の学生時代はFreeBSDと共にあったと言っても過言ではないくらい、FreeBSDと戯れることが多く、懐かしみを感じたので、
その時に得たFreeBSDのコンテナ周りの知見を軽くまとめていきたいと思います。
当時、情報を集めるのにも苦労したので、これからFreeBSDと遊んでいく方の役に立てば良いなと思います!
FreeBSDとコンテナ
そもそも、皆さんはFreeBSDというOSをご存知でしょうか?
近年はLinuxが主流で有名ですが、一昔前はUnix系統OSの代表格の一つとしてFreeBSDが名を馳せていました。
Linuxのコンテナよりも前にFreeBSDのコンテナが登場していたりもします。
コンテナは、仮想的にリソースを分割し、仮想マシンを使わなくとも、複数の環境を扱えるようにするもので、アプリケーション開発に欠かせない技術です。
最近のコンテナの代表的なものとして、DockerやHaconiwaなどが挙げられます。
コンテナのコア部分は、runCやgVisorなどのコンテナランタイムから成り立っています。
特にLinux上でコンテナを実現しているrunCは、Linuxの機能であるcgroupsやNamespace、OverlayFSなどの機能を組み合わせて、仮想的にリソースを分割することを実現しています。
FreeBSDにおけるコンテナランタイムは、FreeBSD jailと呼ばれます。
FreeBSD jailを簡単に構築できるようなツールは多く存在していますが、あまり浸透していないというのが現状かと思います。
実現したいことは似たようなことですが、細かい部分の思惑によって、カスタマイズされた実装になり、外から見ると何十人もが何年もかけて車輪の再発明を何度もしているようにも見えてしまいます。
私が把握しているFreeBSDにおけるコンテナ実装について軽く紹介していきます。
- Docker on FreeBSD
- VPS for FreeBSD
- runc for FreeBSD
- Focker
- runj
Docker on FreeBSD
FreeBSD向けのDockerです。今はメンテされていません。
内部ではFreeBSD jailが使われています。
FreeBSD向けのDockerではLinuxに向けてコンパイルしたバイナリも実行することができます。
(これはFreeBSDのLinuxバイナリ互換機能のおかげなのですが、長くなるので割愛。気になる方はこちらから)
VPS for FreeBSD
今はメンテされていません。
VPSと聞くとVirtual Private Server(仮想マシンのレンタルサーバー)が思い浮かびますが、
ここでは、Virtual Private Systemの略で、仮想的な分離されたシステム=コンテナを表しています。
FreeBSDカーネルをいじくり回して、FreeBSD jailを根本から拡張している感じになります。
FreeBSD jailではプロセステーブルは同じでリソースだけを分離するのに対し、VPS for FreeBSDではプロセステーブルから分離しています。
実行している最中のプロセスを停止せずに別のマシンに移動させるプロセスマイグレーションも実現しています。
runC for FreeBSD
名前の通りFreeBSDに向けたrunCです。これもメンテナンスされてないです。
動作はするものの、コマンドが実行できなかったり、作成したコンテナの状態が変わらなかったりするバグがあった気がします。
こんな感じの変更を加えれば、修正できると思います。
これも内部ではFreeBSD jailを利用しています。
Focker
FreeBSD+DockerでFockerですね(笑)
FreeBSD jailのイメージをFockerfile
で定義したり、focker-compose.yml
でオーケストレーションしたりと、
まさに、Dockerと同じような使い勝手でFreeBSD jailを扱うことができるらしいです。(手元にFreeBSD環境がないので試せてません…)
昨年登場して、今もメンテナンスは続けられているようなですので、今後の期待大です。
runj
ここ最近一番の驚きでした。
OCI(Open Container Initiative)と呼ばれる、コンテナの標準仕様を策定する組織があり、DockerやrunCはこれに則ったツールです。
そして、runCを移植するわけではなく、OCIに沿ったものをFreeBSDに向けて1から実装しようという動きです。
まとめ
ここまで紹介してきたように、FreeBSDのコンテナ周りの歴史は意外と長く、そして各プロジェクトは続いてこなかった印象です。
Linuxのコンテナに対する開発速度に追い付けていないのも事実あると思います。
しかし、ここに来て、FreeBSDでもコンテナに対する動きが活発になってきており、非常に嬉しく思うばかりです。
FreeBSDは組み込み系でよく使われるようになってきましたが、サーバ側のOSとしてはやはりLinuxがメインです。
FreeBSDでのコンテナの開発が盛んになってくれば、LinuxとFreeBSDが共存する世界が訪れたりするのかなと思います。
OSの設計思想の違いから来る特徴の違いを活かして、適材適所にOSを選択して運用するという未来を少しだけ期待しています。
Craft Egg Advent Calendar 2021 明日は @kai_yamamotoさんの記事になります!