想来,对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的大部分命令都可以烂熟于心的,灵活的应用,在以后的工作中,会在团队内部,推动容器技术的应用。