【问题标题】:Webserver cannot connect to Redis via docker-composeWebserver 无法通过 docker-compose 连接到 Redis
【发布时间】:2020-06-03 16:22:54
【问题描述】:

我正在尝试通过同一网络上的网络服务器连接到 docker 网络上的 redis 实例。我的代码正在运行,我正在使用 我的 docker-compose.yml:

thor-redis:
    image: redis:5.0.7
    networks:
      - thorcast
    ports:
      - "6380:6379"
    volumes:
      - ./redis.conf:/usr/local/etc/redis.conf
    entrypoint: redis-server /usr/local/etc/redis.conf
thorcast-server:
    build: ../../thorcast-server
    volumes:
      - ../../thorcast-server:/app/thorcast-server
    networks:
      - thorcast
    ports:
      - "8000:8000"
    env_file:
      - ../../thorcast-server/env.list

env.list 文件的相关部分:

REDIS_HOST=thor-redis
REDIS_PORT=6380
REDIS_DB=0
REDIS_PASSWORD=redis_pass

我的应用中连接redis的代码是:

a.Redis = redis.NewClient(&redis.Options{
    Addr:       fmt.Sprintf("%s:%s", conf.redisHost, conf.redisPort),
    Password:   conf.redisPassword,
    DB:         conf.redisDb,
})

我填充 conf 的代码是:

type config struct {
    sqlUsername     string
    sqlPassword     string
    sqlHost         string
    sqlPort         string
    sqlDbName       string
    redisPassword   string
    redisHost       string
    redisPort       string
    redisDb         int
}
// method to initialize config struct from environment variables
func (conf *config) configure() {
    conf.sqlUsername = os.Getenv("THORCAST_DB_USERNAME")
    conf.sqlPassword = os.Getenv("THORCAST_DB_PASSWORD")
    conf.sqlHost = os.Getenv("THORCAST_DB_HOST")
    conf.sqlPort = os.Getenv("THORCAST_DB_PORT")
    conf.sqlDbName = os.Getenv("THORCAST_DB_NAME")
    conf.redisPassword = os.Getenv("REDIS_PASSWORD")
    conf.redisHost = os.Getenv("REDIS_HOST")
    conf.redisPort = os.Getenv("REDIS_PORT")
    conf.redisDb, _ = strconv.Atoi(os.Getenv("REDIS_DB"))
}
var conf = config{}

type App struct {
    Router *mux.Router
    Logger http.Handler
    DB     *sql.DB
    Redis  *redis.Client
}

在 redis.conf 文件中,没有指定绑定 IP,requirepass 设置为与 redis_pass 相同的值。此外,我在服务器上看到的错误是:

{"error":"dial tcp 172.21.0.5:6380: connect: connection refused"}

当我检查 redis 镜像时,我可以确认它有这个 IP 地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dev_thor- 
redis_1
172.21.0.5

当我尝试通过 redis-cli 连接本地计算机时,我可以毫无问题地访问服务器。我已经四处搜索以尝试找到类似的问题,但它们似乎都与试图通过 localhost 访问 redis 的人有关,我不想这样做。非常感谢任何帮助。

【问题讨论】:

  • ports: 不会影响容器间连接(并且不是必需的)。使用默认的 Redis 端口 6379。
  • @DavidMaze 感谢您告诉我。我应该提一下,我也有一个 Postgres 容器正在运行,转发 5436:5432,并且网络服务器通过暴露的端口连接到该数据库,所以我使用 redis 复制了该模式。
  • 你确定redis在你尝试连接的时候正在运行吗?
  • 是的,我可以在启动容器后从本地计算机连接到服务器。

标签: docker go redis go-redis


【解决方案1】:

您可能忘记从网络视角将您的应用与 redis 链接

    thor-redis:
        image: redis:5.0.7
        networks:
          - thorcast
        ports:
          - "6380:6379"
        volumes:
          - ./redis.conf:/usr/local/etc/redis.conf
        entrypoint: redis-server /usr/local/etc/redis.conf
    thorcast-server:
        build: ../../thorcast-server
        volumes:
          - ../../thorcast-server:/app/thorcast-server
        networks:
          - thorcast
        ports:
          - "8000:8000"
        env_file:
          - ../../thorcast-server/env.list
        links:          # <-- Add this
          - thor-redis  # <-- Add this

【讨论】:

  • 不需要。无论如何,它们都在同一个网络上。另外,链接声明很快就会被贬低
猜你喜欢
  • 2018-04-28
  • 2022-01-03
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2018-07-12
  • 2015-05-19
相关资源
最近更新 更多