Maison  >  Article  >  Opération et maintenance  >  Comment faire défiler les journaux nginx dans Docker

Comment faire défiler les journaux nginx dans Docker

WBOY
WBOYavant
2023-05-29 21:40:041182parcourir

utilisation de Docker

 1. docker ps pour afficher les conteneurs en cours d'exécution

 2. images docker pour afficher les images docker

 3. docker rm id (identifiant du conteneur) Supprimer le conteneur (l'identifiant du conteneur peut être visualisé via docker ps, le conteneur doit être arrêté 3.1 Supprimer tous les conteneurs docker rm `docker ps -a -q`

  4. docker stop id (identifiant du conteneur) Arrêter l'exécution du conteneur

5. docker rmi id (identifiant miroir) Supprimer l'image

6 .docker pull ubuntu:16.04 (nom de l'image : numéro de version) Téléchargez l'image

 7. docker run -it ubuntu:16.04 Créer et exécuter le conteneur conteneur

  -t signifie spécifier un pseudo-terminal ou un terminal dans le nouveau conteneur

- je veux dire que nous sommes autorisés à interagir avec (stdin) dans le conteneur

  -p spécifie le port mappé

  -d exécute le conteneur en arrière-plan et imprime l'identifiant du conteneur

  7.1 docker run -dit ubuntu:16.04 Create et exécutez le conteneur en arrière-plan

  7.2 docker run -ditp 8080:8080 (port hôte : port du conteneur) ubuntu:16.04 Créez et exécutez le conteneur en arrière-plan et mappez le port du conteneur

 8. docker attach id ( ID du conteneur) Entrez dans l'environnement du conteneur en cours d'exécution

 9. Quitter le conteneur

  9.1 exit quitte directement le conteneur et met fin à l'exécution du conteneur

  9.2 [ctrl+p]+[ctrl+q] (touche de raccourci) quitte le conteneur, mais ne termine pas l'exécution du conteneur

 10. docker commit -m' version identification ' id (identifiant du conteneur) ubuntu:16.04 (image et numéro de version) Soumettez l'image et générez l'image (vous pouvez utiliser cette commande pour empaqueter le conteneur construit dans une nouvelle image ou écraser l'image d'origine (c'est-à-dire modifier le contenu de l'image d'origine, générer si le nom de l'image est le même que le numéro de version, il peut être écrasé directement))


D'accord, tout le monde connaît Docker ici. sont les points clés de cet article, jetons-y un coup d'œil.

nginx lui-même n'a pas géré le problème du roulement du journal, il a envoyé le ballon à l'utilisateur. En règle générale, vous pouvez utiliser l'outil logrotate pour accomplir cette tâche ou, si vous préférez, vous pouvez écrire divers scripts pour accomplir la même tâche. L'auteur de cet article explique comment faire défiler le fichier journal nginx exécuté dans Docker (l'image ci-dessous provient d'Internet).

Comment faire défiler les journaux nginx dans Docker

Thinking

nginx officiel a en fait donné des instructions sur la façon de faire rouler les journaux :


rotation des fichiers journaux

afin de faire pivoter les fichiers journaux, ils doivent d'abord être renommés après que le signal usr1 soit envoyé. au processus maître. Le processus maître rouvrira ensuite tous les fichiers journaux actuellement ouverts et leur attribuera un utilisateur non privilégié sous lequel les processus de travail sont exécutés, en tant que propriétaire, après une réouverture réussie, le processus maître ferme tous les fichiers ouverts et. envoie le message au processus de travail pour lui demander de rouvrir les fichiers. Les processus de travail ouvrent également de nouveaux fichiers et ferment immédiatement les anciens fichiers. Par conséquent, les anciens fichiers sont presque immédiatement disponibles pour le post-traitement, comme la compression.



Le. l'idée générale de cette description est la suivante :


•Renommer d'abord l'ancien fichier journal

•Ensuite, envoyez le signal usr1 au processus maître nginx

•Le processus maître nginx effectuera un traitement après avoir reçu le signal, puis demandera au processus de travail pour rouvrir les fichiers journaux
•Le processus de travail ouvre de nouveaux fichiers journaux et ferme les anciens fichiers journaux

En fait, le seul travail que nous devons vraiment faire est les deux premiers points !

Créez un environnement de test

En supposant que Docker ait été installé sur votre système, nous exécutons ici directement un conteneur nginx :

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

Notez que nous avons lié et monté les journaux de nginx dans le répertoire des journaux dans le répertoire courant.


Enregistrez le contenu suivant dans le fichier test.sh :

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

Ensuite, exécutez ce script pour simuler la génération d'enregistrements de journaux continus.

Script pour créer un journal déroulant

Créez le fichier rotatelog.sh avec le contenu suivant :

#!/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`

La fonction getdatestring prend l'heure actuelle et la formate en une chaîne, telle que "201807241310". il est temps de nommer les fichiers. Notez que le fuseau horaire est spécifié ici via tz='asia/chongqing', car par défaut le format est l'heure UTC, ce qui est bizarre à utiliser (vous devez calculer +8 heures en temps réel). Les deux commandes mv suivantes sont utilisées pour renommer les fichiers journaux. Enfin, envoyez le signal usr1 au processus maître nginx via la commande kill.

Ajoutez des autorisations exécutables au fichier rotatelog.sh via la commande suivante et copiez-le dans le répertoire $(pwd)/logs/nginx :

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

Effectuez régulièrement des opérations de roulement

Notre nginx s'exécute dans un conteneur, nous besoin Envoyez le signal usr1 au processus maître nginx dans le conteneur. Par conséquent, nous devons exécuter le script rotatelog.sh dans le conteneur mynginx via la commande docker exec :

$ docker exec mynginx bash /var/log/nginx/rotatelog.shL'exécution de la commande ci-dessus une fois générera un lot de nouveaux fichiers journaux comme prévu :

Configurons cette commande dans une tâche planifiée et laissons-la être exécutée à 1 heure chaque matin. Exécutez la commande crontab -e et ajoutez les lignes suivantes à la fin du fichier :

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

Comment faire défiler les journaux nginx dans Docker

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

Comment faire défiler les journaux nginx dans Docker

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

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


Comment faire défiler les journaux nginx dans Docker

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

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

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

答案是,可以的。

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

$ docker container kill mynginx -s usr

Comment faire défiler les journaux nginx dans Docker

Enregistrez et quittez. L'image ci-dessous est l'effet d'un défilement toutes les 5 minutes pendant le test de l'auteur :

Comment faire défiler les journaux nginx dans Docker Comment Rolling nginx se connecte dans Docker

Pourquoi ne pas mv fichiers journaux directement dans l'hôte ?

Cela est théoriquement possible, car le contenu du volume de données monté via la liaison est le même lorsqu'il est affiché depuis l'hôte et depuis le conteneur. Mais lorsque vous faites cela, vous risquez de rencontrer des problèmes d’autorisation. Sur la machine hôte, vous utilisez généralement un utilisateur ordinaire, tandis que le propriétaire du fichier journal généré dans le conteneur sera un utilisateur spécial, et généralement les autres utilisateurs ne recevront pas d'autorisations d'écriture et d'exécution :


Comment faire défiler les journaux nginx dans Docker🎜🎜Bien sûr, si vous l'utilisez dans l'hôte Si vous êtes l'utilisateur root, il n'y aura aucun problème. 🎜🎜Le signal peut-il être envoyé depuis la machine hôte ? 🎜🎜En fait, le nom complet de cette question devrait être : un signal peut-il être envoyé de l'hôte au processus maître nginx dans le conteneur Docker ? 🎜🎜🎜La réponse est oui. 🎜🎜🎜L'auteur présente le problème de la capture du signal dans les conteneurs dans cet article. Les amis intéressés peuvent y jeter un œil. Dans cet article, nous avons présenté la commande kill de docker qui envoie des signaux aux processus dans un conteneur. On peut utiliser la commande : 🎜🎜$ docker containers kill mynginx -s usr🎜🎜 pour envoyer le signal usr1 au processus n°1 (nginx master) dans le conteneur (cette méthode ne peut envoyer que le signal pour traiter n°1 ): 🎜🎜🎜🎜🎜En combinant les deux questions ci-dessus, nous pouvons écrire une autre façon de faire défiler le journal nginx dans le docker. Cette méthode ne nécessite pas d'exécuter des commandes dans le conteneur via la commande docker exec, mais effectue toutes les opérations sur la machine hôte : 🎜🎜🎜•Renommez d'abord le fichier journal dans le volume de données du conteneur🎜•Envoyez-le au processus n°1 dans le signal usr1 du conteneur🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer