dockerでnginxを使用する際に"daemon off"することの意味
dockerでもnginxを使うことが多々あるでしょう。
ネットの記事や公式のDockerfileを見ると、以下のようなコマンドで実行しています。
CMD ["nginx", "-g", "daemon off;"]
この記事では上記のコマンドにはどんな意味があり、なぜそうする必要があるのかを書きます。
1. コマンドの意味
dockerを使わずにローカルで試す場合は以下のコマンドになります。
nginx -g "daemon off;"
gオプションおよび"daemon off;"についてはそれぞれ以下の公式の記載が参考になります。
- gオプション: Command-line parameters
- "daemon off;": Core functionality
gオプションはグローバルなディレクティブ(nginxにおける設定項目)を設定するためにつけます。
"daemon off;"はディレクティブ(ディレクティブは;で終わったり、{}を使って定義する)であり、
"daemon off;"の場合は nginxがdaemonとして起動しないようにする。
端的に説明すると、"daemon on;"とするとバックグラウンドで起動し、"daemon off;"とするとフォアグラウンドで起動する(デフォルトでは"daemon on;")。
試しにnginx -g "daemon off;"
とnginx -g "daemon on;"
をそれぞれ実行してみるとその差がよくわかるだろう。
2. なぜ"daemon off;"にするのか
結論からいうとそうしないとルート・プロセス終了し、コンテナが停止してしまうからです。公式にも解説があります。
試しに以下のコマンドでコンテナでプロセスを実行してみましょう。
docker run -d -p 80:80 nginx nginx
docker run -d -p 80:80 nginx nginx -g "daemon on;"
docker run -d -p 80:80 nginx
docker run -d -p 80:80 nginx nginx -g "daemon off;"
1, 2を実行した場合は以下のようにコンテナが停止してしまっている。
$ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 00773f23396f nginx "nginx -g 'daemon on…" 2 seconds ago Exited (0) 1 second ago lucid_austin edda344f8191 nginx "nginx" 17 seconds ago Exited (0) 16 seconds ago eager_rubin
3, 4を実行した場合はともにコンテナが起動したままになる。
$ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f1a77cf7bed7 nginx "nginx -g 'daemon of…" 5 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp elastic_dijkstra
3の場合はDockerfileのCMDが実行されるため4と同じ結果になる。