docker-compose设置端口映射,宿主机没发现监听端口?
当 Docker 容器已经设置了端口映射 (-p),容器内服务也在监听对应端口,但宿主机上 netstat 或 ss 却看不到端口监听时。
1. 容器服务没有监听 0.0.0.0(仅绑定到 127.0.0.1)
问题:如果容器内的服务只绑定到
127.0.0.1(而不是0.0.0.0),则端口映射无法生效。检查方法:
1
2
3
4
5# 进入容器检查服务监听的IP
docker exec -it <容器名> sh
netstat -tuln | grep <端口>
# 或
ss -tuln | grep <端口>输出示例(问题情况):
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
(仅监听127.0.0.1,外部无法访问)修复方法:
- 修改容器内服务的配置文件,使其监听
0.0.0.0。 - 例如:Nginx、Apache、Node.js 等需明确配置
bind 0.0.0.0。
- 修改容器内服务的配置文件,使其监听
2. 容器未正常运行或服务未启动
- 检查方法:
1
2
3
4
5# 查看容器状态
docker ps -a | grep <容器名>
# 查看容器日志
docker logs <容器名> - 可能的问题:
- 容器启动后服务崩溃退出。
- 服务启动命令有误(如未后台运行导致容器退出)。
3. Docker 网络模式问题(绝大多数原因)
如果容器使用
host网络模式(--network=host),端口会直接暴露在宿主机,但-p参数会失效。 docker-compose (network-mode: host)检查方法:
1
docker inspect <容器名> | grep NetworkMode
修复方法:
- 改用默认的
bridge模式,或直接使用host模式(无需-p)。
- 改用默认的
骚操作
4. 端口映射错误
- 检查方法:
1
2# 查看容器的端口映射
docker port <容器名> - 常见错误:
- 映射参数写反:
-p 宿主机端口:容器端口(正确格式)。 - 例如:
-p 8080:80表示宿主机 8080 映射到容器 80。
- 映射参数写反: