关于Docker Compose中端口设置参数解释

在 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
喜欢就支持一下吧
点赞5 分享