dockerではなくsystemd-nspawnを利用するシチュエーション
dockerとsystemd-nspawnについて考えます。
サイトが成長することを考慮するとKubernetesなどの強力なクラスタ管理システム を使うことはほぼ必然になると思うのでdockerは欠かせなくなるツールだから使ったほうがよいですが、 dockerを普通の単一サーバーの実験用のコンテナとして使うのは色々めんどくさい感じなので 単一サーバーの実験用コンテナはsystemd-nspawnを使うことにします。 単一サーバーにおけるビルドテストとCIにだけdockerを使うならまだ話はわかるのですが、 このような場合においてさえdockerを使うのは、肉じゃがを作るときに和泉守兼定を使うようなものだと思います。 単一サーバーで運用する場合はサイトが成長したらKubernetesやAWS Fargateを使用するためにdockerを使う方針でよいでしょう。
デファクトスタンダード
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
ホストとコンテナの両方がArchLinuxなので –bind=/var/cache/pacman/pkgでpacmanのキャッシュを共有して無駄を省きます。
これでコンテナにログインできるようになります。 最初はrootパスワードなしでログインしてください。 コンテナから抜けるには
Ctrl ]]]
を押すと終了します。sshではいってシャットダウンしても問題はないでしょう。 machinectl でコンテナをコントロールすることもできます。
Nginxをインストールして仮想環境を開発環境にする
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
使わない時に負荷あるのは嫌なので自動起動は使っていません。
負荷
コンテナとしては負荷はとても軽いです。
DebianやCentOSコンテナを作る
systemd-nspawnでDebianやCentOSコンテナを作る方法は別の記事に書きました。
ブログ記事を投稿したらTwitterでお知らせいたします。ブログを気に入っていただけた方はお気軽にフォローしてください。
— Solist Work (@SolistWork) 2018年11月27日
関連記事
最新記事
タグ一覧
-
ansible (2)
application (8)
chrome (1)
command (13)
django (1)
docker (3)
document (1)
emacs (14)
git (2)
google (1)
hugo (1)
kubernetes (1)
linux (19)
makefile (6)
mariadb (2)
melpa (1)
postgresql (2)
python (1)
security (2)
terminal (11)
thinkpad (2)
work (5)
zsh (10)