首页 > 其他分享 >docker在网桥模式下主机端口映射到容器端口的原理

docker在网桥模式下主机端口映射到容器端口的原理

时间:2025-01-19 21:09:42浏览次数:1  
标签:CentOS -- 0.0 192.168 网桥 172.17 docker 数据包 端口映射

前置知识

iptables:捕获并控制容器和主机之间的流量, 可以通过iptables -t nat -nL命令查看iptables的(S/D)NAT规则
docker0:虚拟交换机
veth1b62ff4@if56:虚拟交换机的虚拟接口
上下两个虚拟接口成对出现
eth0@if57:容器的虚拟接口


网络环境

CentOS:ens33->192.168.40.180/24、docker0->172.17.0.1/16、veth1b62ff4@if56
CentOS的容器:eth0@if57->172.17.0.2/16(gateway:172.17.0.1)
Windows11:VMnet8->192.168.40.1/24


假设CentOS的容器有一个8080/tcp的web服务映射到了CentOS的80/tcp

这个时候Windows11通过浏览器去访问http://192.168.40.180:80, CentOS的ens33接口接收到这个数据包后, iptables的DNAT规则会在数据包被路由之前修改数据包的目的地址和目的端口为172.17.0.2:8080,修改完成后, 数据包会被路由到docker0虚拟机交换机, 虚拟交换机会把数据包发送到veth1b62ff4@if56虚拟接口, CentOS的容器上的eth0@if57虚拟接口就会接收到数据包并通过eth0@if57虚拟接口发送回复数据包, CentOS的docker0交换机通过veth1b62ff4@if56虚拟接口接收到这个数据包后, iptables的DNAT规则会在数据包被路由之前修改数据包的源地址和源端口为192.168.40.180:80, 修改完成后,数据包通过路由就会从CentOS的ens33接口发送出去, 最后Windows11的VMnet8接口接收到数据包会交给浏览器处理。
下面是一个简单的表达:
win11浏览器访问http://192.168.40.180:80(192.168.40.1:12345->192.168.40.180:80) --> win11-VMnet8 --> CentOS-ens33 --> CentOS-iptables-DNAT-修改数据包为192.168.40.1:12345->172.17.0.2:8080 --> CenOS-docker0 --> CentOS-veth1b62ff4@if56 --> CentOS的容器-eth0@if57 --> CentOS的容器-服务(172.17.0.2:8080->192.168.40.1:12345) --> CentOS的容器-eth0@if57 --> CentOS-veth1b62ff4@if56 --> CenOS-docker0 --> CentOS-iptables-DNAT-修改数据包为192.168.40.180:80->192.168.40.1:12345 --> CentOS-ens33 --> win11-VMnet8 --> win11浏览器处理
示意图:Docker容器映射端口到主机.excalidraw


查看iptables的DNAT规则和SNAT规则

[root@xianchaomaster1 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80

可以看到DNAT规则, 为什么没有SNAT规则?

MASQUERADE 是 SNAT 的一种特殊形式,通常在动态网络环境下(如容器或虚拟机)使用。MASQUERADE 自动将源 IP 地址修改为出站接口的 IP 地址,而不需要手动指定静态 IP,因此它通常比传统的 SNAT 更常用。

标签:CentOS,--,0.0,192.168,网桥,172.17,docker,数据包,端口映射
From: https://www.cnblogs.com/UNGIIN/p/18679990

相关文章

  • docker-compose部署clickhouse
    创建目录mkdir-p/usr/local/docker/clickhouse/conf/usr/local/docker/clickhouse/data/usr/lcoal/docker/clickhouse/log启动临时容器获取配置文件dockerrun--rm-d--name=temp-clickhouse-serverclickhouse/clickhouse-server:latest复制配置文件到宿主机doc......
  • 硬件虚拟化(KVM)和操作系统虚拟化(Docker)
    硬件虚拟化分为I型虚拟化和II型虚拟化。I型虚拟化直接在硬件上虚拟出多个硬件,然后在虚拟出的硬件运行上操作系统;II型虚拟化作为软件在已有的操作系统上虚拟出多个硬件,然后在虚拟出的硬件上运行操作系统。操作系统虚拟化操作系统虚拟化是一种概念,目的是为了让应用和服务运行在......
  • jenkins + gogs + docker + nginx 完成自动化部署
    jenkins+gogs+docker+nginx完成自动化部署app安装部署1.docker-compose配置文件version:'3'services:nginx:image:nginx:latestports:-"80:80"volumes:-./nginx.conf:/etc/nginx/nginx.confdepends_on:-jen......
  • windows 将docker desktop上镜像打包并通过资源管理器找到使用
    在Windows上使用DockerDesktop时,可以通过以下步骤将Docker镜像保存为 .tar 文件,并通过资源管理器找到该文件: 步骤1:打开DockerDesktop确保DockerDesktop正在运行。如果未运行,请启动它。步骤2:打开PowerShell或命令提示符按 Win+S,搜索 PowerShell ......
  • Docker安装nacos(图文并茂,避免踩坑,一步到位)
    致谢本篇是对https://blog.csdn.net/ilvjiale/article/details/129417768这篇教程做了补充,感谢原帖!前言安装之前你需要准备一个mysql,当前安装方式是将数据持久化到数据库中的,这里的部署是单机模式dockerpullnacos/nacos-server:v2.3.1PS:这是拉取最新的nacos版本,如......
  • docker 安装nacos
    拉取镜像dockerpullnacos/nacos-server#macm1芯片需用arm64包dockerpullnacos/nacos-server:v2.1.2-slim其他包参考dockernacos镜像仓库构建nacos容器#-eMODE=standalone单机模式dockerrun--namenacos--privileged=true-eMODE=standalone-p8848:8848......
  • 如何停止所有正在运行的docker容器?
    在Docker中,要停止所有正在运行的容器,可以使用以下命令:dockerstop$(dockerps-aq)这个命令的作用是:dockerps-aq:这条命令会列出所有容器(包括运行中和已停止的)的ID,-a 参数表示列出所有容器(不只是运行中的),-q 参数则表示仅显示ID,不显示其他详细信息。$():这是Bash中的......
  • easyipx内网穿透部署docker版
    内网穿透easyipx部署官方部署方式请参考easyipx官方文档获取更多信息。Docker镜像启动方式使用现有镜像其中/path/ssl/为证书存放路径version为使用的版本号dockerrun-d\--nameeasyipx\--restartalways\--networkhost\-v/path/ssl/:/opt/easy......
  • Kubernetes(k8s)和Docker Compose本质区别
    Kubernetes(简称k8s)和DockerCompose是容器编排领域的两大重要工具,虽然它们都用于管理和编排容器化应用,但在设计目标、功能特性、使用场景和复杂度上存在显著差异。以下将从多个方面详细探讨Kubernetes和DockerCompose的本质区别。一、设计目标与应用场景1.KubernetesK......
  • Docker 容器之间通过名字相互访问
    目录docker网卡介绍创建自定义网络语法选项自定义网络示例示例创建容器默认网络和自定义网络区别docker网卡介绍docker安装好之后默认会创建三个虚拟网卡,可以使用 dockernetworkls 命令来查看,三个虚拟网卡和VMware的类似。[root@192~]dockernetworklsNETWORKID......