【发布时间】:2017-09-21 04:17:33
【问题描述】:
背景
我有多个 python 应用程序在同一台机器上的 docker 中运行。每个 python 应用程序都使用twisted 创建服务器和客户端以在TCP 中进行通信,每个进程侦听的端口都配置在一个静态文件中。
问题
有时,只是有时,当我重新启动一个或多个 docker 映像(我使用 docker kill 和 docker run)时,一个应用程序在被杀死之前使用的端口可能仍在使用。
在docker run 命令之后,twisted 将抛出 Unhandled error in Deferred: 错误(没有更多细节,只有这一行,可能是因为我的日志配置),当且仅当它是一个有问题的。
然后我使用netstat -ntlp 检查该特定端口,我发现该端口没有被监听。我尝试nc -l [PORT],它返回Address already in use。另外,我使用netstat -a | grep ESTABLISHED 来找出某些进程已经/已经建立了到该端口的 tcp 连接。
表示我试图暂时解决此问题
- 我多次重启有问题的 docker 镜像,直到它监听端口。
- 我杀死了之前与有问题的 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