Docker容器无法连接到localhost上运行的服务器

时间:2017-07-18 15:24:54

标签: python docker python-requests

我有一个运行服务器的python文件:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import json

class S(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def do_GET(self):
        self._set_headers()
        with open('files.json') as myfile:
            self.wfile.write(myfile.read())

....

def run(server_class=HTTPServer, handler_class=S, port=8080):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting httpd...'
httpd.serve_forever()

另一个做get请求:     导入请求

SESSION = requests.Session()
SESSION.trust_env = False

url = "http://localhost:8080"
response = SESSION.get(url)
data = response.json()

当我正常运行这两个时,这工作正常。但是,当我收集应用程序(而不是服务器)时,请求会向我抛出此错误:

raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f7ec03e5ed0>: Failed to establish a new connection: [Errno 111] Connection refused',))

我认为这是因为docker以某种方式阻止我连接到localhost:8080上的服务器?

谢谢你的帮助☺

1 个答案:

答案 0 :(得分:1)

容器是一个孤立的环境。它是一个监狱&#34;用于运行保护主机操作系统的进程。将容器视为具有自己的IP地址的虚拟机。 localhost将是尝试连接自身的容器。

我猜你可以使用公共IP地址联系主机上的端口8080。

在docker中运行服务器会更有意义。然后,您可以将服务器容器中的端口映射到主机上的端口。然后您的客户将按预期工作。

容器与主机操作系统交互的两种最常见方式是:

  • 将网络端口从容器映射到主机
  • 将文件作为卷从主机映射到容器时

由于很好的理由,这是相当严格的限制。