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

はじめに コンテナ作成といえばDockerが有名ですが。その他にもrktやlxdなど、たくさんプロジェクトがあります。 今回はその中でも特にシンプルなsystemd-nspawnを使ってみます。 ポイントは以下3つだけです。とりあえずこの3ステップだけで使えるようになります。 ファイルを用意する systemd-nspawnコマンドを実行する ネットワークを設定する 検証環境 今回はVirtualBox上のUbuntu16.04上で作業します。 検証ではubuntu-16.04-server-cloudimg-amd64-vagrant.boxをダウンロードしてVagrantで立ち上げましたが、Ubuntu16.04であれば何でも構いません。 構成については今回は簡単に、コンテナにもIPを割り当て、ホストと同じネットワークに接続するという構成にします。 またpublicネットワークにはDHCPサーバがいる前提です。 また、ブリッジインターフェイスを使うので、今回はプロミスキャスモードでMACアドレスに関わらず全部通すようにしておきます。 設定例 コンテナを立ち上げる 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のように多機能ではありませんが、その分とてもシンプルに使えます。 何より、普段ふだん使っている実サーバとの違いがほぼないため、コンテナを意識することなく普段どおりのコマンドで管理できるのはメリットだと思います。 たった数コマンド打つだけで試せるので、ぜひ使ってみてください。 関連記事 Dockerでsupervisorを使う時によくハマる点まとめ 今の環境がDocker Containerとして動作しているかどうかをコマンドで調べる CentOS/RHELの起動スクリプト内ではsudoではなくrunuserを使う [翻訳] Dockerについてよくある勘違い