2016-02-11 4 views
1

Я переместил приложение Rails (локальное dev-устройство) в Docker-Compose. Все работает, за исключением того, что экземпляр Worker Rails (пакетный) не может подключиться к Redis.Docker-compose - Redis at 0.0.0.0 вместо 127.0.0.1

Completed 500 Internal Server Error in 40ms (ActiveRecord: 2.3ms) 

Redis::CannotConnectError (Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)): 

В моей Докер-compose.yml

redis: 
    image: redis 
    ports: 
    - "6379:6379" 

batch: 
    build: . 
    command: bundle exec rake environment resque:work QUEUE=* 
    volumes: 
    - .:/app 
    links: 
    - db 
    - redis 
    environment: 
    - REDIS_URL=redis://redis:6379 

Я думаю, что экземпляр Redis доступен через IP хоста Докер.

$ docker-machine ls 
NAME  ACTIVE DRIVER  STATE  URL      SWARM DOCKER ERRORS 
default *  virtualbox Running tcp://192.168.99.100:2376   v1.10.0 

Доступ через 0.0.0.0 не работает

$ curl 0.0.0.0:6379 
curl: (7) Failed to connect to 0.0.0.0 port 6379: Connection refused 

Доступ через докер-машины IP я думаю работы:

$ curl http://192.168.99.100:6379 
-ERR wrong number of arguments for 'get' command 
-ERR unknown command 'Host:' 

EDIT

После установки redis-cli в экземпляре экземпляра, я смог попасть на сервер redis, используя имя «redis». Я думаю, что проблема, возможно, в самой конфигурации Rails.

+0

Эти варианты не помогают: Redis-сервер --bind 0.0.0.0 – ardochhigh

+1

Сначала вы не должны ожидать зависания или подключения к любому серверу через 0.0.0.0, поскольку это не то, как работает TCP. Этот адрес означает «any» и работает только при привязке не к подключению. Во-вторых, вы не хотите завивать Redis, потому что это не сервер http. –

+0

Спасибо Real Bill, так как я могу устранить эти проблемы с подключением, если не с завитом? Cheers – ardochhigh

ответ

1

Facepalm !!!

Контейнеры-докеры прекрасно общались, проблема была в том, что я не сказал Реске (приложение, использующее Redis), где его найти. Спасибо «Реальный Билл» за указание, что я должен использовать докер-кли.

Для тех, кто еще с помощью докер и Resque, вам нужно это в вашем конфигурации/инициализаторах/resque.rb файл:

Resque.redis = Redis.new(host: 'redis', port: 6379) 
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection } 
+0

Я делаю то же самое, что и @ardochhigh, но я использую mongodb как базу данных в отдельном контейнере, так что, пожалуйста, скажите мне, какая должна быть конфигурация для monogdb или mongoid. – codemilan

2

Если запустить

docker-compose run --rm batch env | grep REDIS 

вы получите окр переменные, которые ваш контейнер (ссылка линия в композе будет автоматически генерировать некоторые). Тогда все, что вам нужно сделать, это искать один по линиям _REDIS_1_PORT ... и использовать правильный. Мне никогда не удавалось связать мои рельсы с другим сервисом каким-либо другим способом. Но, к счастью, эти переменные env всегда генерируются при запуске, поэтому они будут обновлены, даже если IP-адрес контейнера изменится между стартапами.

+0

Эти переменные env устарели на некоторое время и удалены в Docker 1.10. Вы должны использовать имя хоста для подключения к другим контейнерам. – dnephin

+0

Они все еще были там, но не работали. – ardochhigh

2

Чтобы подключиться к службе, вы должны использовать имя хоста redis, хотя вам может понадобиться ждать redis для начала.

+0

Спасибо. Это что-то другое, чем в примере кода в исходном сообщении? – ardochhigh

+1

Переменная 'REDIS_URL' выглядит корректно, однако она не используется, потому что ошибка подключения говорит« 127.0.0.1 ». Я думаю, что приложение игнорирует эту переменную среды. – dnephin

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