質問
1. Docker コンテナーが実行中にハングするのはなぜですか?
デフォルトでは、Docker コンテナーは、コンテナー内の最初のプロセス、つまり pid=1 のプログラムを、Docker コンテナーが実行されているかどうかの基準として使用します。Docker コンテナーの pid がハングすると、 docker コンテナは直接終了します。
2. docker を実行するときは、コンテナの内部コマンドとして command を使用します。nginx を使用する場合は、バックグラウンドで nginx プログラムが実行されます。この時点では、nginx は pid 1 のプログラムではありません。しかし、bashは実行されました このbashはnginxコマンドを実行するとハングするのでコンテナも終了します あなたと同じ理由で、pm2起動後、bashのpidは1であり、bashは実行後に終了するため、コンテナも終了します出る。
以下に例を使用して、なぜこれを行うのかを説明します。 !
touch file get_pid
echo "pid of this script: $$" echo "ppid of this script: $ppid" echo "uid of this script: $uid" #nginx -g 'daemon off;'
この時点で、この sh ファイルを実行するためにコンテナを起動します。
odtoy:~ zhaojunlike$ eval `docker-machine env default` godtoy:~ zhaojunlike$ cd workspace/ godtoy:workspace zhaojunlike$ ls docker nodejs php pid_get godtoy:workspace zhaojunlike$ vim pid_get godtoy:workspace zhaojunlike$ docker run -v `pwd`/pid_get:/pid_get:ro --rm --workdir=/ nginx bash /pid_get pid of this script: 1 ppid of this script: 0 uid of this script: 0 godtoy:workspace zhaojunlike$
コンテナが pid_get を実行した後、コンテナは自動的に終了しますが、このとき現在実行中の bash の pid が 1 として出力されます。
したがって、コンテナがハングしないようにしたい場合は、デーモン以外の実行が必須です。もちろん、コンテナ内で実行することもできます。
godtoy:workspace zhaojunlike$ docker run -it nginx bash root@a8baa5fe77f0:/# nginx root@a8baa5fe77f0:/# godtoy:workspace zhaojunlike$
-it を使用します。パラメータ コンテナ内のパイプに接続できるので、コンテナ内で nginx コマンドを使用します。最後にctrl p q
コンテナを終了した後も、コンテナはまだ実行中です。
以上がnginx の実行時に docker がデーモンをオフにする理由は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。