You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未使用Docker Compose启动Redis容器时出现连接拒绝错误求助

问题根源与解决方案

核心问题:你的容器里根本没运行Redis服务

你编写的Dockerfile是用来构建自己的Go应用的多阶段镜像,最终生成的容器里只有你的main二进制程序,没有Redis服务器进程。容器启动后,只有你的Go代码在尝试连接Redis,但容器内根本没有Redis在监听6379端口,自然会出现连接拒绝。

为什么改redis:6379也没用?

redis:6379这个地址是用来在Docker网络中访问名为redis的容器,但你目前只启动了自己的Go应用容器,并没有启动Redis容器,也没有把两个容器放在同一个Docker网络中,所以这个域名根本解析不到任何服务。


正确的解决办法

方法一:用Docker Compose管理多容器(推荐)

创建docker-compose.yml文件,同时定义Go应用和Redis服务,让它们自动处于同一网络:

version: '3.8'
services:
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
  my-go-app:
    build: .
    depends_on:
      - redis
    environment:
      - REDIS_ADDR=redis:6379

修改Go代码里的Redis地址为redis:6379(或通过环境变量读取更灵活):

import "os"

// ...

s.Client = redis.NewClient(&redis.Options{
    Addr:     os.Getenv("REDIS_ADDR"), // 或者直接写"redis:6379"
    Password: "",
    DB:       0,
})

最后执行命令启动:

docker-compose up --build

方法二:手动创建网络并启动两个容器

  1. 创建自定义Docker网络:
docker network create redis-net
  1. 启动Redis容器并加入该网络:
docker run -d --name redis --network redis-net redis:latest
  1. 构建并启动你的Go应用容器,同样加入该网络:
docker build -t my-go-app .
docker run -dp 8080:8080 --network redis-net my-go-app

此时Go代码里的Redis地址改为redis:6379即可正常连接。

方法三:在Go镜像中安装Redis(不推荐)

这种方式违背容器"单进程"设计原则,仅适合临时测试:
修改你的Dockerfile,在最终阶段安装并启动Redis:

FROM alpine:latest
RUN apk --no-cache add ca-certificates redis
WORKDIR /root/
COPY --from=builder /app/main .
# 用脚本管理多进程
COPY start.sh .
RUN chmod +x start.sh
EXPOSE 6379
CMD ["./start.sh"]

start.sh内容:

#!/bin/sh
redis-server --daemonize yes
./main

额外提醒

你之前把自己的应用镜像命名为redis,很容易和官方Redis镜像混淆,建议改名成my-go-app这类明确的名称,避免后续操作出错。

内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:30:54