我有一个运行服务器的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上的服务器?
谢谢你的帮助☺
答案 0 :(得分:1)
容器是一个孤立的环境。它是一个监狱&#34;用于运行保护主机操作系统的进程。将容器视为具有自己的IP地址的虚拟机。 localhost
将是尝试连接自身的容器。
我猜你可以使用公共IP地址联系主机上的端口8080。
在docker中运行服务器会更有意义。然后,您可以将服务器容器中的端口映射到主机上的端口。然后您的客户将按预期工作。
容器与主机操作系统交互的两种最常见方式是:
由于很好的理由,这是相当严格的限制。