Docker连接localhost:5000被拒绝问题解决(Deepin系统迁移后)
问题描述
我的应用在Ubuntu系统中基于以下Docker配置可正常运行:
FROM golang:1.19beta1-alpine3.15 ENV CGO_ENABLED=0 ENV PORT=5000 ENV HOST=wizdwarfs RUN mkdir /app ADD . /app WORKDIR /app ARG WIZ_DIR=/app_data RUN mkdir -p ${WIZ_DIR} ENV WIZ_VOLUME_DIR=/app${WIZ_DIR}/apps.txt COPY go.mod go.sum ./ RUN go mod tidy RUN go mod download RUN go build -o wizdwarfs RUN go test ./... EXPOSE 5000 VOLUME [ ${WIZ_DIR} ] RUN apk --no-cache add ca-certificates LABEL designed="Wisdom-Enigma Inc" CMD ["/app/wizdwarfs"]
启动命令为:
docker run --rm -hostname=wizdwarfs -p 127.0.0.1:5000:5000 -v /app/app_data --net=host -it wizdwarfs/wizdwarfs-v0.0.2
更换为Deepin Linux系统后,出现Docker连接localhost:5000被拒绝的错误,求解决方法。
解决方法
修复启动命令的参数冲突
启动命令中同时使用-p 127.0.0.1:5000:5000和--net=host会导致冲突:使用--net=host时,容器直接复用宿主机网络,端口映射参数-p会被忽略。加上你的应用绑定了HOST=wizdwarfs,可能导致服务仅监听容器内部的对应IP,而非宿主机可访问的地址。两种调整方式:
- 移除
--net=host参数,保留端口映射:docker run --rm -hostname=wizdwarfs -p 127.0.0.1:5000:5000 -v /app/app_data:/app_data -it wizdwarfs/wizdwarfs-v0.0.2 - 修改Dockerfile中的
ENV HOST=0.0.0.0,让服务绑定所有可用IP,重新构建镜像后再使用--net=host启动。
- 移除
检查Deepin系统的网络与防火墙设置
- 查看容器实际IP,尝试直接访问该IP的5000端口验证服务状态:
docker inspect $(docker ps -qf "name=wizdwarfs") | grep "IPAddress" - 检查宿主机防火墙是否拦截了5000端口:
若防火墙开启,添加端口允许规则:sudo ufw statussudo ufw allow 5000/tcp
- 查看容器实际IP,尝试直接访问该IP的5000端口验证服务状态:
验证容器内服务状态
- 进入容器内部,检查服务是否正常绑定5000端口:
docker exec -it $(docker ps -qf "name=wizdwarfs") /bin/sh # 若容器无netstat,先安装工具:apk add net-tools netstat -tulpn | grep 5000 - 查看应用启动日志,排查是否有启动报错:
docker logs $(docker ps -qf "name=wizdwarfs")
- 进入容器内部,检查服务是否正常绑定5000端口:
修正卷挂载格式
原启动命令中的-v /app/app_data未指定容器内挂载点,会导致Docker自动创建匿名卷,无法正确映射到应用需要的/app_data路径。修改为完整挂载格式:docker run --rm -hostname=wizdwarfs -p 127.0.0.1:5000:5000 -v /app/app_data:/app_data -it wizdwarfs/wizdwarfs-v0.0.2错误的挂载可能导致应用找不到必要文件,间接引发服务启动失败、端口无法访问的问题。
内容的提问来源于stack exchange,提问作者Ali Hassan
相关产品推荐
相关产品推荐

