从docker conatiner访问Host redis数据库

时间:2016-08-17 04:11:46

标签: python database docker redis

我正在尝试通过我的docker conatiner连接到主机redis数据库。

在我的dockerfile中,我将redis作为一项要求,安装[pip install redis]并使用该docker文件构建映像。 之后,我使用以下命令

实例化conatiner
sudo docker run -p 6543:6543 your_image_name

我的app.py正在关注

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
import redis

def hello(request):
    ds_id = '4000'
    r_server = redis.Redis(unix_socket_path='/tmp/redis.sock')
    result = r_server.set('foo','11')
    return Response(result)

问题是当Redis安装在开头时,没有生成redis.sock文件,因此在我尝试连接时会产生错误。

Dockerfile:

FROM     centos:latest
MAINTAINER Ramana Rao <treerao@gmail.com>

# load base packages w/ yum
RUN yum install -y git gcc libffi-devel openssl-devel python-devel postgresql-devel libxml2-devel libxslt-devel
COPY ./requirements.txt .

RUN curl https://bootstrap.pypa.io/get-pip.py >get-pip.py && \
    python get-pip.py && \
    rm get-pip.py &&\
    pip install -r requirements.txt

EXPOSE 6543

WORKDIR /app

COPY app /app

ENTRYPOINT [ "python" ]

CMD [ "app.py" ]

要求

pyramid
cornice
pyramid_chameleon
pyramid_beaker
pyramid_redis_sessions
pyRFC3339
oauthlib==0.7.2
oauth2client==1.5.2
pycrypto
PyOpenSSL
pymongo
SQLAlchemy
psycopg2
lxml
gspread
jira
waitress
paste
PasteDeploy
redis

是否有其他方法可以连接到主机redis数据。

2 个答案:

答案 0 :(得分:0)

  1. 如果您在主机上运行了redis实例并且只想让容器连接到该redis实例,那么您只需将套接字文件挂载到容器中即可。例如,如果主机上的套接字文件的位置是/var/run/redis/redis.sock,并且您希望容器内的套接字文件的位置为/tmp/redis.sock,则启动容器,如下所示:

    sudo docker run \
        -p 6543:6543 \
        -v  /var/run/redis/redis.sock:/tmp/redis.sock \
        your_image_name app.py
    
  2. 如果你想在容器中设置redis并运行python应用程序,请按照:

    使用以下内容创建文件start.sh

    #!/bin/bash
    /usr/bin/redis-server >/dev/null 2>&1 &
    /usr/bin/python $1
    

    对文件app.py进行以下修改:

    r_server = redis.StrictRedis(host='localhost', port=6379, db=0)
    

    对Dockerfile进行以下修改:

    添加包epel-release

    RUN yum install -y git gcc libffi-devel openssl-devel python-devel postgresql-devel libxml2-devel libxslt-devel
    

    EPEL释放

    安装redis

    RUN yum install -y redis
    

    将上面创建的脚本复制到/app目录:

    COPY start.sh /app
    RUN chmod +x /app/start.sh
    

    将入口点更改为start.sh

    ENTRYPOINT [ "/app/start.sh" ]
    

答案 1 :(得分:0)

您需要访问主机localhost loopback设备,因此您所做的是https://gist.github.com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c#file-gistfile1-txt

您可以在

创建此文件
  • /Library/LaunchDaemons/docker.loopback.alias.plist
  • sudo chown root:staff /Library/LaunchDaemons/docker.loopback.alias.plist
你是OSX的。然后重新启动mac,之后,您可以使用容器内部的ip 10.254.254.254 访问主机环回设备,因此您可以从容器中配置redist以连接到{ {1}} - 然后将使用您的osx-host redis

理论值: 你需要创建这个环回别名,因为你不能在容器中使用10.254.254.254:6543,因为这会选择容器本身的环回设备 - 他自己的环回设备 - 而不是环回设备您的主人