跳转至

bridge与端口映射

Bridge网络模式

Bridge网络模式是Docker中最常用的网络模式之一,它允许在同一主机上的容器之间进行通信,同时通过NAT技术与外部网络进行交互。Bridge网络模式通过创建一个名为docker0的虚拟网络桥接器来实现这一功能。

docker0虚拟网络桥接器

docker0是Docker在安装时自动创建的一个虚拟网络桥接器。它充当了容器与宿主机之间的网络桥梁,负责转发容器之间的网络流量。每个容器在启动时都会被分配一个虚拟以太网接口(veth pair),其中一个接口连接到docker0桥接器,另一个接口则位于容器的网络命名空间中。

IP地址分配

当容器启动时,Docker会从docker0桥接器的子网中为容器分配一个IP地址。这个IP地址是容器在Bridge网络中的唯一标识,用于容器之间的通信。默认情况下,docker0桥接器的子网为172.17.0.0/16,容器的IP地址通常为172.17.0.x。

容器间的通信机制

在Bridge网络模式下,容器之间的通信是通过docker0桥接器进行的。当一个容器向另一个容器发送数据包时,数据包会通过容器的虚拟以太网接口发送到docker0桥接器,然后由桥接器转发到目标容器的虚拟以太网接口。由于所有容器都连接到同一个桥接器,因此它们可以直接通信。

容器与外部网络的通信

Bridge网络模式通过NAT技术实现容器与外部网络的通信。当容器需要访问外部网络时,数据包会通过docker0桥接器发送到宿主机的网络栈,然后由宿主机的网络栈进行NAT转换,将容器的私有IP地址转换为宿主机的公共IP地址。这样,外部网络看到的请求是来自宿主机的IP地址,而不是容器的私有IP地址。

配置Bridge网络

在Docker中,Bridge网络是默认的网络模式,因此大多数情况下不需要额外的配置。如果需要自定义Bridge网络的配置,可以通过修改Docker的配置文件来实现。例如,可以修改docker0桥接器的子网、网关等参数。

# 修改docker0桥接器的子网
sudo docker network create --subnet=192.168.1.0/24 my_bridge_network

端口映射

端口映射是实现容器服务对外暴露的关键技术。通过端口映射,可以将容器内部的端口映射到宿主机的端口上,从而使得外部网络可以通过宿主机的IP地址和端口访问容器内的服务。

例如,如果容器内部运行了一个Web服务,监听在80端口,可以通过端口映射将宿主机的8080端口映射到容器的80端口,这样外部用户就可以通过访问宿主机的8080端口来访问容器内的Web服务。

在创建容器时通过 -p 选项指定需要映射的端口

docker run -itd \
-p 80:8080
nginx

将容器内的 80 端口映射到宿主机的 8080 端口上

实现原理剖析

iptables 规则

Docker 使用 Linux 的 iptables 工具来实现端口映射。具体来说,Docker 会在 NAT 表中添加规则,这些规则负责将到达主机特定端口的流量转发到容器的相应端口。例如,如果容器内部运行了一个 Web 服务在端口 80,而主机端口 8080 被映射到这个容器端口,那么所有到达主机 8080 端口的请求都会被转发到容器的 80 端口。

netfilter 框架

netfilter 是 Linux 内核中的一个框架,它提供了包过滤、网络地址转换(NAT)和包篡改等功能。Docker 利用 netfilter 框架来处理网络数据包,确保数据包能够正确地从主机流向容器,反之亦然。在这个过程中,netfilter 的钩子(hooks)被用来在数据包的不同处理阶段插入自定义的处理逻辑。

高级配置技巧

指定映射端口范围

为了增强安全性,可以限制 Docker 容器可以映射的端口范围。这可以通过配置 Docker 守护进程的 --ip-range 参数来实现,这样可以防止容器映射到主机的敏感端口。

绑定特定主机 IP

在某些情况下,可能需要将容器的端口绑定到主机的特定 IP 地址上。这可以通过在运行容器时使用 -p 参数并指定 IP 地址来实现,例如 -p 192.168.1.100:8080:80,这将把容器的 80 端口绑定到主机的 192.168.1.100 IP 地址的 8080 端口上。