转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
事故背景:
有小伙伴要部署一套sonar,使用docker-compose部署,在运行了启动命令之后,发现服务没有起来,容器处于exit状态。
原因分析:
1. 查容器日志
docker logs查看未启动的sonar容器日志,发现没有起来的是里面的es服务,在容器刚刚运行不久,日志就开始报错了,关键信息:
Caused by: java.util.concurrent.ExecutionException: org.apache.http.ProtocolException: Not: a valid protocol version: This is not a HTTP port
问题肯定出在es服务的端口上。
2. 查内部服务日志
因容器内部的服务日志已经挂载到了本地,于是查找es服务相关日志,发现了一行关键信息:
Caused by: java.net.BindException: Address already in use
这是端口冲突了。但小伙伴说自己yaml的端口是特意避开了主机上已有的端口,照理说不会产生端口冲突的。
3. 查yaml文件
查看小伙伴使用的yaml文件,发现了关键信息:
-
yaml文件设置了network_mode: host
-
yaml文件还设置了端口挂载9200:9201
真相大白:
yaml文件是从另一台机器上copy过来的,小伙伴只注意到了主机上已经有了一个9200端口,他将9200端口映射到了主机上的9201。但没注意到yaml中设置了network_mode: host,容器使用了主机模式。因此在启动sonar的时候,容器里面的9200端口在主机上会启动,于是和已经占用的9200端口产生了冲突。
解决方案:
注释掉yaml文件中的network_mode: host,重新部署即可。
博主相关文章:
升级Elasticsearch到8.7.1版本,我给自己挖了很多坑......