Dockerコンテナを「開発」用途ではなく「公開サービス」として使いたい場合、ログローテートが問題になってきます。
結論から言うとログローテートは、
ホストマシンの logrotate.d に任せた方が楽だし安全です
httpd や php-fpm 等、特殊な事をしていないコンテナなら docker exec [コンテナ名] httpd -k graceful
や、docker exec [コンテナ名] kill -USR1 1
例えばですが squid など、entrypoint.sh 内で tail でファイルを掴まれてしまっているような特殊な環境の場合は、docker restart squid
を postrotate に入れると良いです。
検証した環境は Docker v28.4.0 です
docker compose up -d
で起動したコンテナであっても、docker restart [コンテナ名]
は何処からでも打てます。※dockerコマンドを打てる権限 (通常はroot権限) は必要です。
docker restart コンテナ名
は docker-compose.yml で depends_on が定義されていたり、healthcheck が定義されていても、特定のコンテナだけを再起動可能です。
下記は database コンテナに healthcheck を定義し、hogehogeコンテナでは depends_on + service_healthy で database コンテナを必要としている構成で、docker restart database
を実行した結果です。
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
略 | httpd:latest | 略 | 26 minutes ago | Up 26 minutes | 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp | httpd |
略 | 秘密 | 略 | 26 minutes ago | Up 26 minutes | 80/tcp | hogehoge |
略 | mariadb:latest | "docker-entrypoint.s…" | 26 minutes ago | Up 7 seconds (healthy) | 3306/tcp | database |
database コンテナだけが Up 7 seconds (healthy) となっているので、他のコンテナに影響を与えていないことが分かります。
ホストマシン側の logrotate.d/[xxx] 設定
postrotate の箇所だけを記載しますが、下記のような感じです。
postrotate
docker exec [コンテナ名] httpd -k graceful > /dev/null 2>&1 || true
endscript
postrotate
docker restart [コンテナ名] > /dev/null 2>&1 || true
endscript
ホストマシン側でログローテートする最大の利点は、
Docker Hub の公式イメージに手を加えることなく、ログローテートできる、という点です。