Docker部署Flask应用启动后无法访问连接问题求助
问题根因
你的配置存在3个核心错误,导致容器内服务无法被正常访问:
- 未做端口映射:Dockerfile中的
EXPOSE 5000仅为端口声明,不会自动将容器端口转发到宿主机,启动时不指定映射规则的话,宿主机网络无法触达容器内的5000端口。 - CMD指令写法错误:当前
CMD ["python", "./simpleflask.py", "./main.py"]的写法,会把./main.py作为命令行参数传入simpleflask.py,Python解释器只会执行第一个脚本,不会自动运行第二个文件。且容器主进程应为Flask Web服务,测试脚本不应和服务启动命令绑定。 - 客户端请求地址错误:
0.0.0.0是服务端绑定的监听地址,不能作为客户端的请求目标地址,本地访问时应使用127.0.0.1。
修复方案
按以下步骤调整配置即可正常访问:
- 修正Dockerfile,建议使用绝对路径设置工作目录,启动命令仅保留Flask服务启动逻辑,修正后内容如下:
FROM python:3.8 WORKDIR /app COPY . /app RUN pip install --upgrade pip RUN pip install -r requirements.txt EXPOSE 5000 CMD ["python", "simpleflask.py"] - 重新构建镜像,在项目根目录执行命令:
docker build -t simple-flask:v1 . - 启动容器时添加端口映射参数,将容器5000端口映射到宿主机5000端口:
docker run -d -p 5000:5000 simple-flask:v1 - (可选)如果需要在宿主机运行
main.py测试接口,修改文件内的请求地址:import requests # 把0.0.0.0替换为本地回环地址127.0.0.1 url = 'http://127.0.0.1:5000/' myobj = {'number': 22} mysecobj = {'number': 11} data = requests.post(url, json=(myobj, mysecobj)) print(data.text)
完成以上操作后,浏览器访问http://127.0.0.1:5000即可看到接口返回,执行python main.py也能正常拿到求和结果。
补充:如果需要容器启动后自动执行测试脚本,不要直接把两个py文件传给Python解释器,可以编写简单的shell启动脚本,先启动Flask服务等待端口就绪后再执行请求逻辑,常规使用场景下容器保持Web服务作为主进程常驻即可。
内容的提问来源于stack exchange,提问作者user19215134
相关产品推荐
相关产品推荐

