未使用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
方法二:手动创建网络并启动两个容器
- 创建自定义Docker网络:
docker network create redis-net
- 启动Redis容器并加入该网络:
docker run -d --name redis --network redis-net redis:latest
- 构建并启动你的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
相关产品推荐
相关产品推荐

