前回の記事でmachinectl
コマンドを少し紹介しました。
今回はその続きとして、systemd-nspawnの管理コマンドを紹介します。
環境設定は前回作ったものと同じ想定です。
machinectlコマンド自体はsystemd-nspawn専用ではありませんが、こちらのコマンドを使って管理できます。
すべては紹介しきれないので個人的によく使うコマンドを紹介します。
初期設定
machinectl
コマンド経由でsystemd-nspawnを起動するかたちになります。
ファイルはどこにおいても-D
オプションで指定すればいいのですが、デフォルトで/var/lib/machinesを想定しますのでこちらに移動しておくと便利です。
前回作ったubuntuディレクトリは/var/lib/machinesに移動しておきます。
mv ./ubuntu /var/lib/machines
設定はお好みでOKです。
今回は以下のように設定します。
(細かいオプションの説明についてはman systemd-nspawn
を参照ください)
cd /etc/systemd/system
curl https://gist.githubusercontent.com/yaasita/df722fe1fee22ca0eb05b74d3aa12d48/raw/systemd-nspawn@.service -O
systemctl daemon-reload
設定は@
を付けたテンプレートユニットですので、/var/lib/machines/ubuntuに置いたコンテナは
systemctl start systemd-nspawn@ubuntu
machinectl start ubuntu # こちらでも可(後述)
として起動できます。
また、再起動時などに自動的にコンテナを起動するには
systemctl enable systemd-nspawn@ubuntu
machinectl enable # こちらでも可
というコマンドでOKです(解除する場合はdisable
)。
これで設定は完了です。
コンテナ操作
machinectl list
現在起動中のコンテナ(とVM)のリストを表示します。
machinectl
コマンドだけ打っても同じです。
systemd-nspawnを使って作られたコンテナは、SERVICE
にsystemd-nspawn
と表示されています。
machinectl start NAME
コンテナを起動します。
- NAMEには、/var/lib/machinesに置いたディレクトリ名を指定します。
下記のコマンドと同じ動作なのですが、タイプ数が少なくて済みます。
systemctl enable systemd-nspawn@ubuntu
machinectl poweroff NAME
コンテナをシャットダウンします。
- NAMEには、/var/lib/machinesに置いたディレクトリ名を指定します。
こちらはsystemd経由で正しい終了処理をしてくれます。
コンテナ内に入ってshutdown
コマンドでpoweroffしてもOKです。
machinectl terminate NAME
コンテナを即座に終了させます。
- NAMEには、/var/lib/machinesに置いたディレクトリ名を指定します。
プロセスを即座に停止させるので、daemonが正しい終了処理がを行えない可能性があります。
machinectl login NAME
ログインのターミナルを開きます。
使うためにはコンテナ内でdbusが走っている必要がありますので、あらかじめ以下のコマンドでインストールしておいてください。
# コンテナ内で打つ
apt install dbus
抜けるときはCtrl-]
を3回押します
machinectl shell NAME
シェルを実行してコンテナ内に入ります。
使うためにはコンテナ内でdbusが走っている必要がありますので、あらかじめ以下のコマンドでインストールしておいてください。
# コンテナ内で打つ
apt install dbus
以下のようにbashを指定して入ることもできます。
machinectl shell ubuntu /bin/bash
machinectl bind NAME PATH [PATH]
コンテナとホストのディレクトリを紐付けます。
- 2番目のPATHを省略すると、ホストとコンテナ間で同じ位置のディレクトリをつなげます。
--read-only
オプションを付けると、コンテナ内からは読み取り専用になります
# ホストの/mnt/for-containerをコンテナの/mntへ
machinectl bind ubuntu /mnt/for-container /mnt
# 読み取り専用でbind
machinectl bind ubuntu /mnt/for-container /mnt --read-only
# ホストの/var/tmpをコンテナの/var/tmpへ
machinectl bind ubuntu /var/tmp
イメージ操作
イメージ操作は/var/lib/machinesにあるディレクトリの操作なので、machinectl
コマンドを使わなくても行えますが、一応紹介します。
machinectl list-image
/var/lib/machinesにあるイメージ一覧を表示します。
machinectl export-tar NAME [FILE]
/var/lib/machinesにあるNAMEのイメージをtarで固めてエクスポートしてくれます。
以下のように、拡張子から圧縮形式を類推してくれます。
machinectl export-tar ubuntu ubuntu.tar
machinectl export-tar ubuntu ubuntu.tar.gz
machinectl export-tar ubuntu ubuntu.tar.bz2
FILEを省略すると標準出力となります。
吐き出したイメージはsystemd-nspawnはもちろん、Dockerでdocker import
で入れることもできます。
/var/lib/machinectlにある該当のコンテナイメージを自分で固めてもOKです。
machinectl import-tar FILE [NAME]
FILEのtarファイルをNAMEディレクトリとして/var/lib/machinesに保存します。
- NAMEを省略するとファイル名と同じものが作られます
machinectl import-tar ubuntu.tar.gz ubuntu2
- FILEを
-
にすると標準入力から読み込みます。
Dockerイメージをインポートする場合はこんな感じになります。
docker export $(docker create debian:latest) | machinectl import-tar - debian
/var/lib/machinectlに解凍したものを置いてもOKです。
machinectl remove NAME
NAMEのコンテナイメージを削除します。
下記のように削除してもOKですが、NAMEコンテナの起動中には行わないようにしてください。
rm -rf /var/lib/machines/NAME
まとめ
今回はmachinectl
コマンドを紹介しました。
systemd-nspawnは、ディレクトリ内でコンテナを動かすだけのとてもシンプルなツールです。
ですので、今回ご紹介したコマンドを覚えなくても、自分で/var/lib/machinesディレクトリを操作して目的を達成できる方は覚えなくてもOKです(Dockerから来た人はmachinectl
コマンドを使った方がしっくりくるかもしれません)。
簡単なディレクトリ操作だけで複雑な処理は何もしていませんので、すぐ覚えられると思います。
関連記事
- 超シンプルなコンテナ管理systemd-nspawnを使ってみる
- Dockerでsupervisorを使う時によくハマる点まとめ
- 今の環境がDocker Containerとして動作しているかどうかをコマンドで調べる
- CentOS/RHELの起動スクリプト内ではsudoではなくrunuserを使う
- [翻訳] Dockerについてよくある勘違い