Solist Work Blog

Software engineer note

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

dockerとsystemd-nspawnについて考えます。

サイトが成長することを考慮するとKubernetesなどの強力なクラスタ管理システム を使うことはほぼ必然になると思うのでdockerは欠かせなくなるツールだから使ったほうがよいですが、 dockerを普通の単一サーバーの実験用のコンテナとして使うのは色々めんどくさい感じなので 単一サーバーの実験用コンテナはsystemd-nspawnを使うことにします。 単一サーバーにおけるビルドテストとCIにだけdockerを使うならまだ話はわかるのですが、 このような場合においてさえdockerを使うのは、肉じゃがを作るときに和泉守兼定を使うようなものだと思います。 単一サーバーで運用する場合はサイトが成長したらKubernetesやAWS Fargateを使用するためにdockerを使う方針でよいでしょう。

デファクトスタンダード

systemd-nspawnsystemdを使うディストリビューションには必ず(嫌でも)入っています。 最近の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

ホストとコンテナの両方がArchLinuxなので –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で負荷を調べる

コンテナとしては負荷はとても軽いです。

DebianやCentOSコンテナを作る

systemd-nspawnDebianCentOSコンテナを作る方法は別の記事に書きました。


  1. とは言ってもsystemdにロックインされるわけですが… ↩︎

  2. お行儀が悪いのでしないほうがよいと思います ↩︎

関連記事

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ