質問: dockerのコンテナだとコンテナ内でexitしただけで、コンテナは停止します。停止に時間はかかりません。 lxcコンテナだとコンテナ内でexitしてもコンテナは停止しません。ホスト側でlxc-stopコマンドを使用します。停止にはかなり時間がかかります。そこで思ったのが下記の質問です。 ーー質問ーー 同じコンテナなのに停止する速度が違うのはなぜなのでしょうか? > > 予想 > -- > > > 1.docker dockerの`ps 1`を見たら/bin/bashになっていました。 新しいシェルを起動させてコンテナを作成しているのかな?。シェルの場合だとexitでもシェルは停止されます。 shellは停止は早いです。以下を時間をかけずにスムーズに行えます。 ``` $ps PID TTY TIME CMD 7274 pts/9 00:00:00 bash 7644 pts/9 00:00:00 ps $bash $ps PID TTY TIME CMD 7274 pts/9 00:00:00 bash 7649 pts/9 00:00:00 bash 7644 pts/9 00:00:00 ps $exit $ps PID TTY TIME CMD 7274 pts/9 00:00:00 bash 7644 pts/9 00:00:00 ps ``` 2.lxc 次はlxcです`ps 1`は/sbin/initでした。 (ちなみに、コンテナのOSはubuntu15.10のinitではなくsystemdです。) コンテナの起動方法がshellではなく一から起動しています。 コンテナを停止する際にもdockerと比べて停止時間が遅いのは納得できます。 あくまで予想ですが、このように考えています。どうなのでしょうか? よろしくお願いします。m(__)m
回答: 予想の通りです。 Dockerは「アプリケーションコンテナ」を起動するための仕組みであり、例えば `docker run -t -i ubuntu /bin/bash` みたいにした場合、コンテナ内では `/bin/bash` のみが起動します。つまり bash から exit したらコンテナは終了します。 LXC は一般的には「システムコンテナ」を動かします。通常のOSを起動させるのと同じで init を起動し、initの設定ファイルで指定したプログラムを起動します。つまり、複数のプログラムやデーモンが起動した状態ですので、それを通常のOSと同じく順番に停止していかなければなりません。なので`lxc-stop`だったり、コンテナ内から`shutdown`コマンドを実行してコンテナを止めるのです。 もちろんDockerでinitを実行したり、LXCで単体のアプリケーションを起動したりすることもできます。 LXC/LXDでコンテナの停止があまりにも遅い場合(例えば30秒とか)は、コンテナ内のinitの設定がマズかったりする場合もあるので、チェックが必要ですね。(lxc-stopというのはコンテナ内のPID=1のプロセスに決められたシグナルを送るだけなのです。つまりPID=1のプロセスがそのシグナルを受け取っても何もしないようになっていた場合、lxc-stopは一定時間を待って強制的にkillしますので、停止に時間がかかります。