超シンプルなコンテナ管理systemd-nspawnを使ってみる

はじめに

コンテナ作成といえばDockerが有名ですが。その他にもrktlxdなど、たくさんプロジェクトがあります。
今回はその中でも特にシンプルなsystemd-nspawnを使ってみます。

ポイントは以下3つだけです。とりあえずこの3ステップだけで使えるようになります。

  1. ファイルを用意する
  2. systemd-nspawnコマンドを実行する
  3. ネットワークを設定する

検証環境

今回はVirtualBox上のUbuntu16.04上で作業します。

検証ではubuntu-16.04-server-cloudimg-amd64-vagrant.boxをダウンロードしてVagrantで立ち上げましたが、Ubuntu16.04であれば何でも構いません。

構成については今回は簡単に、コンテナにもIPを割り当て、ホストと同じネットワークに接続するという構成にします。

またpublicネットワークにはDHCPサーバがいる前提です。

network-iamge

また、ブリッジインターフェイスを使うので、今回はプロミスキャスモードでMACアドレスに関わらず全部通すようにしておきます。

設定例

promiscas

コンテナを立ち上げる

1. ファイルを用意する

今回はdebootstrapを使ってコンテナに必要なファイルを作ります

sudo -s -H  #以後作業はrootで行います
apt update
apt install debootstrap
debootstrap --arch amd64 xenial ./ubuntu http://archive.ubuntu.com/ubuntu

docker hubから持ってきてもOKです。その場合は以下のようにします。

mkdir ubuntu
docker export $(docker create ubuntu:16.04) | tar -C ubuntu -xvf -

これでubuntuディレクトリに必要なファイルが入りました。

2. systemd-nspawnコマンドを実行する

必要なパッケージをインストールします。

apt install systemd-container bridge-utils

/etc/network/interfacesを編集して、enp0s8(ブリッジアダプターに設定した方)の設定を削除して以下のように書き換えます。enp0s8のようなインターフェイス名は各自読み替えてください。

    auto br0
    iface br0 inet dhcp
      bridge_ports enp0s8

設定したら、いったんrebootして正しく設定されてることを確認します。

systemctl reboot

コンテナに一度入り、コンテナ内のrootパスワードだけ設定しておきます。

systemd-nspawn -D ./ubuntu/
# コンテナ内でrootを取ったらパスワードを設定しておく
passwd
# exitで抜けます
exit

-bオプションを付けて実行します。これでinitから起動します。

systemd-nspawn -D ubuntu --network-bridge=br0 -b

こんな感じに、電源を入れたときのように起動すると思います。

3. ネットワークを設定する

Loginのコンソールが開いているかと思いますので、先ほど設定したrootユーザのパスワードを入力してログインします。

続いてコンテナ内のネットワークを設定します。

# ここはコンテナ内のroot
# ネットワーク設定
echo -e "auto host0\niface host0 inet dhcp" >> /etc/network/interfaces
# rebootしてみる
systemctl reboot

これでネットワークの設定も完了しました。起動も再起動もまるで本当のサーバのように動いているのが分かるかと思います。

使ってみる

普通のサーバのようにいつも通り作業できます。ログインはもちろん、aptでインストールした後に、

systemctl restart apache2
service nginx stop

のようなコマンドも使えます。

たとえば

apt install nginx

とすれば、自動的にnginxが起動してデフォルトページが表示されることが確認できます。コンテナはinitから起動し、必要なdaemonも勝手に立ち上がります。

その他のコマンド

その他コマンドとして以下のようなものがあります。

machinectl list
コンテナ/VMリスト
machinectl login コンテナ名
ログインセッションを開く
machinectl terminate コンテナ名
削除
machinectl poweroff コンテナ名
電源OFF
Ctrl-]を3回押す
コンテナ終了(machinectl loginで入ったセッションならその端末のみ終了)

他にも機能はありますが、とりあえずこれだけでも便利に使えます。

その他の機能

ここでは紹介しきれませんが、その他の機能として

  • 他のファイルパスとつなげるbind機能
  • overlayfs,btrfsを使ったCoWなファイルシステム
  • btrfsを使ったスナップショット
  • link-journalによるホストマシンへのログ共有

などなど、コンテナ管理で使えると便利な機能はひととおりあると思います。

まとめ

とりあえず立ち上げだけをやってみました。Dockerのように多機能ではありませんが、その分とてもシンプルに使えます。

何より、普段ふだん使っている実サーバとの違いがほぼないため、コンテナを意識することなく普段どおりのコマンドで管理できるのはメリットだと思います。

たった数コマンド打つだけで試せるので、ぜひ使ってみてください。

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

yamasita

東京電機大学工学部→3年間某SIerにて銀行システムの開発→bpsに入社→TechRacho外部ライター

yamasitaの書いた記事

インフラ
現場で使うansible

2014年12月25日

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ