iptables 实现 docker 端口映射

在 Docker 中,端口映射的实现是通过 iptablesNAT 表PREROUTING 链来完成的。具体来说,Docker 使用以下 iptables 规则链来管理端口映射:

  1. PREROUTING

    • 这是 NAT 表中的一个链,用于处理所有到达宿主机的流量。在这里,Docker 通过修改目的 IP 地址和端口号,将外部请求重定向到容器的内部 IP 地址和端口上。
    • 当请求到达宿主机时,PREROUTING 链会捕获请求并根据 Docker 设置的规则,将请求重定向到对应容器的网络接口。

    示例命令查看 PREROUTING 链:

    iptables -t nat -L PREROUTING
    
  2. OUTPUT

    • 当请求是由宿主机自身发起时,会通过 NAT 表的 OUTPUT 链。同样地,Docker 会在这里添加规则,确保宿主机自己发出的请求可以正确映射到容器的网络接口。
  3. POSTROUTING

    • 当数据包从容器发出并返回到外部时,Docker 使用 NAT 表中的 POSTROUTING 链来修改源地址。这保证了容器的返回流量可以正确地发送回外部客户端。
  4. DOCKER

    • Docker 会在 NAT 表中创建一个名为 DOCKER 的自定义链,用于管理容器的端口映射和 NAT 规则。
    • PREROUTING 链中的规则会指向 DOCKER 链,并在这里处理具体的端口映射。

    示例查看 DOCKER 链:

    iptables -t nat -L DOCKER
    

端口映射工作流程:

  • 当你使用 docker run -p <host_port>:<container_port> 启动一个容器时,Docker 会通过 iptables 将宿主机的 <host_port> 映射到容器的 <container_port>
  • PREROUTING 链中的规则会捕获外部发向 <host_port> 的流量,重定向到容器的 IP 地址和 <container_port>

总结一下,Docker 的端口映射主要通过 NAT 表 中的 PREROUTINGDOCKER 来实现的。这些链协作,确保外部请求可以被正确地转发到容器中对应的端口。

### Docker端口映射配置教程及访问网页的方法 为了通过Docker端口映射访问网页服务,通常需要完成以下几个方面的操作: #### 1. 使用`docker run`命令指定端口映射 在启动容器时,可以使用`-p`参数来定义主机与容器之间的端口映射关系。例如,如果希望将宿主机的8080端口映射容器内的80端口(假设容器内运行的是Web服务),可以执行如下命令[^2]: ```bash docker run -d -p 8080:80 nginx ``` 上述命令会以后台模式启动一个Nginx容器,并将宿主机的8080端口映射容器内的80端口。 #### 2. 如果未绑定端口,则需手动配置iptables规则 当容器已创建但未绑定端口时,可以通过配置iptables实现端口转发功能。具体步骤如下: - **查找容器IP地址** 运行以下命令获取目标容器网络信息: ```bash docker inspect <container_id> ``` 在返回的结果中找到`NetworkSettings.IPAddress`字段对应的值作为容器的实际IP地址[^1]。 - **添加iptables规则** 假设要将宿主机的9090端口转发至容器中的80端口,可执行以下命令: ```bash iptables -t nat -A PREROUTING -p tcp --dport 9090 -j DNAT --to-destination <container_ip>:80 iptables -t nat -A OUTPUT -p tcp --dport 9090 -j DNAT --to-destination <container_ip>:80 ``` - **保存并生效iptables规则** 完成规则添加后,建议将其持久化存储以便重启后继续有效。对于某些Linux发行版,可能需要额外安装工具如`iptables-save`和`iptables-restore`。 #### 3. 访问网页的方式 一旦完成了端口映射或者iptables配置,就可以通过浏览器输入URL形式访问该页面了。比如,在前面的例子中,可以在本地机器上打开浏览器并访问 `http://<host_ip>:8080/` 或者 `http://<host_ip>:9090/` 来加载由Docker容器提供服务的内容。 --- ### 注意事项 尽管存在不显式声明 `-p` 参数却仍然可以从外部访问的情况,但这通常是由于默认桥接网络或其他特殊设置所致,并不是推荐的做法。因此,始终应该明确地设定好所需的端口映射策略以确保安全性以及可控性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值