kill +启动docker映像后TCP连接失败

背景

我有多个Python应用程序在同一台机器上的泊坞窗运行。 每个python应用程序使用twisted来创build服务器和客户端以TCP进行通信,每个进程侦听的端口都被configuration在一个静态文件中。

问题

有时,只有有时,当我重新启动一个或多个docker图像(我使用docker killdocker run ),有一个机会,一个应用程序使用之前使用的端口仍在使用。

docker run命令后, twistedUnhandled error in Deferred: Error(没有更多的细节,只有这一行,可能是因为我的日志configuration)抛出Unhandled error in Deferred: ,当且仅当它是有问题的。

然后我用netstat -ntlp来检查那个特定的端口,我发现这个端口没有被监听。 而我尝试nc -l [PORT] ,它返回Address already in use 。 另外,我使用netstat -a | grep ESTABLISHED netstat -a | grep ESTABLISHED找出一些进程已经build立到该端口的TCP连接。

意思是我试图暂时解决这个问题

  1. 我重新启动了有问题的Docker镜像,直到听到端口。
  2. 我杀了以前与有问题的docker图像通信的其他docker图像,然后重新启动所有死亡的图像。

什么是预期的

我想知道为什么发生这种情况,以及如何解决这个问题。 我不想每次重新启动泊坞窗图像时检查netstat -ntlp

环境

操作系统: Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-53-generic x86_64)

泊坞窗:

 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

首先是明显的,你有没有尝试过以下,

 docker restart <container name> 

如果它不工作,那就试试看,作为最后的手段。

 docker kill --signal=SIGKILL <container name>