2014-11-06 151 views
3

運行帶有vagrant 1.6.5和虛擬框的Windows 7。我有兩個碼頭集裝箱; - nodejs - redis將Redis DB泊塢窗容器暴露給NodeJS泊塢窗容器

我的部分解決方案正在運行並正在運行!該應用程序的NodeJS當我運行的VM外部可以連接到Redis的容器上的端口6379.當我運行的泊塢窗的NodeJS容器出現以下異常中相同的應用程序:

Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 

我可以複製的例外通過停止redis容器來執行外部項目,所以問題看起來像與容器在VM上的內部端口上的鏈接/綁定有關。

容器啓動如下:

$ docker run -d -p 6379:6379 --name redis myproject/redis 
$ docker run --rm -it -P -p 9090:9090 --name node --link redis:rs myproject/node 

第二個命令允許我運行和刪除圖像,以便驗證和調試問題。從我的理解容器之間的聯繫是正確的!

我想刪除主機端口6379,所以你只能擊中9090端口,這將暴露Redis功能。

Sample nodejs dockerfile;

# DOCKER-VERSION 0.10.0 

FROM ubuntu 
RUN env 
# make sure apt is up to date 
RUN apt-get update 

# install nodejs and npm 
RUN apt-get install -y nodejs npm git git-core 
RUN PATH=/usr/bin/node:$PATH 

# Bundle app source 
ADD src /opt/app/ 

# use changes to package.json to force Docker not to use the cache 
# when we change our application's nodejs dependencies: 
ADD src/package.json /tmp/package.json 
RUN cd /tmp && npm install 
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/ 
RUN cp -a /tmp/node_modules /opt/app/redis 

EXPOSE 9090 
CMD ["nodejs", "/opt/app/redis/server.js"]` 

Any help is appreciated. 

樣品的Redis dockerfile

# Pull base image. 
FROM dockerfile/ubuntu 

# Install Redis. 
RUN \ 
    cd /tmp && \ 
    wget http://download.redis.io/redis-stable.tar.gz && \ 
    tar xvzf redis-stable.tar.gz && \ 
    cd redis-stable && \ 
    make && \ 
    make install && \ 
    cp -f src/redis-sentinel /usr/local/bin && \ 
    mkdir -p /etc/redis && \ 
    cp -f *.conf /etc/redis && \ 
    rm -rf /tmp/redis-stable* && \ 
    sed -i 's/^\(bind .*\)$/# \1/' /etc/redis/redis.conf && \ 
    sed -i 's/^\(daemonize .*\)$/# \1/' /etc/redis/redis.conf && \ 
    sed -i 's/^\(dir .*\)$/# \1\ndir \/data/' /etc/redis/redis.conf && \ 
    sed -i 's/^\(logfile .*\)$/# \1/' /etc/redis/redis.conf 

# Define mountable directories. 
VOLUME ["/data"] 

# Define working directory. 
WORKDIR /data 

# Define default command. 
ENTRYPOINT ["redis-server"] 

# Define default command. 
#CMD ["redis-server", "/etc/redis/redis.conf"] 

# Expose ports locally on VM 
EXPOSE 6379 

Ĵ

回答

3

實測溶液!!!

我更新了我的JS文件,內容如下:

var redisHost = process.env.REDIS_PORT_6379_TCP_ADDR; 
var redisPort = process.env.REDIS_PORT_6379_TCP_PORT; 
console.log('Settings ' + redisHost + ' ' + redisPort); 
var http = require("http"), server, redis_client = require("redis").createClient(redisPort, redisHost); 

這些環境變量是基於連接的容器即運行下面的命令時所使用的別名配置;

docker run --rm -it -P -p 9090:9090 --name node --link redis:redis sapvagrant/node env 

會產生以下輸出;

TERM=xterm 
REDIS_PORT=tcp://172.17.0.38:6379 
REDIS_PORT_6379_TCP=tcp://172.17.0.38:6379 
REDIS_PORT_6379_TCP_ADDR=172.17.0.38 
REDIS_PORT_6379_TCP_PORT=6379 
REDIS_PORT_6379_TCP_PROTO=tcp 
REDIS_NAME=/node/redis 
HOME=/root 

請告訴我這裏重要的是在鏈接中使用別名redis的:Redis的,如果我是來調用這個重命名爲的Redis:RS那麼環境會;

RS_PORT=tcp://172.17.0.38:6379 
RS_PORT_6379_TCP=tcp://172.17.0.38:6379 
RS_PORT_6379_TCP_ADDR=172.17.0.38 
RS_PORT_6379_TCP_PORT=6379 
RS_PORT_6379_TCP_PROTO=tcp 
RS_NAME=/node/redis 

現在,當我運行容器的NodeJS是能夠結合Redis的數據庫和Im能夠暴露端口9090將顯示一些數據庫功能,但端口6379不暴露。

示例項目可在; https://github.com/longieirl/docker-redis-nodejs

快樂的日子。

J