apache(httpdデーモン)の起動はserviceコマンドやsystemctlコマンドで起動する事が多いと思いますがdocker container ls
でhttpdイメージのCOMMANDの欄を見た時にhttpd-foregroundが指定されていてこれ何だろうと思ったので調べてみました。
大前提としてコンテナはCMDコマンドやENTRYPOINTコマンドで指定したコマンドが終了したらコンテナ自体も終了する仕組みです(下記の記事が分かりやすかったです)
参考:https://architecting.hateblo.jp/entry/2020/08/13/153842
結論:httpd -DFOREGROUND
コマンドを実行する事によってhttpdデーモンをフォアグラウンドで起動している。
実際にhttpdイメージのリポジトリを見ていきます。
httpdイメージのdockerfileのCMDコマンドがこの様な指定されていました。
~省略~
COPY httpd-foreground /usr/local/bin/
EXPOSE 80
CMD ["httpd-foreground"]
COPYコマンドでhttpd-foregroundが/usr/local/bin/にコピーされています。CMDコマンドで指定されているhttpd-foregroundを見てみます。
#!/bin/sh
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid
exec httpd -DFOREGROUND "$@"
httpd -DFOREGROUND
が実行されています。これはhttpdデーモンをフォアグラウンドで起動する事を意味しています。
serviceコマンドを使うとバックグラウンドで実行した後serviceコマンド自体は終了する為コンテナも終了してしまいますが、この方法ならhttpdデーモンがフォアグランドで起動されてコンテナが終了しません。
実際に試してみる
httpd-foreground
まずは普通にapacheイメージを起動してみます
docker run -dit -p 8080:80 httpd:2.4
コンテナが起動しているか確認してみます
コンテナを起動して時間がたってもコンテナは起動したままです。
service httpd start
次に先程のdocker run コマンドにservice httpd start
コマンドを引数として渡してあげます。
docker run -dit -p 8080:80 httpd:2.4 service httpd start
コンテナを見てみます
COMMANDの欄がservice httpd start
になっていてstatusがすぐにExitedになりました。serviceコマンドが終了したとほぼ同時にコンテナが停止しました。
おまけ
-DFOREGROUND
オプションをつけずにhttpd
コマンドのみでコンテナを起動してみます
docker run -dit -p 8080:80 httpd:2.4 httpd
こちらもすぐにコンテナが終了しています
何か間違いなどがありました遠慮なくご指摘ください。