Solist Work Blog

List of all blog posts

dockerではなくsystemd-nspawnを利用するシチュエーション

dockerとsystemd-nspawnについて考えます。 サイトが成長することを考慮するとKubernetesなどの強力なクラスタ管理およびオーケストレーションシステム を使うことはほぼ必然になると思うのでdockerは欠かせなくなるツールだから使ったほうがいいですが、 docker を普通の単一サーバーの実験用のコンテナとして使うのは色々めんどくさい感じなので 単一サーバーの実験用コンテナはsystemd-nspawnを使うことにします。

デファクトスタンダード


systemd-nspawnはsystemdを使うディストリビューションには必ず(嫌でも)入っています。 最近のlinuxなら入っていないほうがおかしいと思います。 はじめから入っているのだから、ベンダーロックインの心配がないのがいい。1

systemd が Keep it simple, stupid のUNIX哲学から外れているという批判もあるが、 UNIXで動いているソフトウェア全部がKeep it simple, stupidではないし、 systemdが邪魔になったらそれよりましなものを作ればいいと思う。

コンテナをインストール


さっそくArchLinuxの中に好き勝手いじれるArchLinuxコンテナを作ります。 pacstrapを実行するために ArchLinuxのインストールスクリプトをインストール

sudo pacman -S arch-install-scripts

これはコンテナにArchLinuxをインストールするために使う。

mkdir vps

コンテナにArchLinuxをインストール

ここにコンテナを作る。 コンテナはホストから普通のファイルシステムとして見えるので ホストのemacsで仮想環境をチラ見することができる。 chrootを強化したような感じになっている。

root権限をもっているとホストからでも emacsやvimでゲストのファイルをチラ見できるのが便利2

sudo pacstrap -i -c -d ~/vps base base-devel --ignore linux

コンテナにArchlinuxをインストール中

~/vpsにArchLinuxをインストールする。 ArchLinuxのbase base-develパッケージをインストール

パッケージをインストール

コンテナではホストのlinuxカーネルを共用する。 したがって、コンテナにlinuxカーネルをインストールしても タンスの肥やしにしかならないから –ignore linuxで コンテナにlinuxカーネルをインストールしないようにする。

コンテナにログイン


sudo systemd-nspawn -b -D ~/vps --bind=/var/cache/pacman/pkg

ホストとコンテナの両方がArch Linuxなので –bind=/var/cache/pacman/pkgでpacmanのキャッシュを共有して無駄を省きます。

コンテナにログイン

これでコンテナにログインできる。 最初はrootパスワードなしでログインする。 コンテナから抜けるには

Ctrl ]]]

を押すと終了する。sshではいってシャットダウンしても問題ない。 machinectl でコンテナをコントロールすることもできる。

コンテナの使い方

Nginxをインストールして仮想環境を開発環境にする


nginxをコンテナにインストール

pacman -Syu
pacman -S nginx

nginxをインストール

nginxのポートを80にして

server {
    listen       80;
    server_name  localhost;

nginxを仮想環境で起動

systemctl start nginx

ホストのgoogle-chromeでチェック

仮想環境を開発環境にする

あとはお好きなプログラミング言語をインストールして 焼くなり煮るなりすればよいでしょう。 ホストの /etc/host にドメインを書いておけば

#<ip-address>   <hostname.domain.org>   <hostname>
127.0.0.1       localhost.localdomain   localhost example.com

example.comで開発できます。

ローカルでドメインを利用して開発する

自動起動する場合


ln -s ~/systemdcontainer /var/lib/machines/systemdcontainer
systemctl enable systemd-nspawn@systemdcontainer.service

使わない時に負荷あるのは嫌なので自動起動はしていない。

負荷


htopで負荷を調べる

コンテナとしては負荷はめちゃくちゃ軽い。


  1. とは言ってもsystemd にロックインされるわけですが… [return]
  2. お行儀が悪いのでしないほうがよいと思います [return]