【问题标题】:Docker-compose - Redis at 0.0.0.0 instead of 127.0.0.1Docker-compose - Redis 在 0.0.0.0 而不是 127.0.0.1
【发布时间】:2016-05-22 21:34:31
【问题描述】:

我已将我的 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)):

在我的 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

我认为 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

通过 0.0.0.0 访问不起作用

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

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

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

编辑

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

【问题讨论】:

  • 这些选项没有帮助:redis-server --bind 0.0.0.0
  • 首先你不应该期望通过 0.0.0.0 卷曲或连接到任何服务器,因为这不是 TCP 的工作方式。该地址表示“任何”,并且仅在绑定未连接时才有效。其次,您不想卷曲到 Redis,因为它不是 http 服务器。
  • 感谢 The Real Bill,如果不使用 curl,我将如何解决这些连接问题?干杯
  • 使用 redis-cli 或 telnet

标签: ruby-on-rails docker redis docker-compose


【解决方案1】:

捂脸!!!

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 }

【讨论】:

  • 我和@ardochhigh 做的一样,但是我在单独的容器中使用 mongodb 作为数据库,所以,请告诉我monogdb 或 mongoid 的配置应该是什么。跨度>
【解决方案2】:

如果你跑了

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

您将获得容器拥有的环境变量(compose 中的链接行将自动生成一些)。 然后,您需要做的就是沿着 _REDIS_1_PORT... 的行查找一个并使用正确的。我从来没有运气以任何其他方式将我的 Rails 连接到另一个服务。但幸运的是,这些环境变量总是在启动时生成,因此即使容器 IP 在启动之间发生变化,它们也会保持最新。

【讨论】:

  • 这些环境变量已经被弃用了一段时间,并在 Docker 1.10 中被删除。您应该使用主机名连接到其他容器。
【解决方案3】:

您应该使用主机名redis 连接到服务,尽管您可能需要等待redis 启动。

【讨论】:

  • 谢谢。这与原始帖子中的代码示例有什么不同吗?
  • REDIS_URL 变量看起来正确,但它似乎没有被使用,因为连接错误显示127.0.0.1。我认为应用程序忽略了该环境变量。
猜你喜欢
  • 2015-05-20
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 2019-01-11
  • 2016-04-16
  • 2021-07-09
相关资源
最近更新 更多