非容器化Nginx转发请求至Docker容器内应用失败问题排查咨询
错误根本原因
你的Sanic应用在容器内绑定的是容器本地回环地址127.0.0.1,这个地址仅能被容器内部进程访问,Docker端口映射无法将宿主机的请求转发到绑定回环地址的服务上。当你加--network=host参数时,容器共享宿主机网络栈,此时127.0.0.1就是宿主机的回环地址,所以能正常访问。
修复步骤
1. 修改Sanic服务绑定地址
打开yoomoney_payment_form/config.py,将HOST的值从127.0.0.1改为0.0.0.0,绑定容器内所有网卡地址,允许容器外的请求访问服务。
也可以直接修改__main__.py的启动代码:
app.run(host="0.0.0.0", port=PORT)
2. 重新构建Docker镜像
修改代码后重新执行镜像构建命令:
sudo docker build -t hello .
3. 重启容器
停止原有容器后用原启动命令重新运行即可:
# 先停止原有容器,替换<容器ID>为你的实际运行容器ID sudo docker stop <容器ID> # 重新启动新容器 sudo docker run -d -p 7772:7772 -v "$(pwd)"/db.sqlite3:/app/db.sqlite3 -v "$(pwd)"/config.ini:/app/config.ini hello
验证
启动完成后在宿主机执行curl http://127.0.0.1:7772/payment_form/1,返回Success字符串就说明配置生效,Nginx转发也会恢复正常。
内容的提问来源于stack exchange,提问作者George Imedashvili
相关产品推荐
相关产品推荐

