web-dev-qa-db-ja.com

Ubuntu Dockerイメージ内のsystemdおよびsystemctl

Ubuntu Dockerイメージでsystemdがアクティブでないか、利用できないようです。

ubuntu:16.04およびubuntu:16.10イメージからDockerコンテナーを実行しています。

systemctl status sshコンテナで16,04を実行すると、結果はエラーFailed to connect to bus: No such file or directoryになります。 16.10コンテナでは、エラーはbash: systemctl: command not foundです。

which systemctl systemctlが16.04コンテナにあるが、16.10コンテナにはない場合.

/lib/systemdが存在することを発見しました。

Systemdをapt-get install systemd libpam-systemd systemd-uiでインストールしようとしました。 which systemctl16.10でsystemctlを見つけますが、systemctl status sshは引き続きエラーFailed to connect to bus: No such file or directoryを返します

私の主な質問は次のとおりです。UbuntuDockerイメージで使用するためにsystemdとsystemctlをアクティブにするにはどうすればよいですか?

Ubuntu Dockerコンテナでsystemdがアクティブにならないのはなぜですか? systemdはコンテナのインスタンス化には使用されませんか?

Ubuntu/Ubuntu Dockerイメージに関するこのトピックに関するドキュメントは見つかりませんでした。UpstartからsystemdへのUbuntuの移行に関する情報のみです。完全な説明を提供するドキュメントはありますか?

53
Duncan Gravill

これは仕様です。 Dockerは、コンテナのフォアグラウンドでプロセスを実行する必要があり、コンテナのpid名前空間内でPID 1として生成されます。 DockerはOSの仮想化ではなくプロセスの分離のために設計されているため、コンテナー内で実行される他のOSプロセスやデーモン(systemd、cron、syslogなど)はなく、実行するエントリポイントまたはコマンドのみです。

Systemdコマンドが含まれている場合、エントリポイントがinitに置き換わるため、多くのものが機能しないことがわかります。 Systemdは、cgroupを変更する機能により、プロセスがコンテナの隔離から逃れることができるため、コンテナ内でdockerが制限するcgroupも使用します。 systemdがコンテナ内でinitとして実行されていない場合、開始コマンドと停止コマンドを処理するデーモンはありません。

52
BMitch