2016-08-17 86 views
0

我試圖通過我的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 –

回答

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 
    

    更改入口點開始。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「]'? –

0

您需要訪問的主機本地主機迴環設備,所以你要做的就是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,那麼不需要做所有這些。只需在容器中安裝套接字文件即可。看到我答案中的第一點。 –

相關問題