dockerでnginxを使用する際に"daemon off"することの意味

dockerでもnginxを使うことが多々あるでしょう。
ネットの記事や公式のDockerfileを見ると、以下のようなコマンドで実行しています。

CMD ["nginx", "-g", "daemon off;"]

この記事では上記のコマンドにはどんな意味があり、なぜそうする必要があるのかを書きます。

1. コマンドの意味

dockerを使わずにローカルで試す場合は以下のコマンドになります。

nginx -g "daemon off;"

gオプションおよび"daemon off;"についてはそれぞれ以下の公式の記載が参考になります。

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;"にするのか

結論からいうとそうしないとルート・プロセス終了し、コンテナが停止してしまうからです。公式にも解説があります。
試しに以下のコマンドでコンテナでプロセスを実行してみましょう。

  1. docker run -d -p 80:80 nginx nginx
  2. docker run -d -p 80:80 nginx nginx -g "daemon on;"
  3. docker run -d -p 80:80 nginx
  4. 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と同じ結果になる。