Docker化Java应用无报错退出但单独运行正常(已配置EXPOSE端口)
嘿,我明白你现在的困惑——已经按要求加了EXPOSE指令,结果还是没法访问容器里的服务,而且这还是你第一次用Docker,肯定有点头大。结合你用的是Mac版Docker 17.12.0-ce-mac49,我给你整理几个最可能解决问题的方向:
别忘在启动容器时做端口映射
很多新手容易忽略:EXPOSE只是告诉Docker容器要暴露哪个端口,它本身不会自动把容器端口映射到本地机器。你必须在docker run命令里加上-p参数,比如:docker run -p 本地端口:容器端口 你的镜像名称举个例子,如果你的容器
EXPOSE了8080端口,那启动命令就得写成docker run -p 8080:8080 my-first-image,这样本地的8080端口才会和容器内的8080端口打通。检查服务是否绑定到0.0.0.0
如果你的服务在容器里只绑定了localhost(也就是127.0.0.1),那它只能在容器内部被访问,外部根本连不上。你得确保服务的启动配置里绑定的是0.0.0.0——这个地址表示接受来自任何网络接口的请求。比如用Node.js的Express框架,启动代码要改成:app.listen(8080, '0.0.0.0', () => { console.log('服务启动在0.0.0.0:8080'); });验证容器内的服务是否真的在运行
先确认服务本身没问题:用docker exec进入容器内部,然后访问服务看看能不能正常响应:# 先获取容器ID,或者直接用容器名 docker exec -it 你的容器ID /bin/bash # 进入容器后,用curl测试服务 curl localhost:你的服务端口如果容器内都访问不了,那问题就出在服务的启动脚本或者配置上,得先把服务跑起来再说。
试试重启Docker Desktop
老版本的Mac Docker偶尔会有网络栈的小bug,重启一下Docker Desktop说不定就能解决端口访问的问题。另外也可以检查下Mac的防火墙,看看是不是它拦截了Docker的端口请求。
先从这几点入手排查,应该能很快找到问题根源~
内容的提问来源于stack exchange,提问作者smeeb

