2014-11-06 5 views
3

Запуск окон 7 с бродячим 1.6.5 и виртуальным ящиком. У меня есть два докерных контейнера; - nodejs - redisЭкспозиция контейнера докеров-контейнеров Redis DB в контейнер докеров NodeJS

Часть моего решения работает и работает! Nodejs приложение, когда я запускаю его вне VM можно подключить к контейнеру Redis на порту 6379. Когда я бегу же приложения внутри nodejs Docker контейнер, я получаю следующее исключение:

Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 

Я могу повторить исключение на внешний проект, остановив контейнер redis, чтобы проблема выглядела как связанная с тем, как контейнеры связаны/привязаны к внутренним портам виртуальной машины.

Контейнеры запускаются следующим образом;

$ 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.

Образец файла dockerfile nodejs;

# 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 

J

ответ

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

Смежные вопросы