masablog

Keep it simple, stupid

docker ではなく systemd-nspawn で作る web 開発環境

tech

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

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

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

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

~/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 をインストールして仮想環境を web 開発環境にする


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

pacman -Syu
pacman -S 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

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

負荷


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

その他


Centos,Debian のコンテナを作るを書いた    


  1. systemd にロックインされるけど [return]
  2. お行儀が悪いのでしないほういい [return]

4 Nov 2016 #linux #ArchLinux #systemd #ansible

このエントリーをはてなブックマークに追加