登录
首页 >  Golang >  Go问答

容器内连接被拒绝,TCP 服务器已启动

来源:stackoverflow

时间:2024-02-22 23:30:27 182浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《容器内连接被拒绝,TCP 服务器已启动》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我有一个 golang 应用程序,它在端口 8080 上启动 tcp 服务器。当我本机运行该应用程序时,一切正常。

但是,当我将其作为容器运行时,我什至无法从容器本身内部将 telnet 发送到端口。

docker ps 

9bb08785b728   dp_local   "/bin/dragonpit-linux"   8 seconds ago   up 7 seconds   8080-8081/tcp   youthful_villani
docker exec -it youthful_villani sh

/ # telnet localhost 8080
telnet: can't connect to remote host (127.0.0.1): connection refused

注意:使用 0.0.0.0 以及 127.0.0.1 代替 localhost

tcp服务器起始代码

var err error
        var lc net.listenconfig
        th.listener, err = lc.listen(ctx, "tcp", "0.0.0.0:8080")
        if err != nil {
            return err
        }
        clog.info(ctx, "tcp protocol listening", "listenaddr", th.addr)

我对地址进行了硬编码以查看问题所在。

我的 dockerfile

from golang:1.18.0 as builder
run mkdir -p /build/
add .   /build
workdir /build
run cgo_enabled=0 goos=linux go build -o tcp_server


from alpine:latest
expose 8080 8081
run mkdir -p /server/config
add config  /server/config/
env smc_path /
copy --from=builder /build/tcp_server /bin/
run apk update
run apk add busybox-extras 
entrypoint ["/bin/tcp_server"]

docker-inspect 的输出

"networksettings": {
            "bridge": "",
            "sandboxid": "a70f476a8a7376b1e5a935b67170145f2222e059c5b2a1a63da50519a491babf",
            "hairpinmode": false,
            "linklocalipv6address": "",
            "linklocalipv6prefixlen": 0,
            "ports": {
                "8080/tcp": null,
                "8081/tcp": null
            },
            "sandboxkey": "/var/run/docker/netns/a70f476a8a73",
            "secondaryipaddresses": null,
            "secondaryipv6addresses": null,
            "endpointid": "7b6b9d0d5f83b8136919ac0f765167f6d380a8d836f460a0243bedeb3489a013",
            "gateway": "172.17.0.1",
            "globalipv6address": "",
            "globalipv6prefixlen": 0,
            "ipaddress": "172.17.0.2",
            "ipprefixlen": 16,
            "ipv6gateway": "",
            "macaddress": "02:42:ac:11:00:02",
            "networks": {
                "bridge": {
                    "ipamconfig": null,
                    "links": null,
                    "aliases": null,
                    "networkid": "16563fdda1d5059bb6e2800455f2e87ac8d02e040386eae595a215692e849d76",
                    "endpointid": "7b6b9d0d5f83b8136919ac0f765167f6d380a8d836f460a0243bedeb3489a013",
                    "gateway": "172.17.0.1",
                    "ipaddress": "172.17.0.2",
                    "ipprefixlen": 16,
                    "ipv6gateway": "",
                    "globalipv6address": "",
                    "globalipv6prefixlen": 0,
                    "macaddress": "02:42:ac:11:00:02",
                    "driveropts": null
                }
            }
        }
    }

docker运行命令及启动日志

docker run dp_local  
                       
25t14:59:46.367075600z","caller":"build/main.go:24","msg":"starting listening","listenaddr":"0.0.0.0:8080"

编辑: 我刚刚打印出了tcp listeneraddr().string(),我得到了这个

{"level":"info","ts":"2022-04-25T15:44:28.952095700Z","caller":"server/tcp.go:65","msg":"[::]:8080"}

正确答案


在这里回答我的问题。这实际上是一个 TCP 参数设置不正确并导致问题。罪魁祸首是MTU。供参考:https://www.baeldung.com/cs/tcp-max-packet-size#:~:text=The%20maximum%20size%20of%20a,size%20should%20never%20exceed%20MTU

本篇关于《容器内连接被拒绝,TCP 服务器已启动》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>