Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Docker容器可以';无法连接到本地主机上运行的服务器_Python_Docker_Python Requests - Fatal编程技术网

Python Docker容器可以';无法连接到本地主机上运行的服务器

Python Docker容器可以';无法连接到本地主机上运行的服务器,python,docker,python-requests,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')

我有一个运行服务器的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',))
raiseconnectionError(e,request=request)
requests.exceptions.ConnectionError:HTTPConnectionPool(host='localhost',port=8080):url:/(由NewConnectionError引起(':未能建立新连接:[Errno 111]连接被拒绝',))超过了最大重试次数
我想这是因为docker以某种方式阻止我连接到本地主机上的服务器:8080


谢谢你的帮助☺

容器意味着是一个隔离的环境。它是运行进程保护主机操作系统的“监狱”。将容器视为具有自己ip地址的虚拟机
localhost
将是试图连接到自身的容器

我猜您可以使用主机上的8080端口的公共ip地址联系它

在docker中运行服务器更有意义。然后可以将服务器容器中的端口映射到主机上的端口。那么你的客户就会像预期的那样工作

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

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

这是相当严格的,原因很充分。

所以服务器在主机上运行,客户端在容器中运行?本地是否有8080空闲?是的,服务器在主机
python server.py
上运行,客户端在容器中。是的,8080是免费的,因为客户可以在不在容器中的情况下执行GET请求。如果您对我的答案有任何疑问,我将扩展它。谢谢您的回复!我已将服务器作为容器安装并运行。如何将服务器容器中的端口映射到主机上的端口?构建时是否使用-P?如果使用
docker run
命令,则使用
-P
选项
-p 8000:8080
将端口8080从容器映射到主机上的8000。运行客户端时是否需要添加
-p
选项?或者我必须将客户端中的url更改为
url=”http://localhost:8000“
?我的服务器正在运行,但当我转到
localhost:8080
时,它无法连接。对所有的问题感到抱歉,我对docker还是一个完全的初学者!客户端容器需要知道它可以与服务器容器联系的主机名。运行客户端容器时,使用
--link
选项。在那里,您可以使用服务器容器的名称或id,这将是您连接到的主机名。你真的应该考虑使用
docker compose
来简化这一过程。谢谢你的时间!我有它现在使用链接工作。我得调查一下docker compose,因为我有很多容器在一起运行哈哈。