Maison >Opération et maintenance >Nginx >Comment faire défiler les journaux 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))
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).
Thinkingnginx officiel a en fait donné des instructions sur la façon de faire rouler les journaux :
rotation des fichiers journaux
Le. l'idée générale de cette description est la suivante :
•Renommer d'abord l'ancien fichier journal
•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='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
L'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
保存并退出就可以了。下图是笔者测试过程中每 5 分钟滚动一次的效果:
为什么不在宿主机中直接 mv 日志文件?
理论上这么做是可以的,因为通过绑定挂载的数据卷中的内容从宿主机上看和从容器中看都是一样的。但是真正这么做的时候你很可能碰到权限问题。在宿主机中,你一般使用的是普通用户,而在容器中产生的日志文件的所有者是会是特殊的用户,并且一般不会给其它用户写和执行的权限:
当然,如果你在宿主机中使用的是 root 用户就不会有问题。
能从宿主机中发送的信号吗?
其实这个问题的全称应该是:能从宿主机中给 docker 容器中的 nginx master 进程发送信号吗?
答案是,可以的。
笔者这一文中介绍了容器中信号的捕获问题,感兴趣的朋友可以去看看。在那篇文章中我们介绍了 docker 向容器中进程发送信号的 kill 命令。我们可以通过命令:
$ docker container kill mynginx -s usr
Pourquoi ne pas mv fichiers journaux directement dans l'hôte ?
$ 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!