文档首页> 常见问题> Docker 端口映射后访问不通

Docker 端口映射后访问不通

发布时间:2026-02-21 17:02        更新时间:2026-02-22 05:50
docker run 的时候明明加了 -p 8080:80,宿主机外部访问还是超时,这类问题集中在三处:映射写法、容器内监听地址、防火墙链。 ## -p 的写法细节 先看实际映射有没有生效: docker ps docker port 容器名 PORTS 列里出现 0.0.0.0:8080->80/tcp 才算对外放开。容易踩的坑是写成 127.0.0.1:8080:80,这样端口只绑定在宿主机回环地址上,服务再正常外部也够不着。写法约定是"-p 宿主机端口:容器端口",顺序写反(-p 80:8080)访问到的就是另一个端口上的东西。 另一个易混写法是 -P(大写),它随机分配宿主机高位端口,映射关系要靠 docker port 查,固定端口场景别用它。排查映射关系也别凭记忆,docker inspect 输出里的 Ports 段才是权威数据。 ## 容器里的服务在听谁 第二个坑更隐蔽:应用在容器内只监听 127.0.0.1。端口映射的原理是宿主机把流量转给容器 IP,容器里服务只听回环地址时,转发来的包会被直接丢弃。进入容器确认: docker exec -it 容器名 sh ss -lntp 输出必须是 0.0.0.0:80 或 :::80 这类全地址监听。Nginx 默认监听 80 没问题,自己写的 Web 程序(比如 Node、Python 的开发服务器)常见默认只听 127.0.0.1,启动参数里要显式指定 0.0.0.0。精简镜像里常常没有 ss 命令,装不上就在容器内用 curl 127.0.0.1:80 自测,能通说明服务活着,监听地址再对照应用启动参数核对。 ## 防火墙链放没放行 宿主机自测通过、外部不通,就看系统防火墙: firewall-cmd --list-ports firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload Ubuntu 上对应 ufw status 和 ufw allow 8080/tcp。Docker 自己会写 iptables(内核包过滤规则)转发链,一般不需要手工放行映射端口,但启用了 firewalld 或 ufw 的机器上,两套规则互相覆盖的情况并不少见。以非 root 用户运行 Docker 的环境还有一层非特权端口限制,高位端口映射后外部仍不通,多半卡在这里,调内核参数 net.ipv4.ip_unprivileged_port_start 或改用 root 运行。 排查顺序建议固定下来:容器内 curl 一下服务,宿主机 curl 127.0.0.1:8080,再从外部访问,哪一层断了修哪层。镜像是自己构建的情况,把监听 0.0.0.0 写进启动脚本或 Dockerfile 的启动命令里,比每次手工排查省事。