Maison >Opération et maintenance >Nginx >Comment faire défiler le fichier journal nginx dans Docker
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))
Le responsable de nginx donne en fait des instructions sur la façon de faire pivoter les journaux :
rotation des fichiers journaux
L'idée générale de cette description est la suivante :
• Renommez d'abord l'ancien fichier journal
•Le processus maître nginx reçoit le signal Ensuite, nous effectuerons un traitement, puis demanderons au processus de travail de rouvrir le fichier journal
• Le processus de travail ouvre un nouveau fichier journal et ferme l'ancien fichier journal
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='asia/chongqing' 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/nginxEffectuez 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.sh
Exécutez ce qui précède commande une fois, et elle générera un lot de nouveaux fichiers journaux comme prévu : $ docker exec mynginx bash /var/log/nginx/rotatelog.sh
执行一次上面的命令,会如期产生一批新的日志文件:
下面我们把这个命令配置在定时任务中,让它每天早上 1 点钟执行一次。执行 crontab -e 命令,并在文件的末尾添加下面的行:
* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh
* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh
🎜🎜🎜🎜Enregistrez et quittez. L'image ci-dessous est l'effet d'un défilement toutes les 5 minutes lors du test de l'auteur :
Pourquoi ne pas mv le fichier journal 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. Dans 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 :
Bien sûr , si vous utilisez l'utilisateur root sur la machine hôte, 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.
Nous pouvons envoyer le signal usr1 au processus n°1 (nginx master) dans le conteneur via la commande :
$ docker container kill mynginx -s usr
(cette méthode ne peut envoyer le signal qu'au processus n°1) :
Combinez les deux ci-dessus. Comme question, 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!