Docker 容器如何同时暴露多个端口?
重复写 -p 参数即可映射多个端口:docker run -p 80:80 -p 443:443 镜像;也可映射端口范围或绑定特定网卡 IP。compose 里 ports 是列表。注意容器内应用要真的监听这些端口。
做法:每个端口写一个 -p 参数——docker run -d -p 80:80 -p 443:443 myimage 就把宿主的 80、443 分别映射到容器的 80、443。前提:容器内应用确实在监听这些端口,光映射不监听照样不通。
常用写法
# 多个单端口
docker run -d -p 80:80 -p 443:443 -p 9090:9000 myimage
# 宿主端口与容器端口不同
docker run -d -p 8080:80 myimage # 宿主 8080 → 容器 80
# 只绑定回环地址(仅本机可访问)
docker run -d -p 127.0.0.1:8080:80 myimage
# UDP 端口
docker run -d -p 53:53/udp myimage
# 连续端口范围
docker run -d -p 8000-8010:8000-8010 myimage
compose 写法
services:
web:
image: myimage
ports:
- "80:80"
- "443:443"
- "127.0.0.1:9090:9000"
EXPOSE 指令是什么角色
Dockerfile 里的 EXPOSE 80 443 只是文档声明,不做实际映射——真正生效的是 run -p 或 compose 的 ports。docker run -P(大写)会把所有 EXPOSE 的端口映射到宿主随机端口。
验证端口通了
docker port mycontainer # 看映射表
ss -ltn | grep 80 # 宿主机上确认监听
curl -v http://localhost:8080 # 实际访问
不通按顺序查:容器在跑吗 → 应用监听了吗(docker exec 容器 ss -ltn)→ 映射写对了吗 → 防火墙放行了吗。
观测云对照
多端口服务的可用性分开拨测。 应用对外暴露 HTTP、管理、监控多个端口时,用观测云拨测分别探测各端口可用性与响应时间,哪个端口挂了告警直接点名。
常见问题(FAQ)
Q:宿主端口被占用怎么办?
A:换宿主侧端口(-p 8081:80),或找到占用进程停掉;ss -ltnp 查占用者。
Q:端口范围映射性能差?
A:大范围映射会启动大量用户态代理进程,性能敏感场景用 --network host(Linux)。
Q:能映射到指定内网网卡吗?
A:可以,-p 192.168.1.5:8080:80,只在该网卡地址上监听。