李朝强的博客

人之为学,如饮河海,大饮则大盈,小饮则小颖!
posts - 35, comments - 144, trackbacks - 0, articles - 2
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Docker: connection reset by peer

Posted on 2018-09-12 14:21 李朝强 阅读(...) 评论(...) 编辑 收藏

想来,对docker的学习和实践,已经一年有余了,而我关于这样的文章,只有为数不多的几篇。今天借使用docker中发生的一种异常情况为例,写此篇幅。

这个是在centos7.0 、.netcore2.1的环境基础上进行的。这里没有使用dockerfile配置文件的形式,而是直接采用docker命令的形式。

镜像采用的是docker.io/microsoft/dotnet 。

然后运行镜像

docker run -d  --privileged=true  -v /app:/app -p 5000:5000  bde01d9ed6eb dotnet /app/WebApplication1.dll

这样,运行其镜像,理论上是可以的,但是curl访问的时候,就出现了标题所示的问题。

首先通过docker exec命令,在运行的容器中,执行curl请求,访问http://localhost:5000端口,返回结果正常,在当前主机上访问,就会出现connection reset by peer的问题,查看主机正在监听的端口

[root@localhost ~]# netstat -ant|grep 5000
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN
tcp6       0      0 ::1:5000                :::*                    LISTEN

可以看到,正在监听,telnet拨号也是连通的状态,

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c9a97ffc6cc2        bde01d9ed6eb        "dotnet /app/WebAp..."   3 hours ago         Up 3 hours                              xenodochial_jang

容器正在运行,为此,又在docker run执行容器的时候,加上 expose参数,暴露端口,expose=5000,指定了容器暴露的端口,这下应该没问题了吧,可结果依然如题!

想必是网络问题,诸如防火墙、端口映射之类的问题,也想过修改防火墙设置,由于嫌操作麻烦,就未做尝试。

百度,必应一下:结果令人失望,又是镜像问题,又是防火墙问题,都无法解决该问题。

思前想后,不要把问题复杂化了,切换网络吧,docker run的--net命令

docker run -d --net="host"  --privileged=true -v /app:/app -p 5000:5000 bde01d9ed6eb dotnet /app/WebApplication1.dll

这样容器启动后,访问测试:

curl http://localhost:5000

  

当然,这个过程中,还出现了类似权限之类的问题,导致应用无法启动,在此篇中,不再赘述。

具体问题还是具体分析,同一个错误,可能触发问题的原因不尽相同,这就需要我们辩证的去思考,根据自身应用的情况,进行尝试。经过这一段时间的学习,多余docker的理论和实践等方面,有了不少的心得,对应docker的大部分命令都可以烂熟于心的,灵活的应用,在以后的工作中,会在团队内部,推动容器技术的应用。