Docker-compose - Redis 位于 0.0.0.0 而不是 127.0.0.1
Docker-compose - Redis at 0.0.0.0 instead of 127.0.0.1
我已将我的 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
我认为可以通过 Docker 主机的 IP 访问 Redis 实例。
$ 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-机器 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 配置本身。
如果你运行
docker-compose run --rm batch env | grep REDIS
您将获得您的容器具有的环境变量(撰写中的 link 行将自动生成一些)。
然后,您需要做的就是按照 _REDIS_1_PORT... 查找一个并使用正确的那个。我从来没有以任何其他方式将我的 rails 连接到另一项服务。但幸运的是,这些 env 变量总是在启动时生成,因此即使容器 IP 恰好在启动之间发生变化,它们也会是最新的。
您应该使用主机名 redis
连接到该服务,尽管您可能需要等待 redis 启动。
捂脸!!!
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 }
我已将我的 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
我认为可以通过 Docker 主机的 IP 访问 Redis 实例。
$ 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-机器 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 配置本身。
如果你运行
docker-compose run --rm batch env | grep REDIS
您将获得您的容器具有的环境变量(撰写中的 link 行将自动生成一些)。 然后,您需要做的就是按照 _REDIS_1_PORT... 查找一个并使用正确的那个。我从来没有以任何其他方式将我的 rails 连接到另一项服务。但幸运的是,这些 env 变量总是在启动时生成,因此即使容器 IP 恰好在启动之间发生变化,它们也会是最新的。
您应该使用主机名 redis
连接到该服务,尽管您可能需要等待 redis 启动。
捂脸!!!
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 }