如何将django连接到docker redis容器?

Kev*_*vin 7 python django redis docker

我正在尝试将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"]
Run Code Online (Sandbox Code Playgroud)

这是结果 docker ps -a

4f7eaeb2761b        /redis          "/usr/bin/redis-serve"   16 hours ago        Up 16 hours               6379/tcp            redis
Run Code Online (Sandbox Code Playgroud)

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

 docker exec -ti redis bash

 root@4f7eaeb2761b:/# redis-cli ping
 PONG
 root@4f7eaeb2761b:/# redis-cli
 127.0.0.1:6379> exit
Run Code Online (Sandbox Code Playgroud)

这是我的Django settings.py

CACHES = {
    'default': {
        'BACKEND': 'redis_cache.RedisCache',
        'LOCATION': 'localhost:6379',
    },
}
Run Code Online (Sandbox Code Playgroud)

这是我的看法

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())
Run Code Online (Sandbox Code Playgroud)

这是替代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())
Run Code Online (Sandbox Code Playgroud)

我确认一切都没有@cache_page装饰器

当我使用装饰我得到

Error 61 connecting to localhost:6379. Connection refused.
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Eli*_*les 4

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

Redis 的 Docker 容器从容器中公开端口 6379——这与主机系统中的端口不同。

假设你正在运行 docker:

docker run -ti redis bash
Run Code Online (Sandbox Code Playgroud)

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

docker port CONTAINER_ID
Run Code Online (Sandbox Code Playgroud)

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

docker run -ti redis bash -p 6379:6379
Run Code Online (Sandbox Code Playgroud)

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

$ docker port CONTAINER_ID
6379/tcp -> 0.0.0.0:6379
Run Code Online (Sandbox Code Playgroud)

您还可以使用docker-compose.yml文件来配置它。

阅读更多:

  • 啊太酷了,所以你正在使用 Docker Machine!我还没有尝试过。乐意效劳。:) (2认同)