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了,很好很开心!