【问题标题】:Can't connect to Redis from within a Docker container (Redis::CannotConnectError)无法从 Docker 容器内连接到 Redis (Redis::CannotConnectError)
【发布时间】:2017-09-26 22:34:36
【问题描述】:

我有一个 Jenkins 流水线,它在 Docker 容器内运行 Sinatra 应用程序的所有测试。

管道如下所示:

#!/usr/bin/env groovy

pipeline {

    agent {
        docker {
            image 'ruby'
            args '-u root -v /root/.ssh:/root/.ssh'
        }
    }

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'bundle install'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh 'rspec spec'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploy...'
                sh 'cap staging deploy'
            }
        }
    }
}

Sinatra 应用程序使用 Redis,我似乎无法从包含运行测试的 Docker 内连接到 Redis。 Redis 数据库在可访问的不同远程服务器上运行。

我正在使用redis-rb 和以下代码来访问 Redis:

REDIS_DB = Redis.new(url: 'redis://:strongpassword123@server_ip:6379')

但测试返回以下错误:

Redis::CannotConnectError:
       Error connecting to Redis on server_ip:6379 (Redis::TimeoutError)
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:344:in `rescue in establish_connection'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:329:in `establish_connection'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:99:in `block in connect'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:291:in `with_reconnect'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:98:in `connect'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:363:in `ensure_connected'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:219:in `block in process'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:304:in `logging'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:218:in `process'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:118:in `call'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:877:in `block in get'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:45:in `block in synchronize'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:45:in `synchronize'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:876:in `get'

我尝试过使用本地 Redis 服务器,但也没有用。

我做错了什么?

【问题讨论】:

  • 您是否在拥有自己的 DNS 的公司环境中?您可以在管道中尝试 ping 或 traceroute 以查看您是否能够访问该 IP 本身?

标签: ruby docker jenkins redis


【解决方案1】:

Docker 容器的 IP 地址为 172.17.0.2。由于我启用了 UFW(防火墙),我必须添加一个规则,允许 Docker 在端口 6379 上连接到 Redis。

所以sudo ufw allow from 172.17.0.2 to any port 6379 解决了这个问题。

【讨论】: