質問: ### 分からないこと ``` docker run --name mycent -dt centos /sbin/init ``` 幾つかのサイトで書いてあるのですが、上のようにdockerの起動時に/sbin/initを指定する意味がよく分かりません。例えば以下のようにhttpdのイメージを使う際に ``` docker run --name myhttpd -p 8080:80 -dt httpd /sbin/init ``` のように指定するとapacheサーバが起動していないのかhttp://localhost:8080としても ページにアクセスできません。 /sbin/initを付けていない場合はうまくいくのですが、そうなると、この/sbin/initはどのような場合に 利用するのでしょうか? ### 追加の疑問点 ``` docker run --name myhttpd -p 8080:80 -dt httpd ``` でコンテナを起動し、docker exec でコンテナに入ってsystemctl list-unit-files -t service でサービス一覧を確認してもhttpdはありませんが、psコマンドで確認すると、httpdのプロセスがあるのが 確認できました。これはdockerの場合普通なのでしょうか? どなたか知識のある方、回答宜しくお願い致します。
回答: docker runのオプション後につける引数群は、イメージが指定したCMDを上書きする効果を持ちます。 https://docs.docker.com/engine/reference/commandline/run/ `/sbin/init`を付けると、"コンテナ内にある`/sbin/init`を実行する"という意味になります。 大抵のイメージでは/sbin/initはsystemdのリンクになっているようです。 以下のページでやり方等書いてあります。 https://developers.redhat.com/blog/2014/05/05/running-systemd-within-docker-container/ 想定される使用方法ですが、コンテナ内で複数プロセスを起動、管理したい場合が考えられますが、ハマリ所が多いので注意が必要です。上記の記事にもありますが、余り推奨されるものではないようです。 意図通りに動かないということであれば、`docker logs [コンテナ名]`で出力を見ることができるので、トラブル解決に役立つと思います。 psコマンドでプロセスが表示される件については、dockerのプロセスは完全に独立した仮想マシン内で実行されるのではなく、ネームスペースを分けて起動されるに過ぎないので、ホスト上のpsコマンドで表示されるのは正常です。 この辺りの話は、以下のページが詳しいです。 https://success.docker.com/KBase/Introduction_to_User_Namespaces_in_Docker_Engine