想來,對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的大部分命令都可以爛熟於心的,靈活的應用,在以后的工作中,會在團隊內部,推動容器技術的應用。