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

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

WBOY
WBOY転載
2023-05-29 21:40:041182ブラウズ

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 (イメージとバージョン番号) イメージを送信してイメージを生成します ( このコマンドを使用して、ビルドされたコンテナーを新しいイメージにパッケージ化するか、元のイメージ (つまり、元のイメージの内容を変更します。生成されたイメージの名前がバージョン番号と同じ場合は、生成されたイメージ名を直接上書きできます))

さて、docker については誰もが知っています。 . この記事のポイントは以下のとおりですので、見ていきましょう。

nginx 自体はログ ローリングの問題を処理せず、ユーザーに問題を投げつけました。通常、logrotate ツールを使用してこのタスクを実行できます。また、必要に応じて、さまざまなスクリプトを作成して同じタスクを実行することもできます。この記事の著者は、docker で実行されている nginx ログ ファイルをスクロールする方法を紹介しています (下の画像はインターネットからのものです)。


思考

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 ログをスクロールする方法

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

答えは「はい」です。


著者はこの記事でコンテナでの信号キャプチャの問題を紹介していますので、興味のある方はぜひご覧ください。その記事では、コンテナ内のプロセスにシグナルを送信する docker の kill コマンドを紹介しました。コマンド


$ dockercontainer kill mynginx -s usr

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

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

Docker で nginx ログをスクロールする方法•最初にコンテナ データ ボリューム内のログ ファイルの名前を変更します

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

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

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