提交Docker容器后服务无法访问的技术咨询
无法访问Docker容器服务的排查方案
先整理下你提供的容器状态和端口映射信息:
[root@kentuckianatradenew log]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19d7479f4f66 newsslcyclos "catalina.sh run" 12 minutes ago Up 12 minutes 0.0.0.0:80->80/tcp, 8080/tcp n2n33 88175386c0da cyclos/db "docker-entrypoint.s…" 26 hours ago Up 21 minutes 5432/tcp cyclos-db
docker port 19d7479f4f66 80/tcp -> 0.0.0.0:80
既然提交前服务正常,提交后无法访问,咱们从这几个方向逐一排查:
1. 先确认容器内部服务是否真的正常运行
容器显示Up不代表内部的Tomcat服务一定正常启动。可以做这两步:
- 查看容器日志找报错:
docker logs 19d7479f4f66,重点看有没有端口占用、配置文件错误,或者依赖的cyclos-db连接失败的信息。 - 进入容器内部测试:
docker exec -it 19d7479f4f66 bash,然后执行curl localhost:80或curl localhost:8080,如果内部都访问不了,那问题肯定出在容器里的服务本身(比如Tomcat启动失败)。
2. 检查主机防火墙/安全组规则
主机的防火墙可能拦截了80端口的外部请求:
- 可以临时关闭防火墙测试(比如CentOS系统执行
systemctl stop firewalld),如果能访问了,就给80端口添加永久放行规则:firewall-cmd --add-port=80/tcp --permanent,再执行firewall-cmd --reload生效。 - 如果是云服务器,还要检查云平台的安全组,确保80端口的入站规则是开放的。
3. 验证主机80端口是否被其他进程占用
虽然Docker显示映射了0.0.0.0:80,但可能主机上有其他服务(比如nginx、httpd)抢占了这个端口。执行netstat -tulpn | grep :80或ss -tulpn | grep :80查看端口占用情况:
- 如果有其他进程占用,要么停掉该进程,要么修改Docker的端口映射(比如改成
8081:80),然后重启容器:docker restart n2n33。
4. 检查应用容器与数据库的连接状态
你的应用依赖cyclos-db容器,虽然数据库容器显示Up,但可能应用连接数据库失败导致服务无法正常提供:
- 在应用容器内部ping数据库容器名:
docker exec -it 19d7479f4f66 ping cyclos-db,如果ping不通,说明两个容器不在同一个Docker网络里。 - 用
docker inspect n2n33 | grep Networks和docker inspect cyclos-db | grep Networks确认网络归属,若不在同一网络,执行docker network connect <数据库所在网络名> n2n33把应用容器连过去。
5. 排查提交容器时的配置变更
既然提交前正常,提交后出问题,回忆下提交时有没有修改过容器配置、镜像内容(比如修改Tomcat的server.xml、替换应用war包):
- 可以用
docker diff 19d7479f4f66查看容器内文件的变更记录,说不定是修改了某个配置导致服务启动异常。
先从这几个点入手排查,应该能定位到问题所在。
内容的提问来源于stack exchange,提问作者Muhammad Muazzam
相关产品推荐
相关产品推荐

