【问题标题】:How to connect django to docker redis container?如何将 django 连接到 docker redis 容器?
【发布时间】:2016-03-19 22:09:40
【问题描述】:

我正在尝试将 django 连接到 docker redis 容器

这是我的 docker 文件

FROM        ubuntu:14.04
RUN         apt-get update && apt-get install -y redis-server
EXPOSE      6379
ENTRYPOINT  ["/usr/bin/redis-server"]

这是docker ps -a的结果

4f7eaeb2761b        /redis          "/usr/bin/redis-serve"   16 hours ago        Up 16 hours               6379/tcp            redis

这里是 redis 在 docker 容器内工作的快速健全性检查

 docker exec -ti redis bash

 root@4f7eaeb2761b:/# redis-cli ping
 PONG
 root@4f7eaeb2761b:/# redis-cli
 127.0.0.1:6379> exit

这是我的 Django settings.py

CACHES = {
    'default': {
        'BACKEND': 'redis_cache.RedisCache',
        'LOCATION': 'localhost:6379',
    },
}

这是我的看法

from django.shortcuts import render
from django.template import loader
from django.http import HttpResponse
from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def index(request):
    template = loader.get_template('./index.html')

    return HttpResponse(template.render())

这里是替代的redis访问

import redis

def index(request):
    r = redis.StrictRedis(host='localhost', port=6379, db=0)
    print r # this line doesn't cause error
    r.set('foo', 'bar') # this line cause error

    template = loader.get_template('./index.html')

    return HttpResponse(template.render())

我验证了没有 @cache_page 装饰器的情况下一切正常

当我使用装饰器时,我得到了

Error 61 connecting to localhost:6379. Connection refused.

除了设置Expose 端口外,我不知道如何公开 docker 容器,任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: python django docker redis


    【解决方案1】:

    这里要理解的是容器暴露端口!=系统暴露端口。

    用于 redis 的 Docker 容器正在从容器中暴露端口 6379 ——这与主机系统中的端口不同。

    假设您正在运行 docker:

    docker run -ti redis bash
    

    默认情况下,Docker 会在主机中随机选择一个端口来绑定到容器暴露的端口。您可以使用命令检查主机端口(如果没有暴露端口,则不会显示任何内容):

    docker port CONTAINER_ID
    

    相反,您需要像这样运行它:

    docker run -ti redis bash -p 6379:6379
    

    这告诉 Docker 将 6379 主机端口链接到 6379 容器端口。然后 docker port 会显示如下内容:

    $ docker port CONTAINER_ID
    6379/tcp -> 0.0.0.0:6379
    

    您也可以使用docker-compose.yml 文件进行配置。

    阅读更多:

    【讨论】:

    • 感谢您的回答,我收到了 1:C 20 Mar 01:27:11.320 # Fatal error, can't open config file 'bash' for `docker run -ti redis bash -p 6379:6379` 和 *** FATAL CONFIG FILE ERROR *** for docker run -ti redis /bin/bash -p 6379:6379 我可能错过了一些步骤,我也是当我使用docker port redis 时没有观察到任何东西但是我能够运行docker restart redis & docker exec -ti redis bash
    • 您收到该错误是因为入口点在Dockerfile 中设置为/usr/bin/redis-server,因此当您尝试使用bash 运行容器时,它实际上是在尝试运行/usr/bin/redis-server bash(它试图找到一个名为 bash 的文件作为 Redis 的配置文件)。您可以使用 CMD 代替 ENTRYPOINT,也可以使用 docker run -p 6379:6379 -ti --entrypoint=bash redis 覆盖 cmdline 中的入口点(参数顺序很重要)
    • 感谢您的回复,我现在的端口位于0.0.0.0:6379->6379/tcp,但我仍然无法连接到redis 服务器,我尝试将我的redis bind 0.0.0.0 绑定到./etc/redis/redis.conf 并启动@987654341 @ ,我验证它是由 ssh 启动到使用另一个终端 redis-cli ping ,但是 django 应用程序仍然无法连接到 redis
    • 感谢签到,所以我想我其实不用绑定端口,我发现我应该改用docker-machine的ip,你可以通过docker-machine ip default找到并将我的 redis 实例设置更改为 r = redis.StrictRedis(host='what_ever_docker_machine_ip_is', port=6379, db=0) ,但我必须使用您提供的命令设置端口 docker run -p 6379:6379 -ti --entrypoint=bash redis ,非常感谢您提供此服务
    • 太棒了,所以你正在使用 Docker Machine!我还没有尝试过。乐意效劳。 :)