Windows下Docker部署FastAPI后请求出现WinError10049连接错误求助
问题与解决方案
问题背景
我开发了一个FastAPI应用,之前在Colab通过ngrok暴露外部端口,现在改为Docker部署。Dockerfile、依赖配置、启动命令均正常执行,但在Windows系统的IDLE中发送请求时出现WinError 10049连接错误。
配置文件与操作步骤
Dockerfile
FROM python:3.10-slim RUN apt-get update && apt-get install -y ffmpeg WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt # Make port 8000 available to the world outside this container EXPOSE 8000 # Define environment variable ENV NAME FastAPIApp # Run app.py when the container launches CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
requirements.txt
fastapi uvicorn python-multipart pydub nest-asyncio audonnx audinterface
构建与启动命令
docker build -t my-fastapi-app . docker run -p 8000:8000 my-fastapi-app
客户端请求代码
import requests url = 'http://0.0.0.0:8000' files = {'file': open('C:\\Users\\Z\\Desktop\\v\\f.m4a', 'rb')} response = requests.post(url, files=files) print(response.status_code) print(response.text)
报错信息
Traceback (most recent call last): File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connection.py", line 203, in _new_conn sock = connection.create_connection( File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\util\connection.py", line 85, in create_connection raise err File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\util\connection.py", line 73, in create_connection sock.connect(sa) OSError: [WinError 10049] The requested address is not valid in its context The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connectionpool.py", line 791, in urlopen response = self._make_request( File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connectionpool.py", line 497, in _make_request conn.request( File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connection.py", line 395, in request self.endheaders() File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\http\client.py", line 1281, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\http\client.py", line 1041, in _send_output self.send(msg) File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\http\client.py", line 979, in send self.connect() File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connection.py", line 243, in connect self.sock = self._new_conn() File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connection.py", line 218, in _new_conn raise NewConnectionError( urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x000002C8B47DE610>: Failed to establish a new connection: [WinError 10049] The requested address is not valid in its context The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\requests\adapters.py", line 486, in send resp = conn.urlopen( File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connectionpool.py", line 845, in urlopen retries = retries.increment( File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\util\retry.py", line 515, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='0.0.0.0', port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000002C8B47DE610>: Failed to establish a new connection: [WinError 10049] The requested address is not valid in its context')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\Z\AppData\Local\Programs\Python\Python311\requestapi.py", line 6, in <module> response = requests.post(url, files=files) File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\requests\api.py", line 115, in post return request("post", url, data=data, json=json, **kwargs) File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\requests\api.py", line 59, in request return session.request(method=method, url=url, **kwargs) File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\requests\sessions.py", line 589, in request resp = self.send(prep, **send_kwargs) File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\requests\sessions.py", line 703, in send r = adapter.send(request, **kwargs) File "C:\Users\Z\AppData\Local\Programs\Python\Python311\Lib\site-packages\requests\adapters.py", line 519, in send raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000002C8B47DE610>: Failed to establish a new connection: [WinError 10049] The requested address is not valid in its context')
解决方案
核心修复:修改请求地址
Windows系统中,0.0.0.0仅表示服务监听所有网卡,不能作为客户端请求的目标地址。将请求代码中的url改为以下任一地址即可:
# 方案1:使用localhost url = 'http://localhost:8000' # 方案2:使用本地回环IP url = 'http://127.0.0.1:8000'
额外排查项
- 确认容器状态:执行
docker ps查看容器是否处于Up状态,端口映射是否为0.0.0.0:8000->8000/tcp或:::8000->8000/tcp - 防火墙检查:确保Windows防火墙未阻止本地8000端口的入站/出站请求
- Docker Desktop配置:如果使用WSL2后端,确认Docker Desktop已启用WSL集成,也可尝试使用WSL分配的IP(通过
wsl hostname -I获取)作为请求地址
内容的提问来源于stack exchange,提问作者Beryl Amend
相关产品推荐
相关产品推荐

