【问题标题】:Docker listening in container but not answering outside, why?Docker 在容器中监听,但在外部不应答,为什么?
【发布时间】:2015-01-18 22:06:24
【问题描述】:

我有一个 docker 容器,其中包含“EXPOSE 8000”的说明。我是这样开始的:

sudo docker run -t -i -P imagename

容器中的进程正在监听 8000。

# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost:8000          *:*                     LISTEN     
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
# 

在主机上(即容器外),我看到端口 49164 绑定到容器端口 8000:

[S-22]jeff@siegfried:~ $ sudo docker ps 
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                     NAMES
0b0e333c6ec9        lkz:latest                 "/bin/bash"         About an hour ago   Up 6 minutes        0.0.0.0:49164->8000/tcp   lkxyz__2015-01-18_202737   
[S-22]jeff@siegfried:~ $ 

Inded,docker inspect 说(除其他外)

"NetworkSettings": {
    "Bridge": "docker0",
    "Gateway": "172.17.42.1",
    "IPAddress": "172.17.0.16",
    "IPPrefixLen": 16,
    "PortMapping": null,
    "Ports": {
        "8000/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49164"
            }
        ]
    }
},

然而,我无法与容器对话。外面,

[S-22]jeff@siegfried:~ $ telnet localhost 49164
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
1,[S-22] jeff@siegfried:~ $ 

在里面,

# telnet localhost 8000
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /

[18/Jan/2015 23:00:59] "GET /" 200 4066
<!DOCTYPE html>
<html>
<head>
...

我希望外部的 telnet 到 49164 会像内部一样返回 html。

有什么建议吗?

【问题讨论】:

  • 啊哈,这可能是容器实际上只监听本地主机。在主机 siegfried 上做同样的事情,我可以连接到 telnet localhost 8000,但不能连接到 telnet siegfried 8000。好的,那么现在我该如何解决这个问题...

标签: docker


【解决方案1】:

您可能希望让您在容器中运行的服务在0.0.0.0 而不是127.0.0.1 上进行侦听

【讨论】:

  • 这是救命稻草。为 Apache Spark 使用 docker,spark://0.0.0.0:7077
  • 我们如何在带有 docker 的 windows 10 中做到这一点?听0.0.0.0?
  • 在我们的例子中,端口正在监听 0.0.0.0,但我们需要将 Docker 重置为出厂默认设置(Docker Preferences/Bomb 选项卡)并重新安装映像。
  • 确认一下,是的,当 Docker 接受传入连接但您在 Docker 中运行的服务拒绝它们时,您会看到这种行为。我还必须更改 Dockerised 服务以侦听 0.0.0.0 来解决问题,但 Docker 配置本身并没有改变。
  • This answer 详细说明了为什么会这样
【解决方案2】:

尝试从主机连接 172.17.0.16:8000。 我对 nginx 也有类似的问题。 我将容器内的 127.0.0.1:8000 替换为 172.17.0.16:8000,它对我有用。

【讨论】:

    【解决方案3】:

    将容器的8000端口绑定到TCP的8000端口

    docker run -d -p 8000:8000 镜像名称

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2023-01-18
      • 2021-06-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多