EXPOSE仅声明容器监听端口,无映射功能;必须用-p参数显式映射宿主机端口才能访问,否则服务对外不可达。

在 Docker 中,Port 指令本身并不存在——Dockerfile 中没有 PORT 或 Port 指令。你真正需要的是 EXPOSE(用于声明容器内监听的端口,仅作文档/提示用途),再配合 运行容器时用 -p 或 --publish 参数做端口映射,才能把容器端口真正暴露到宿主机上。
1. 在 Dockerfile 中用 EXPOSE 声明端口(可选但推荐)
EXPOSE 不会自动映射端口,也不开启防火墙或绑定宿主机端口,它只是告诉使用者“这个镜像默认监听哪个端口”,同时为后续的 docker run -P(大写 P)提供自动映射依据。
例如,在 Dockerfile 中写:
EXPOSE 8080 3000表示该镜像预期使用 8080 和 3000 端口(如 Web 服务或 API)。构建镜像后,运行时仍需显式指定映射。
2. 运行容器时用 -p 显式映射端口(关键步骤)
这才是让容器服务能被宿主机访问的核心操作。格式为:-p [宿主机IP:]宿主机端口:容器端口[/协议]。
-
docker run -p 8080:80 nginx:将宿主机 8080 端口映射到容器 80 端口 -
docker run -p 127.0.0.1:3000:3000 node-app:只允许本地访问宿主机 3000 端口(更安全) -
docker run -p 5432:5432 -p 8000:8000 myapp:一次映射多个端口 -
docker run -p 8080:8080/udp my-udp-server:映射 UDP 端口(默认是 TCP)
3. 验证端口是否映射成功
运行容器后,可通过以下方式确认:
-
docker ps:查看输出中 PORTS 列,如0.0.0.0:8080->80/tcp表示映射生效 -
curl http://localhost:8080(宿主机上测试) -
netstat -tuln | grep :8080或ss -tuln | grep :8080:检查宿主机端口是否被 docker-proxy 占用
4. 常见误区提醒
-
EXPOSE≠ 端口映射,不加-p就无法从宿主机访问 - 容器内应用必须监听
0.0.0.0:端口,而非127.0.0.1:端口(否则外部连不上) - 宿主机端口若被占用,启动会失败,可换端口或先停掉冲突进程
- Docker Desktop(Mac/Windows)下,
localhost可直接访问;Linux 上也一样,无需改 IP











