ホームページ  >  記事  >  運用・保守  >  Dockerでnginxログファイルをスクロールする方法

Dockerでnginxログファイルをスクロールする方法

WBOY
WBOY転載
2023-05-28 20:22:041029ブラウズ

Docker の使用方法

1. docker ps で実行中のコンテナを表示します。

2. docker image で docker イメージを表示します。

3. docker rm id (コンテナID) コンテナを削除します(コンテナIDはdocker psで確認できます。削除するにはコンテナを停止する必要があります)

3.1 すべてのコンテナを削除 docker rm `docker ps -a -q`

4 . docker stop id (container id) コンテナの実行を停止します

## 5. docker rmi id (mirror id) イメージを削除します

## 6. docker pull ubuntu:16.04 (ミラー名:バージョン番号) イメージをダウンロードします

7. docker run -it ubuntu:16.04 コンテナを作成して実行しますcontainer

-tは疑似端末、または新規で端末を指定することを意味しますコンテナ

# -iは、コンテナ内で(stdin)との対話を許可することを意味します

# -pは、マップされたポートを指定します

# -d コンテナをバックグラウンドで実行し、コンテナID

7.1 docker run -dit ubuntu:16.04 バックグラウンドでコンテナを作成して実行します

7.2 docker run -ditp 8080:8080 (ホストポート:コンテナポート) ubuntu:16.04 を作成して実行します。バックグラウンドでコンテナを実行し、コンテナのポートをマッピングします

# 8. dockerattach id (コンテナID) 実行中のコンテナ環境に入ります

# 9. コンテナを終了します

# 9.1 exit コンテナを直接終了し、実行中のコンテナを終了します

9.2 [ctrl p] [ctrl q ] (ショートカットキー) コンテナを終了しますが、実行中のコンテナは終了しません

10. docker commit -m'バージョン識別' id (コンテナー ID) ubuntu:16.04 (イメージとバージョン番号) イメージを送信してイメージを生成します ( このコマンドを使用して、ビルドされたコンテナーを新しいイメージにパッケージ化するか、元のイメージ (つまり、元のイメージの内容を変更します。生成されたイメージの名前がバージョン番号と同じ場合、生成されたイメージ名は直接上書きできます))

感想


nginx 公式は実際にログをローテーションする方法について説明しています:

Dockerでnginxログファイルをスクロールする方法

rotating log-files

ログ ファイルをローテーションするには、最初に名前を変更する必要があります。その後、usr1 シグナルがマスター プロセスに送信されます。マスター プロセスは、現在開いているすべてのログ ファイルを再度開き、ワーカー プロセスが実行されている非特権ユーザーを所有者として割り当てます。再オープンに成功すると、マスター プロセスは開いているすべてのファイルを閉じ、ワーカー プロセスにメッセージを送信して、ファイルを再オープンするように要求します。ワーカー プロセスは、新しいファイルを開いたり、古いファイルをすぐに閉じたりすることもあります。その結果、古いファイルはほとんど保存されません。名前•次に、usr1 シグナルを nginx マスター プロセスに送信します• nginx マスター プロセスは、シグナルを受信した後にいくつかの処理を実行し、ワーカー プロセスに再度開くように要求します。ログ ファイル

•ワーカー プロセスは新しいログ ファイルを開き、古いログ ファイルを閉じます

#実際、実際に行う必要がある作業は最初の 2 点だけです。

テスト環境を作成する


Docker がシステムにインストールされていると仮定して、ここでは nginx コンテナーを直接実行します。

$ docker run -d \
 -p 80:80 \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 --restart=always \
 --name=mynginx \
 nginx:1.11.3

マウントされた nginx ログをバインドしていることに注意してください。現在のディレクトリ内のログ ディレクトリ。


次の内容を test.sh ファイルに保存します:

#!/bin/bash
for ((i=1;i<=100000;i++))
do
 curl http://localhost > /dev/null
 sleep 1
done

次に、このスクリプトを実行して、継続的なログ レコードの生成をシミュレートします。

ローリング ログを作成するスクリプト

次の内容を含むrotatelog.sh ファイルを作成します。

#!/bin/bash
getdatestring()
{
 tz=&#39;asia/chongqing&#39; date "+%y%m%d%h%m"
}
datestring=$(getdatestring)
mv /var/log/nginx/access.log /var/log/nginx/access.${datestring}.log
mv /var/log/nginx/error.log /var/log/nginx/error.${datestring}.log
kill -usr1 `cat /var/run/nginx.pid`

getdatestring 関数は、現在の時刻を取得し、次のような文字列としてフォーマットします。 「201807241310」、作成者は日付と時刻をファイル名に付けることを好みます。ここでは、tz='asia/chongqing' によってタイム ゾーンが指定されていることに注意してください。デフォルトの形式は UTC 時間であり、これを使用するのは奇妙であるためです (リアルタイムで 8 時間を補う必要があります)。次の 2 つの mv コマンドは、ログ ファイルの名前を変更するために使用されます。最後に、kill コマンドを使用して usr1 シグナルを nginx マスター プロセスに送信します。

次のコマンドを使用して、rotatelog.sh ファイルに実行可能アクセス許可を追加し、それを $(pwd)/logs/nginx ディレクトリにコピーします。

$ chmod +x rotatelog.sh
$ sudo cp rotatelog.sh $(pwd)/logs/nginx


ローリング操作を定期的に実行します

私たちの nginx はコンテナ内で実行されるため、コンテナ内の nginx マスター プロセスに usr1 シグナルを送信する必要があります。したがって、docker exec コマンドを使用して、mynginx コンテナ内のrotatelog.sh スクリプトを実行する必要があります:

$ docker exec mynginx bash /var/log/nginx/rotatelog.sh

上記のコマンドを 1 回実行すると、スケジュールどおりに新しいログ ファイルのバッチが生成されます。

次に、スケジュールされたタスクでこのコマンドを構成し、1 時に実行します。毎朝1回。 crontab -e コマンドを実行し、ファイルの末尾に次の行を追加します。

* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh

###保存して終了。次の図は、作成者のテスト プロセス中に 5 分ごとにスクロールした場合の効果です。

Dockerでnginxログファイルをスクロールする方法

ログ ファイルをホストで直接 mv しないのはなぜですか?

バインドによってマウントされたデータ ボリュームの内容は、ホストから見た場合とコンテナーから見た場合で同じであるため、理論的にはこれが可能です。しかし、実際にこれを行うと、権限の問題が発生する可能性があります。ホスト マシンでは通常、通常のユーザーを使用しますが、コンテナーで生成されるログ ファイルの所有者は特別なユーザーとなり、通常、他のユーザーには書き込み権限と実行権限が与えられません。


Dockerでnginxログファイルをスクロールする方法

もちろん、ホスト マシン上で root ユーザーを使用している場合は問題ありません。

ホストから信号を送信できますか?

実際、この質問の完全な名前は次のようになります。ホストから Docker コンテナ内の nginx マスター プロセスにシグナルを送信できますか?


答えは「はい」です。


コマンド

$ dockercontainer kill mynginx -s usr

を使用して、コンテナー内の 1 番を処理します ( nginx master )Send usr1 signal (このメソッドはプロセス No. 1 にのみシグナルを送信できます):

Dockerでnginxログファイルをスクロールする方法

上記 2 つの質問を組み合わせると、別の方法を書くことができます。ドッカーで。この方法では、docker exec コマンドを使用してコンテナ内でコマンドを実行する必要はありませんが、ホスト上ですべての操作が完了します。


•最初にコンテナ データ ボリューム内のログ ファイルの名前を変更します

• usr1 を送信します。コンテナ内のプロセスNo.1への信号

以上がDockerでnginxログファイルをスクロールする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。