Postgresql ubuntu 18.04上的docker-奇怪的连接丢失错误:连接被外部主机关闭

Postgresql ubuntu 18.04上的docker-奇怪的连接丢失错误:连接被外部主机关闭,postgresql,docker,networking,Postgresql,Docker,Networking,我在ubuntu 18.04上有一个非常奇怪的docker容器行为 基本上,我有一个docker postgres容器,使用典型的端口转发配置运行 docker run --rm --detach -v /home/userHome/Dev/DockerVolumes/postgres_data/data:/var/lib/postgresql/data --name postgres11-instance1 -e POSTGRES_PASSWORD=adminadmin -p 5432:543

我在ubuntu 18.04上有一个非常奇怪的docker容器行为

基本上,我有一个docker postgres容器,使用典型的端口转发配置运行

docker run --rm --detach -v /home/userHome/Dev/DockerVolumes/postgres_data/data:/var/lib/postgresql/data --name postgres11-instance1 -e POSTGRES_PASSWORD=adminadmin -p 5432:5432 --network pgnetwork postgres:11.5
非常基本的命令。 使用所有默认设置运行数据库。 密码是典型的管理员,根本没有安全设置

在我的mac上触发postgres功能完美无瑕。 在ubuntu上,系统以一种友好的方式运行

有时,当postgres容器开始运行时,一切都正常工作。 您可以使用pgadmin浏览数据库。 如果愿意,您可以尝试通过telenet localhost 5432查看是否能够建立到目标端口的稳定tcp/ip连接。简言之,事情按照你所期望的方式进行

但有时,在我的ubuntu上,postgres数据库神秘地无法访问。 给人的第一印象是,责任在于docker网络堆栈,而不是其他地方,因为从容器内部来看,postgres服务运行得很好

为了更好地解释这一点。如果我尝试通过以下方式与我的跑步docker postgres玩:

docker exec -it postgres-instance1 /bin/sh
我能把一个码头挂在正在运行的集装箱上。 在容器中,我可以连接到任何数据库。测试不同的psql命令。。。 我也尝试过,只是为了尝试,运行apt-get-install-telnet。通过使用容器映像,我尝试telnet localhsot 5432,我发现使用容器时,tcp/ip连接被接受,而不是立即关闭

这种行为实际上是来自ubuntu主机,或者网络中的任何其他机器,无论出于何种原因,我无法解释,有时命令“telnet locahost 5432”会立即停止告诉我“连接已被外部主机关闭”

从工作到不工作。。。就这样

我有时会在nexus图像上看到类似的东西。 如果是telnet localhost 8081,其中8081是我的主机到nexus映像的端口。我有时会看到第一次尝试建立此连接时立即失败,并显示相同的错误消息。但是,在我第二次尝试连接到套接字时,tcp ip连接保持不变,不再立即关闭

在我的博士后形象上,无论它不断失败。 奇怪的是,不需要重新启动docker服务或停止任何容器,如果与nexus容器交互,网络就会恢复工作

someuser@someuser-somecomputer:~$ docker --version
Docker version 18.09.9, build 1752eb3
someuser@someuser-somecomputer:~$ telnet localhost 5432
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
someuser@someuser-somecomputer:~$ telnet localhost 5432
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
someuser@someuser-somecomputer:~$ telnet localhost 8081
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

sfafas
HTTP/1.1 400 No URI
Content-Type: text/html;charset=iso-8859-1
Content-Length: 49
Connection: close
Server: Jetty(9.4.18.v20190429)

<h1>Bad Message 400</h1><pre>reason: No URI</pre>Connection closed by foreign host.
someuser@someuser-somecomputer:~$ telnet localhost 5432
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
例如,看看这个奇怪的终端交互。 您看到的所有telnet命令都是在ubuntu主机上执行的。 本地主机5432应通过端口转发到功能完善的postgres容器。 本地主机8081应通过端口转发到功能完善的nexus容器

someuser@someuser-somecomputer:~$ docker --version
Docker version 18.09.9, build 1752eb3
someuser@someuser-somecomputer:~$ telnet localhost 5432
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
someuser@someuser-somecomputer:~$ telnet localhost 5432
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
someuser@someuser-somecomputer:~$ telnet localhost 8081
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

sfafas
HTTP/1.1 400 No URI
Content-Type: text/html;charset=iso-8859-1
Content-Length: 49
Connection: close
Server: Jetty(9.4.18.v20190429)

<h1>Bad Message 400</h1><pre>reason: No URI</pre>Connection closed by foreign host.
someuser@someuser-somecomputer:~$ telnet localhost 5432
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
someuser@someuser-somecomputer:~$docker--版本
Docker版本18.09.9,版本1752eb3
someuser@someuser-somecomputer:~$telnet localhost 5432
正在尝试127.0.0.1。。。
已连接到本地主机。
转义字符为“^]”。
连接被外部主机关闭。
someuser@someuser-somecomputer:~$telnet localhost 5432
正在尝试127.0.0.1。。。
已连接到本地主机。
转义字符为“^]”。
连接被外部主机关闭。
someuser@someuser-somecomputer:~$telnet本地主机8081
正在尝试127.0.0.1。。。
已连接到本地主机。
转义字符为“^]”。
sfafas
HTTP/1.1400无URI
内容类型:text/html;字符集=iso-8859-1
内容长度:49
连接:关闭
服务器:Jetty(9.4.18.v20190429)
错误消息400原因:外部主机未关闭任何连接。
someuser@someuser-somecomputer:~$telnet localhost 5432
正在尝试127.0.0.1。。。
已连接到本地主机。
转义字符为“^]”。
奇怪的控制台交互显示的是,我一直在尝试与postgres建立稳定的telnet连接,并撞上了远程主机关闭的连接墙。 好啊 然后我尝试连接到同样运行在同一docker PG网络上的nexus机器,并且连接到端口转发套接字8081没有问题

然后,我最终通过tcp ip套接字向nexus机器编写了一些rubish。 得到一些HTTP错误,说我正在发送rubish请求。 最后,我的postgres机器又可以访问了

路由表是完全正常的。 它有路径172.19.0.0/16,把它放到一个叫br-e29的docker网卡上。随便什么

因此,到具有ip 172.19.0.2的postgres机器的路由与到具有ip结束的nexus机器的路由相同

所以我真的觉得我所看到的毫无意义

我在windows或mac上从未遇到过同样的现象

在ubuntu上运行的任何其他容器上,例如pg admin,我似乎也没有遇到这个问题。 直觉上,有人会认为,如果你的所有其他容器,比如nexus和pg admin,都是可以访问的,并且在port Forwarding上没有问题,那么问题一定是postgres容器本身,而不是docker网络上的问题

但如果是这样的话,那就意味着不管出于什么原因,使用docker容器的postgres都决定暂时暂停通过远程连接对自身的访问。 官方docker配置为允许所有远程连接

我猜问题可能是容器上的postgres进程。 通过在容器中使用bash会话,您不会注意到任何缺陷。 套接字在那里,套接字在监听,您可以通过使用容器本身进行telenet,并且可以执行任何您想要的“psql”命令

所以逻辑数据库进程本身运行得很好。。。 由于在正常情况下,网络上的任何计算机都可以在这个pogres机器上做任何它想做的事情(实际上没有ip限制,任何人都可以对这个数据库做任何它想做的事情)。 这让人感到奇怪的是