docker-compose设置端口映射,宿主机没发现监听端口?

当 Docker 容器已经设置了端口映射 (-p),容器内服务也在监听对应端口,但宿主机上 netstatss 却看不到端口监听时。


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。