【问题标题】:Unable to reach container webserver from host localhost无法从主机 localhost 访问容器网络服务器
【发布时间】:2019-07-04 01:15:35
【问题描述】:

在 linux mint 机器上使用 Docker v 17.03.1-ce,我无法通过主机上的浏览器(localhost 端口 9000)访问容器 Web 服务器(容器端口 5000)。

使用命令启动的容器:

sudo docker run -d -p 9000:5000 --name myContainer imageName
  • 我首先检查容器上的服务器(flask)是否已正确启动。它已启动。
  • 我想检查服务器是否正常工作,所以在容器中,我使用 curl 在 localhost 端口 5000 上发送了一个 GET 请求。服务器返回了网页

所以,服务器正在工作,因此问题在于容器和主机之间的通信。

我检查了 iptables,但不知道该怎么做:

sudo iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-ISOLATION  all  --  anywhere             anywhere            
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (2 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:5000

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere 

sudo iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:5000

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9000 to:172.17.0.2:5000

预期结果:使用我的浏览器,使用 url “localhost:9000”,我可以通过端口 5000 接收容器发送的主页。

编辑:添加 docker logs 和 docker ps

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
59a20248c5b2        apptest             "python3 src/jboos..."   12 hours ago        Up 12 hours         0.0.0.0:9000->5000/tcp   jboost

sudo docker 记录 jboost

 * Serving Flask app "jboost_app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 310-292-856
127.0.0.1 - - [03/Jul/2019 04:12:54] "GET / HTTP/1.1" 200 -

edit 2:在主机上为 curl localhost:9000 添加结果 所以当用我的网络浏览器连接时,连接不起作用,但 curl 给出了更具体的消息:

curl localhost:9000
curl: (56) Recv failure: Connection reset by peer

【问题讨论】:

  • 您在主机上尝试过curl http://localhost:9000 吗?也尝试使用您的 IP 地址。
  • 码头工人日志,码头工人ps?
  • @Ntwobike,已添加日志和 docker ps。
  • @PrakashKrishna, curl 显示: curl: (56) Recv failure: Connection reset by peer 。
  • @Prasanth,谢谢。我发现了这个问题。在我的容器中,flask 服务器默认只接受来自 localhost 的请求。我需要通过指定 app.run(host='0.0.0.0') 来指定它应该回答来自任何 ip 的查询。

标签: docker containers iptables


【解决方案1】:

我在这篇文章中找到了解决方案:https://devops.stackexchange.com/questions/3380/dockerized-flask-connection-reset-by-peer

Docker 网络和端口转发工作正常。问题出在我的 flask 服务器上。似乎默认情况下,服务器被配置为只接受来自本地主机的请求。

在启动您的闪存服务器时,使用“运行”命令,您必须指定 host='0.0.0.0' ,以便可以提供任何 ip。

if __name__ == "__main__":
    app.run(host='0.0.0.0')

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 2020-11-22
    • 1970-01-01
    • 2020-02-24
    • 2023-01-24
    • 2016-07-18
    • 2017-12-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多