无法从主机 localhost 访问容器网络服务器
Unable to reach container webserver from host localhost
使用 Docker v 17.03.1-ce,在 linux mint 机器上,我无法使用我的浏览器(本地主机端口 9000)访问容器 Web 服务器(容器端口 5000) ) 在主机上。
容器使用命令启动:
sudo docker run -d -p 9000:5000 --name myContainer imageName
- 我首先检查容器上的服务器(烧瓶)是否已正确启动。已上线。
- 我想检查服务器是否正常工作,所以在容器中,使用curl,我在本地主机,端口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日志和dockerps
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 -
编辑 2:在主机上为 curl localhost:9000 添加结果
因此,当连接到我的网络浏览器时,连接不起作用,但 curl 给出了更具体的消息:
curl localhost:9000
curl: (56) Recv failure: Connection reset by peer
我在这个 post 中找到了解决方案:https://devops.stackexchange.com/questions/3380/dockerized-flask-connection-reset-by-peer
Docker 网络和端口转发工作正常。问题出在我的 flask 服务器上。似乎默认情况下,服务器配置为仅接受来自本地主机的请求。
启动 flash 服务器时,使用 "run" 命令,必须指定 host='0.0.0.0' ,以便可以提供任何 ip。
if __name__ == "__main__":
app.run(host='0.0.0.0')
使用 Docker v 17.03.1-ce,在 linux mint 机器上,我无法使用我的浏览器(本地主机端口 9000)访问容器 Web 服务器(容器端口 5000) ) 在主机上。
容器使用命令启动:
sudo docker run -d -p 9000:5000 --name myContainer imageName
- 我首先检查容器上的服务器(烧瓶)是否已正确启动。已上线。
- 我想检查服务器是否正常工作,所以在容器中,使用curl,我在本地主机,端口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日志和dockerps
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 -
编辑 2:在主机上为 curl localhost:9000 添加结果 因此,当连接到我的网络浏览器时,连接不起作用,但 curl 给出了更具体的消息:
curl localhost:9000
curl: (56) Recv failure: Connection reset by peer
我在这个 post 中找到了解决方案:https://devops.stackexchange.com/questions/3380/dockerized-flask-connection-reset-by-peer
Docker 网络和端口转发工作正常。问题出在我的 flask 服务器上。似乎默认情况下,服务器配置为仅接受来自本地主机的请求。
启动 flash 服务器时,使用 "run" 命令,必须指定 host='0.0.0.0' ,以便可以提供任何 ip。
if __name__ == "__main__":
app.run(host='0.0.0.0')