Docker-compose-Redis在0.0.0.0而不是127.0.0.1

ard*_*igh 5 ruby-on-rails redis docker docker-compose

我已经将Rails应用程序(本地开发机)迁移到Docker-Compose。除Worker Rails实例(批次)无法连接到Redis之外,其他所有组件都在工作。

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

Redis::CannotConnectError (Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)):
Run Code Online (Sandbox Code Playgroud)

在我的docker-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
Run Code Online (Sandbox Code Playgroud)

我认为Redis实例可通过Docker主机的IP获得。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                       SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.10.0
Run Code Online (Sandbox Code Playgroud)

通过0.0.0.0访问不起作用

$ curl 0.0.0.0:6379 
curl: (7) Failed to connect to 0.0.0.0 port 6379: Connection refused
Run Code Online (Sandbox Code Playgroud)

我认为可以通过docker-machine IP访问:

$ curl http://192.168.99.100:6379
-ERR wrong number of arguments for 'get' command
-ERR unknown command 'Host:'
Run Code Online (Sandbox Code Playgroud)

编辑

在批处理实例中安装redis-cli之后,我能够使用“ redis”主机名访问redis服务器。我认为问题可能出在Rails配置本身中。

ard*_*igh 5

脸掌!!!

docker 容器通信正常,问题是我没有告诉 Resque(使用 Redis 的应用程序)在哪里可以找到它。感谢“The Real Bill”指出我应该使用 docker-cli。

对于使用 Docker 和 Resque 的其他人,您需要在config/initializers/resque.rb文件中添加:

Resque.redis = Redis.new(host: 'redis', port: 6379)
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }
Run Code Online (Sandbox Code Playgroud)