在 Docker Compose 或 docker run 里,ports: 的每一条一般是这种形式:
ports:
- "宿主机端口:容器端口"
一、标准写法解析
ports:
- "8080:80"
含义:
| 部分 | 作用 |
|---|---|
| 8080 | 宿主机端口 |
| 80 | 容器内部端口 |
👉 结果:
-
访问
宿主机IP:8080 -
实际转发到容器的
80
二、详细拆开讲
1)容器端口(右边)
:80
这是:
-
容器内部应用监听的端口
-
例如:
-
nginx = 80
-
mysql = 3306
-
redis = 6379
-
👉 这个必须是容器内部真实在监听的端口
2)宿主机端口(左边)
8080:
这是:
-
对外暴露的入口
-
绑定在服务器网卡上
👉 用户访问的就是这个端口
三、完整行为流程
用户访问
↓
宿主机 8080
↓(iptables / docker NAT)
容器 80
↓
nginx / app
四、几种常见写法(很重要)
1)完整映射(最常见)
- "8080:80"
👉 外部可访问
2)只绑定本机(安全模式)
- "127.0.0.1:8080:80"
👉 只能本机访问
-
curl localhost:8080 ✔
-
外网访问 ❌
3)随机端口(不推荐生产)
- "80"
👉 Docker 自动分配宿主机端口
4)IPv6绑定
- "[::1]:8080:80"
👉 只允许 IPv6 本机访问
五、多个 ports 的情况
ports:
- "80:80"
- "443:443"
👉 表示:
-
HTTP + HTTPS 同时暴露
六、容易混淆的点
❌ 误解1:容器端口 = 对外端口
不是
-
容器端口只是内部监听
-
不写 ports = 外部完全访问不到
❌ 误解2:expose 等于 ports
不是
expose:
- "80"
-
只是“告诉其他容器”
-
不会映射到宿主机
❌ 误解3:改容器端口就能改访问端口
不对
-
容器端口是应用决定的
-
ports 只是“映射关系”
七、一句话总结
ports: "A:B"= 把宿主机 A 端口 → 转发到容器 B 端口
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
