巻取

書いてる内容があってるかはしりません

【Docker】コンテナをsystemctlがつかえる形で起動する

まとめ
コンテナでsystem controlを使いたい場合は、起動時にsytem controlにPIDの1番が振られるように工夫が必要である

 作成したコンテナにパッケージをインストールして、システムコントロールで起動しようとした際に(OS:CentOS)、以下のようなエラーで弾かれる。

[container]# systemctl
#   System has not been booted with systemd as init system (PID 1). Can't operate.
#  Failed to connect to bus: Host is down

 システムコントロールはPID1番が割り振られていてはじめてinitとして機能するが(参考)、Dockerがコンテナを起動した際にシステムコントロールにPIDの1番が振られるような起動の仕方をしないため、システムコントロールが動けなくなっている。


 であれば、コンテナ起動時にシステムコントロールのPIDが1になるように指定してあげればいい。docker runの使い方を見ていると、イメージ名のあとに、コンテナの箱をつくった直後に実行するコマンドを指定できるとのこと。

使い方: docker run [オプション] イメージ [コマンド] [引数...]
(……)
docker run コマンドは、まず指定されたイメージ上に書き込み可能なコンテナ・レイヤを create (作成)します。それから、指定されたコマンドを使って start (開始)します。

 
 なのでここにinitがシステムコントロールになるように指定して起動してみる。イメージ(centos)の後にある\sbin\initがそれにあたる。

[makitori@instance ~]# sudo docker run -it --name container centos \sbin\init

 これで起動したコンテナでシステムコントロールを呼ぶと、エラー無く実行してくれる。

[makitori@instance ~]# sudo docker exec container bash
[container]# systemctl start httpd
[container]#