Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So scrollen Sie durch Nginx-Protokolle im Docker

So scrollen Sie durch Nginx-Protokolle im Docker

WBOY
WBOYnach vorne
2023-05-29 21:40:041117Durchsuche

Docker-Nutzung

1. Docker PS zum Anzeigen laufender Container

2. Docker-Bilder zum Anzeigen von Docker-Bildern

3. Docker-RM-ID (Container-ID) Löschen Sie den Container (die Container-ID kann über Docker PS angezeigt werden, der Container muss gestoppt werden, bevor er gelöscht werden kann)

3.1 Alle Container löschen docker rm `docker ps - a -q`

4. Docker-Stopp-ID (Container-ID) Stoppen Sie die Ausführung des Containers

5. Docker-RMI-ID (Spiegel-ID) Löschen das Bild

#🎜🎜 # 6. docker pull ubuntu:16.04 (Bildname: Versionsnummer) Laden Sie das Bild herunter

7. docker run -it ubuntu:16.04 Erstellen Sie den Container-Container und führen Sie ihn aus

-t bedeutet, ein Pseudoterminal oder Terminal im neuen Container anzugeben

 -i bedeutet, dass wir mit (stdin) im Container interagieren können

#🎜 🎜# -p gibt den zugeordneten Port an

# 🎜🎜#  -d Führen Sie den Container im Hintergrund aus und drucken Sie die Container-ID

 7.1 docker run -dit ubuntu:16.04 Erstellen Sie den Container und führen Sie ihn aus im Hintergrund

 7.2 docker run -ditp 8080:8080 (Host-Port: Container-Port) ubuntu:16.04 Erstellen Sie den Container im Hintergrund, führen Sie ihn aus und ordnen Sie den Port des Containers zu

#🎜 🎜# 8. Docker-Attach-ID (Container-ID) Betreten Sie die laufende Containerumgebung

#🎜 🎜# 9. Verlassen Sie den Container

 9.1 Beenden Verlassen Sie den Container direkt und beenden Sie die Ausführung des Containers#🎜 🎜#

 9.2 [Strg+P]+[Strg+Q] (Tastenkombination) Verlassen Sie den Container. Der ausgeführte Container wird jedoch nicht beendet.

 10. docker commit -m'version Identification' id (Container-ID) ubuntu:16.04 (Image- und Versionsnummer) Senden Sie das Image und generieren Sie das Image (Sie können diesen Befehl verwenden, um das Image zu erstellen). Gute Container werden in ein neues Image gepackt oder überschreiben das Original-Image (d. h , ändern Sie den ursprünglichen Bildinhalt, und der generierte Bildname ist derselbe wie die Versionsnummer und kann direkt überschrieben werden))

Okay, jeder kennt Docker Werfen wir einen Blick darauf.

nginx hat das Rollproblem des Protokolls selbst nicht gelöst, sondern den Ball zum Benutzer geworfen. In der Regel können Sie für diese Aufgabe das Tool „logrotate“ verwenden oder, wenn Sie möchten, verschiedene Skripts schreiben, um dieselbe Aufgabe auszuführen. Der Autor dieses Artikels stellt vor, wie man durch die in Docker ausgeführte Nginx-Protokolldatei scrollt (das Bild unten stammt aus dem Internet).


Gedanken

So scrollen Sie durch Nginx-Protokolle im Dockernginx Der Beamte gab tatsächlich Anweisungen zum Rollen des Baumstamms: # 🎜🎜#

rotierende ProtokolldateienUm Protokolldateien zu rotieren, müssen sie zuerst umbenannt werden, danach wird das usr1-Signal an den Masterprozess gesendet Öffnen Sie alle aktuell geöffneten Protokolldateien erneut und weisen Sie ihnen einen nicht privilegierten Benutzer zu, unter dem die Arbeitsprozesse ausgeführt werden. Als Eigentümer schließt der Masterprozess nach erfolgreichem erneuten Öffnen alle geöffneten Dateien und sendet die Nachricht an den Arbeitsprozess, um sie dazu aufzufordern Durch das erneute Öffnen von Dateien werden auch neue Dateien geöffnet und alte Dateien sofort geschlossen, sodass alte Dateien fast sofort für die Nachbearbeitung verfügbar sind, z. B. für die Komprimierung.

dieser Absatz Die allgemeine Beschreibung lautet:

•Benennen Sie zuerst die alte Protokolldatei um
•Senden Sie dann das usr1-Signal an den Nginx-Masterprozess
•Der Nginx-Masterprozess empfängt die signal Danach wird eine gewisse Verarbeitung durchgeführt, und dann wird der Arbeitsprozess aufgefordert, die Protokolldatei erneut zu öffnen

•Der Arbeitsprozess öffnet eine neue Protokolldatei und schließt die alte Protokolldatei


Tatsächlich ist die einzige Arbeit, die wir wirklich erledigen müssen, zwei Punkte vorher!

Erstellen Sie eine Testumgebung

Vorausgesetzt, dass Docker in Ihrem System installiert wurde, führen wir hier direkt einen Nginx-Container aus:

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

Beachten Sie, dass wir Binden Sie das Nginx-Protokoll und mounten Sie es in das Protokollverzeichnis im aktuellen Verzeichnis.

Speichern Sie den folgenden Inhalt in der test.sh-Datei:

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

Führen Sie dann dieses Skript aus, um die Generierung kontinuierlicher Protokolldatensätze zu simulieren.

Skript zum Erstellen eines fortlaufenden Protokolls

Erstellen Sie die Datei „rotatelog.sh“ mit folgendem Inhalt:

#!/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-Funktion nimmt die aktuelle Zeit und formatiert sie B. „201807241310“, bevorzugt der Autor die Verwendung von Datum und Uhrzeit zum Benennen von Dateien. Beachten Sie, dass die Zeitzone hier durch tz='asia/chongqing' angegeben wird, da das Format standardmäßig UTC-Zeit ist, was seltsam zu verwenden ist (Sie müssen +8 Stunden in Echtzeit berechnen). Die folgenden zwei MV-Befehle werden zum Umbenennen von Protokolldateien verwendet. Senden Sie abschließend das usr1-Signal über den Kill-Befehl an den Nginx-Masterprozess.

Fügen Sie über den folgenden Befehl ausführbare Berechtigungen zur Datei „rotatelog.sh“ hinzu und kopieren Sie sie in das Verzeichnis $(pwd)/logs/nginx:

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

Geplant Ausführung Rollvorgang

Unser Nginx läuft in einem Container, daher müssen wir das usr1-Signal an den Nginx-Masterprozess im Container senden. Daher müssen wir das Skript „rotatelog.sh“ im Mynginx-Container über den Docker-Exec-Befehl ausführen:

Durch einmaliges Ausführen des obigen Befehls wird ein neuer generiert Stapel neuer Dateien wie geplant Protokolldatei:

Lassen Sie uns diesen Befehl in einer geplanten Aufgabe konfigurieren und ihn jeden Morgen um 1 Uhr ausführen lassen. Führen Sie den Befehl crontab -e aus und fügen Sie die folgenden Zeilen am Ende der Datei hinzu:

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

So scrollen Sie durch Nginx-Protokolle im Docker

保存并退出就可以了。下图是笔者测试过程中每 5 分钟滚动一次的效果:

So scrollen Sie durch Nginx-Protokolle im Docker

为什么不在宿主机中直接 mv 日志文件?

理论上这么做是可以的,因为通过绑定挂载的数据卷中的内容从宿主机上看和从容器中看都是一样的。但是真正这么做的时候你很可能碰到权限问题。在宿主机中,你一般使用的是普通用户,而在容器中产生的日志文件的所有者是会是特殊的用户,并且一般不会给其它用户写和执行的权限:


So scrollen Sie durch Nginx-Protokolle im Docker

当然,如果你在宿主机中使用的是 root 用户就不会有问题。

能从宿主机中发送的信号吗?

其实这个问题的全称应该是:能从宿主机中给 docker 容器中的 nginx master 进程发送信号吗?

答案是,可以的。

笔者这一文中介绍了容器中信号的捕获问题,感兴趣的朋友可以去看看。在那篇文章中我们介绍了 docker 向容器中进程发送信号的 kill 命令。我们可以通过命令:

$ docker container kill mynginx -s usr

So scrollen Sie durch Nginx-Protokolle im Docker

Einfach speichern und beenden. Das Bild unten zeigt den Effekt des Scrollens alle 5 Minuten während des Autorentests:

So scrollen Sie durch Nginx-Protokolle im Docker Wie? „Rollende Nginx-Protokolle im Docker“ /></p><p >Warum nicht MV-Protokolldateien direkt im Host? <br/></p>Dies ist theoretisch möglich, da der Inhalt des durch die Bindung bereitgestellten Datenvolumens vom Host und vom Container aus gesehen gleich ist. Aber wenn Sie dies tatsächlich tun, werden Sie wahrscheinlich auf Berechtigungsprobleme stoßen. Auf dem Host-Computer verwenden Sie im Allgemeinen einen normalen Benutzer, während der Eigentümer der im Container generierten Protokolldatei ein spezieller Benutzer ist und anderen Benutzern im Allgemeinen keine Schreib- und Ausführungsberechtigungen erteilt werden: <p ><br/></p><img src =🎜🎜Natürlich, wenn Sie es im Host verwenden Wenn Sie der Root-Benutzer sind, wird es kein Problem geben. 🎜🎜Kann das Signal vom Host-Computer gesendet werden? 🎜🎜Tatsächlich sollte der vollständige Name dieser Frage lauten: Kann ein Signal vom Host an den Nginx-Master-Prozess im Docker-Container gesendet werden? 🎜🎜🎜Die Antwort lautet: Ja. 🎜🎜🎜Der Autor stellt in diesem Artikel das Problem der Signalerfassung in Containern vor. In diesem Artikel haben wir den Kill-Befehl von Docker vorgestellt, der Signale an Prozesse in einem Container sendet. Wir können den Befehl verwenden: 🎜🎜$ docker container kill mynginx -s usr🎜🎜, um das usr1-Signal an Prozess Nr. 1 (Nginx-Master) im Container zu senden (diese Methode kann nur das Signal senden). zu Prozess Nr. 1): 🎜🎜🎜🎜🎜Durch die Kombination der beiden oben genannten Fragen können wir eine andere Möglichkeit schreiben, das Nginx-Protokoll im Docker zu scrollen. Diese Methode erfordert keine Ausführung von Befehlen im Container über den Docker-Exec-Befehl, sondern führt alle Vorgänge auf dem Host-Computer aus: 🎜🎜🎜•Benennen Sie zuerst die Protokolldatei im Container-Datenvolumen um🎜•Senden Sie sie an Prozess Nr. 1 im Container usr1-Signal🎜

Das obige ist der detaillierte Inhalt vonSo scrollen Sie durch Nginx-Protokolle im Docker. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen