【问题标题】:TCP connection failure after kill+start docker imagekill+start docker image 后 TCP 连接失败
【发布时间】:2017-09-21 04:17:33
【问题描述】:

背景

我有多个 python 应用程序在同一台机器上的 docker 中运行。每个 python 应用程序都使用twisted 创建服务器和客户端以在TCP 中进行通信,每个进程侦听的端口都配置在一个静态文件中。

问题

有时,只是有时,当我重新启动一个或多个 docker 映像(我使用 docker killdocker run)时,一个应用程序在被杀死之前使用的端口可能仍在使用。

docker run 命令之后,twisted 将抛出 Unhandled error in Deferred: 错误(没有更多细节,只有这一行,可能是因为我的日志配置),当且仅当它是一个有问题的。

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

表示我试图暂时解决此问题

  1. 我多次重启有问题的 docker 镜像,直到它监听端口。
  2. 我杀死了之前与有问题的 Docker 映像通信的其他 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 扭曲:17.1.0

【问题讨论】:

  • 发生这种情况是因为您没有处理异常并且由于您的日志记录配置而无法看到它的详细信息。
  • 在应用程序上记录工作parallel,因此记录器是异常(或其他)处理程序不能直接添加到您的应用程序。 kill or stop 需要from outside to inside 方向,如果包含外部线程/进程,则无法终止/停止任何线程/进程。创建app loop 很容易,但app life loop 需要检查每个状态+事件。
  • @KlausD。我将研究日志记录,它只会在启动有问题的 docker 映像后抛出此错误消息。 @dsgdfg 您的意思是docker kill 命令不会杀死python 进程或扭曲的tcp 连接吗?那么如何解释这种情况只是偶尔发生呢?

标签: python linux docker networking tcp


【解决方案1】:

首先是显而易见的,您是否尝试过以下方法,

docker restart <container name>

如果效果不佳,请尝试跟随,作为最后的手段。

docker kill --signal=SIGKILL <container name>

【讨论】:

  • 我会试一试的。由于这种情况偶尔会发生,我可能需要一些时间来观察。非常感谢,希望这个答案能帮助我。可能我还需要修改 docker 的文档。
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
相关资源
最近更新 更多