Systemd-nspawnでの開発環境構築

まあArch Wikiとか見て頑張ってくださいで終わりたいんですが、一応備忘録

開発環境のコンテナつくる

$ mkdir ./target-dir
$ pacstrap -i -c -d ./target-dir base --ignore linux php mysql composer

的な感じでやります。btrfs向けの機能もsystemd-nspawnにはあるらしいのでそのへん参照するといい感じになりそう。

btrfsのスナップショットを使ってコンテナ作るときは--templateオプションを使うらしいです。しかしこのあたりよくわからんし試してないので今回はスルー

起動する

$ sudo systemd-nspawn -bD ./target-dir

これでなんかコンテナが起動する。-bオプションで普通にchrootする代わりにマシンとして起動しているみたいですね

この後よしなにcomposer installとかしたりいろいろしてやるといい感じに出来ます

やりたいこと

本当はmysql用のコンテナをシュッと1個生やしておいて、複数の環境に対してそのコンテナを動かしてDBを参照させるみたいな方法をとりたい。しかしよくわからなかった

仮想ブリッジをたててうだうだするといいらしいんですが、仮想ブリッジを作るとルーティングが崩壊して全てが終わってしまったりするし、systemd-networkdがなんもわからんとなりました。

コンテナとホストのネットワークは通ってるんですけど、コンテナから外に通信できないし、コンテナから他のコンテナに通信するのもうまくいかなかった。この当たりはネットワーク詳しい人はどうにか出来るんだろうけども、そうじゃない人にとってはちょっと重いですかね。 そのへんはDockerのほうが楽っぽいですね

気持ち

Dockerが無限にbtrfsのスナップショット作成しまくったりコンテナの中間イメージをためまくって最悪なのが最近嫌なのでなんとかしたくて、そういう意味では一個にまとめて開発環境作るならまあ悪くはなさそう。

もともとDockerならデプロイが楽〜みたいなのも幻想っぽいというか、それを実現するのって結構大変だし、雑に使う分にはSystemd-nspawnのほうが好きかなという感じです。

それこそ依存関係とか汚したくないときに適当にpacstrapすれば簡単に環境作れるので、そういう意味では手軽で嬉しい。

面白いのは、Gentooのstage3のtarballをばらまいてその上でSystemd-nspawn起動するとGentoo環境が簡単に動くわけで、これをbtrfsのサブボリュームの上にtarballばらまいてemerge --syncとかしてゴチャゴチャやるとGentoo環境が出来る。 このままブートローダにrootflags=subvol=/gentooとかってサブボリューム指定すれば簡単にGentooとのマルチブート環境が作れるわけですよ。嬉しいかはともかく。試してないけど多分出来ると思います*1

まあ機能がもうすこしいろいろやってくれると嬉しいけどSystemd-networkdとかSystemd-resolvedとかをラップしてしまうのは微妙っぽいしこんなもんかなあ

*1:しかしkernelはもともと動いてたやつなのであんまり旨味はなさそう?