Contexte
J'ai plusieurs applications de python en cours d'exécution dans docker sur la même machine. Chaque application python utilise twisted
pour créer le serveur et le client pour communiquer dans TCP
, les ports que chaque processus écoute sont configurés dans un fichier statique.échec de la connexion TCP après kill + début image docker
Problème
PARFOIS, seulement PARFOIS, lorsque je redémarre une ou plusieurs images docker (j'utilise docker kill
et docker run
), il y a une chance d'un port qu'une application utilisée avant d'être tué est encore utilisé.
Après commande docker run
, twisted
jetterait erreur Unhandled error in Deferred:
(sans plus de détails, que cette ligne, peut-être à cause de mes configs d'exploitation forestière), si et seulement si elle est problématique.
Puis j'utilise netstat -ntlp
pour vérifier ce port particulier, je trouve que le port n'est pas écouté. Et j'essaie nc -l [PORT]
, il renvoie Address already in use
. En outre, j'utilise netstat -a | grep ESTABLISHED
pour découvrir que certains processus ont/ont déjà établi une connexion tcp à ce port.
signifie que j'ai essayé de résoudre ce problème temporairement
- Je redémarrés l'image docker problématiques à plusieurs reprises, jusqu'à ce qu'il écoute le port.
- J'ai tué d'autres images docker qui communiquaient auparavant avec l'image docker problématique, puis redémarré toutes les images tuées.
ce qu'on attend
Je voudrais savoir pourquoi cette situation se produit et comment y remédier. Je ne veux pas vérifier netstat -ntlp
chaque fois que je redémarre mes images docker.
Environnement:
OS: Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-53-generic x86_64)
Docker:
Client:
Version: 1.13.1
API version: 1.26
Go version: go1.7.5
Git commit: 092cba3
Built: Wed Feb 8 06:42:29 2017
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 092cba3
Built: Wed Feb 8 06:42:29 2017
OS/Arch: linux/amd64
Experimental: false
Python: Python 2.7.6
Twisted: 17.1.0
Cela arrive parce que vous n'avez pas géré une exception et vous ne pouvez pas voir les détails à cause de votre configuration de journalisation. –
La journalisation du travail 'parallel' sur une application, de sorte que le logger est une exception (ou quelque chose d'autre) gestionnaire ne peut pas être ajouté directement à votre application.'kill or stop' requis 'de l'extérieur vers l'intérieur', vous ne pouvez pas tuer/arrêter un thread/processus si vous incluez un thread/processus externe. Créer 'boucle d'application' est facile, mais' boucle de vie de l'application' requis vérifier chaque statut + événements. – dsgdfg
@KlausD. Je vais regarder dans la chose de journalisation, il ne lance que ces messages d'erreur après le démarrage d'une image docker problématique. @dsgdfg Voulez-vous dire que le processus python ou la connexion tcp tordue n'est pas tué par la commande 'docker kill'? Alors comment expliquer cela arrive juste de temps en temps? – user4394476