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).
nginx 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/nginx
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Quatre façons de quitter Docker Container: Utilisez Ctrl D dans le terminal de conteneur Entrez la commande d'exit dans le terminal de conteneur Utilisez Docker Stop & lt; contener_name & gt; Commande utilise docker kill & lt; contener_name & gt; commande dans le terminal hôte (sortie de force)

Comment redémarrer le conteneur Docker: Obtenez l'ID de conteneur (Docker PS); Arrêtez le conteneur (docker stop & lt; contener_id & gt;); Démarrer le conteneur (docker start & lt; contener_id & gt;); Vérifiez que le redémarrage réussit (Docker PS). Autres méthodes: Docker Compose (redémarrage Docker-Compose) ou API Docker (voir Docker Documentation).

Le processus de démarrage de MySQL dans Docker se compose des étapes suivantes: Tirez l'image MySQL pour créer et démarrer le conteneur, définir le mot de passe de l'utilisateur racine et mapper la connexion de vérification du port Créez la base de données et l'utilisateur accorde toutes les autorisations sur la base de données

Méthodes de copie de fichiers en hôtes externes dans Docker: Utilisez la commande docker cp: exécuter docker cp [options] & lt; Container Path & gt; & lt; Host Path & gt;. Utilisation de volumes de données: créez un répertoire sur l'hôte et utilisez le paramètre -v pour monter le répertoire dans le conteneur lors de la création du conteneur pour obtenir la synchronisation de fichiers bidirectionnels.

Vous pouvez interroger le nom du conteneur Docker en suivant les étapes: répertorier tous les conteneurs (Docker PS). Filtrez la liste des conteneurs (à l'aide de la commande grep). Obtient le nom du conteneur (situé dans la colonne "Noms").

Les étapes pour mettre à jour une image Docker sont les suivantes: Tirez la dernière étiquette d'image Nouvelle image Supprimer l'ancienne image pour une balise spécifique (facultative) Redémarrez le conteneur (si nécessaire)

Méthode de visualisation du processus docker: 1. Commande Docker CLI: Docker PS; 2. Commande CLI Systemd: Docker d'état SystemCTL; 3. Docker Compose CLI Commande: Docker-Compose PS; 4. Process Explorer (Windows); 5. / Répertoire proc (Linux).

Vous pouvez passer à la source de miroir domestique. Les étapes sont les suivantes: 1. Modifiez le fichier de configuration /etc/docker/daemon.json et ajoutez l'adresse source miroir; 2. Après enregistrer et sortir, redémarrez le service Docker Sudo Systemctl Docker pour améliorer la vitesse et la stabilité du téléchargement d'image.
