概要
前回の記事の続きです
長いオプションの付いたsystemd-nspawnコマンドを毎回打たなくても、起動設定を行えば簡潔なmachinectlコマンドでコンテナを起動できます
今回はmachinectlの使えるようにする設定と使い方を書きます
起動設定
machinectlコマンドは内部でsystemctlコマンドを呼んでsystemd-nspawnを実行しますので、Unitファイルを作ります
マシン名を受け取るtemplateユニットとして設定しておきます
curl -L https://goo.gl/NZbdo8 > /etc/systemd/system/systemd-nspawn@.service
また内部でdbusが走っていないと, machinectl login
, machinectl shell
コマンドが使えないので予めインストールしておきます
cd /var/lib/machines
systemd-nspawn -b -D ./ubuntu --network-bridge=br0
# ここからコンテナ側での操作
# rootでログインする
apt install dbus
halt
# コンテナ側操作はここまで
これで準備が整いました
machinectlコマンド
少しmachinectlコマンドを使ってみます
例として、コンテナスタート→コンテナにログイン→自動起動の設定までやってみます
# 起動
machinectl start ubuntu
# 起動確認
machinectl
# コンテナに入りシェルを実行
machinectl shell ubuntu /bin/bash
# コンテナ内でnginxが動いていることを確認
ps -ef
# コンテナ内のシェルから抜ける
exit
# ubuntuコンテナの自動起動設定
machinectl enable ubuntu
# ホスト再起動
shutdown -r now
再起動後に
http://192.168.56.3/
にアクセスするとNginxのデフォルトページが表示されるかと思います
これは以下のようにホストのsystemdがubuntuコンテナを起動し、ubuntuコンテナ内のsystemdがNginxを起動しています
ちなみにubuntuコンテナの自動起動を止めたい場合はmachinectl disable ubuntu
というコマンドで可能です
Dockerとの比較
Dockerとの比較表を作ってみました
Dockerと機能も概念も違うため完全に同一ではありません。大まかなイメージとして捉えてくれればと思います。
machinectl | docker | 説明 |
---|---|---|
bind | -vオプション | docker run の-vオプションのように異なるファイルパスをつなげる機能です |
copy-from | cp | コンテナ側からホスト側へコピーします |
copy-to | cp | ホスト側からコンテナ側へコピーします |
disable | 自動起動を解除します | |
enable | コンテナがホスト起動時に自動で立ち上がるようにします | |
export-tar | export | 対象のコンテナをtarに固めます。止まっている状態でもOKです |
image-status | inspect | イメージの情報を表示します |
import-tar | import | tarからコンテナをインポートします |
kill | stop | デフォルトで全コンテナプロセスにSIGTERMを送信します1 |
list | ps | 動いているコンテナをリストします |
list-images | images | コンテナイメージのリストを表示します |
login | ログインコンソールを表示します | |
poweroff | stop | 綺麗にシャットダウンします(systemd互換のinitのみ動作します) |
pull-tar | pull | コンテナが置かれてるURLからダウンロードしてインポートします |
reboot | restart | コンテナを再起動させます。(initにSIGINTを送信)2 |
remove | rmi | イメージを削除します |
rename | tag | イメージの名前を変えます3 |
shell | exec | コンテナ内でシェルを実行します。4 |
show | inspect | 稼働中のコンテナの情報を表示します |
show-image | inspect | image-statusより詳細にイメージの情報を出力します |
start | run | コンテナを起動させます |
status | top | 稼働中のコンテナのプロセス、ログ情報を表示します |
terminate | kill | コンテナ内の全プロセスを強制終了します |
参考
https://www.variantweb.net/blog/systemd-machinectl-vs-docker/
次回: Macとsystemd-nspawnで普通の開発環境を作るまで(3)~ファイル共有設定~