Docker Flask Redis
flask与redis各一个container
但是flask无法通过宿主机ip:[redis port]的方式连接
基础环境情况
- vue-nginx 80
- odin-flask 8888
- redis-server 6379
8888端口的服务会调用redis:
class UvView(MethodView):
@staticmethod
def post():
"""
http://101.160.182.183:8888/uv
:param:
:return:
"""
body = request.json
redis_key = body["uname"]
rp = RedisPy(host="101.160.182.183", port="6379")
rp.uv_redis("uv", redis_key)
uv_dict = {
"code": 20000,
"data": rp.h_get()
}
return jsonify(uv_dict)
但是前端报500,8888端口的flask日志记录如下:
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.7/site-
*
*
*
in connect
raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 113 connecting to 101.160.182.183:6379. No route to host.
我瞬间爆炸,因为在此之前,我的redis方法经过了下列方式的调用,均成功查询:
1、本地redis-cli => 本地docker redis server
2、本地redis-cli => 线上docker redis server
3、本地django/flask-redis => 线上docker redis server
可是偏偏就是线上flask-redis => 线上docker redis server报错。
我查了stackflow和百度,基本没有人问这个问题!
于是我转战搜索关键词docker network、docker link、redis.conf的bind、docker redis的rebuild,
包括在当前宿主机另起一个默认的redis docker,最后进去起redis-cli直接登录服务,终于发现我通过宿主机的内网地址就是无法访问到这台机器的6379端口 —>
可是docker0的内网地址<172.17.0.4>就可以
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis
172.17.0.4
可是我总不可能在代码里写这个地址啊!docker container重启的话,肯定有变动的风险啊!!!
于是我觉得可能和防火墙有关
功夫不负有心人,我发现有个防火墙的配置文件
vim /etc/firewalld/zones/public.xml
我将它改为
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ftp"/>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<port protocol="tcp" port="80"/>
<port protocol="tcp" port="8080"/>
<port protocol="tcp" port="6379"/>
</zone>
- 最后这行是我新加的
之后重启防火墙systemctl restart firewalld
此时在新起的docker-redis中用redis-cli -h 101.160.182.183 -p 6379 -a xxx
,就成功了!!!
之后我重新改了服务端代码,重新部署,刷新页面,我要的数据就有了。
从此我就不用再纠结后端代码的不稳定host了,很好很开心!
也可以试试这个 https://www.v2ex.com/t/503358
firewall-cmd --permanent --add-port=6379/tcp firewall-cmd --reload
还有这个
docker run -d --name nginx --network host nginx
这么起container,用宿主机ip加端口访问容器内的服务了
https://www.jianshu.com/p/1dd65ab5b997