2017-09-21 5 views
0

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

  1. Je redémarrés l'image docker problématiques à plusieurs reprises, jusqu'à ce qu'il écoute le port.
  2. 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

+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. –

+0

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

+0

@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

Répondre

0

D'abord l'évidence, avez-vous essayé ce qui suit,

docker restart <container name> 

Si cela ne fonctionne pas, essayez de suivre, en dernier recours.

docker kill --signal=SIGKILL <container name> 
+0

Je vais essayer. Puisque cette situation arrive de temps en temps, il me faudra peut-être un peu de temps pour observer. Merci beaucoup et j'espère que cette réponse m'aidera. J'ai probablement besoin de réviser un peu plus les documents de docker. – user4394476