容器运行在自己的隔离网络环境中(通常是 Bridge 模式)。这意味着:
容器之间:可以通过 IP 或容器名(自定义网络)互通。
为了让外部(如你的浏览器、其他局域网机器)访问容器内的服务,我们需要将容器的端口映射到宿主机的端口。
外部用户 (Browser)
│
▼
宿主机 (localhost:8080)
│
┌────┴────┐ 端口映射
│ Docker │ (8080 -> 80)
│ Proxy │
└────┬────┘
│
▼
容器 (Class B: 80)
Docker 提供了多种方式来指定端口映射,最常用的是 -p 参数。
使用 -p <宿主机端口>:<容器端口> 格式。
此时访问 http://localhost:8080 即可看到 Nginx 页面。
多种格式:
ip:hostPort:containerPort
-p 127.0.0.1:8080:80 (仅本机访问)
如果您不关心宿主机使用哪个端口,可以使用随机映射功能。
使用 -P (大写) 参数,Docker 会随机映射 Dockerfile 中 EXPOSE 指令暴露的所有端口到宿主机的高端口(49000-49900)。
查看映射结果:
此时 Nginx 被映射到了宿主机的 49153 端口。
我们可以使用 docker port 命令来查看当前容器的端口映射规则。
运行以下命令:
运行以下命令:
为了保证服务的安全性,我们应该谨慎选择绑定的 IP 地址。
默认情况下,-p 8080:80 会监听 0.0.0.0:8080,这意味着任何人只要能连接你的宿主机 IP,就能访问该服务。
如果不希望对外暴露(例如数据库服务),应绑定到 127.0.0.1:
如果宿主机 8080 已经被占用了,容器将无法启动。
解决:
默认是 TCP 协议。如果要映射 UDP 服务(如 DNS, Syslog):
Docker 使用 docker-proxy 进程(用户态)或 iptables DNAT 规则(内核态)来实现端口转发。
当流量到达宿主机端口时,iptables 规则将其目标地址修改为容器 IP 并转发:
这也是为什么你在容器内部看到的访问来源 IP 通常是网关 IP(如 172.17.0.1),而不是真实的外部 Client IP(除非使用 host 网络模式)。
默认监听所有 IP,敏感服务应绑定 127.0.0.1
使用 docker port 或 docker ps