はじめに
コンテナ作成といえば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についてよくある勘違い