从Docker容器访问主机redis数据库

从Docker容器访问主机redis数据库

问题描述:

我试图通过我的docker容器连接到主机redis数据库。从Docker容器访问主机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.sock文件的Redis不会产生,从而创造错误当我尝试连接时。

Dockerfile:

FROM  centos:latest 
MAINTAINER Ramana Rao <[email protected]> 

# 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的数据。

+0

向我们显示您的Dockerfile。看来redis服务器还没有运行。 –

+0

我在问题中添加了我的docker文件 – Ishita

+0

在运行python应用程序之前,您尚未安装redis服务器并启动它。请参阅:http://stackoverflow.com/q/31660691/1005215 –

  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 
    

    更改入口点开始。SH

    ENTRYPOINT [ "/app/start.sh" ] 
    
+0

所以我做了更改,创建映像并试图在端口6543上运行docker容器。但是,当我到localhost:6543时,它说无法连接。我正在使用命令sudo docker run -p 6543:6543 image_name app.py – Ishita

+0

当我检查容器列表时,我得到Exited(0)31秒前我的容器状态@NehalJWani – Ishita

+0

@Ishita您是否删除了'CMD [ app.py“]'? –

您需要访问的主机本地主机回环设备,所以你要做的就是https://gist.github.com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c#file-gistfile1-txt

您在

  • /Library/LaunchDaemons/docker.loopback.alias.plist
  • ​​
创建这个文件

你OSX。然后,您重新启动您的mac,然后您可以使用容器中的ip 10.254.254.254访问主机回送设备,因此,现在您可以从容器配置redist以连接到10.254.254.254:6543 - 然后使用您的osx-host Redis的

理论: 您需要创建这个回环别名,因为你不能在容器中使用localhost,因为这会拿起容器本身的回环设备 - 他自己的回环设备 - 不是回环设备您的主机

+0

如果你使用unixsocket,那么不需要做所有这些。只需在容器中安装套接字文件即可。看到我答案中的第一点。 –