5分钟玩转 Docker Bridge

网友投稿 320 2022-10-25

5分钟玩转 Docker Bridge

Docker容器的Bridge模式也是Docker默认的网络模式。

该模式会为每个容器分配Network Namespace子系统,会自动给每个容器虚拟出自己的网卡、IP、网关、路由等信息,无需手工添加。

默认创建的Docker容器会统一通过一对veth虚拟网卡,连接到一个虚拟网桥交换机Docker0上,所有的容器的网络加入到一个二层交换机网络里面,即同一宿主机的所有容器之间都是可以相互联通和访问的。

Bridge模式原理剖析

默认Docker引擎启动会在本地生成一个Docker0虚拟网卡。Docker0是一个标准Linux虚拟网桥设备。在Docker默认的桥接网络工作模式中,Docker0网桥起到了至关重要的作用。

物理网桥是标准的二层网络设备,标准物理网桥只有两个网口,可以将两个物理网络连接在一起。但与物理层设备集线器等相比,网桥具备隔离冲突域的功能。网桥通过MAC地址学习和泛洪的方式实现二层相对高效的通信。

随着技术的发展,标准网桥设备已经基本被淘汰了,替代网桥的是二层交换机。二层交换机也可以看成一个多口网桥。

Docker Bridge桥接模式创建过程

①启动一个Docker容器,指定模式为桥接模式时,Docker引擎会创建一对虚拟网卡veth pair设备。

②Docker将veth pair设备的一块设备放在新创建的容器中,命名为eth0,然后将另外一块设备放在宿主机中,以vethxxx类似的名称命名,并将这个网络设备加入到docker0网桥中。

③Docker引擎会从docker0子网中动态分配一个新的IP给容器使用,并设置docker0的IP地址为容器的默认网关。

④此时新创建的容器与宿主机能够通信,宿主机也可以访问容器中的IP地址,在Bridge模式下,连在同一网桥(交换机)上的容器之间可以相互通信,同时容器也可以访问外网(基于iptables SNAT),但是其他物理机不能访问docker容器IP,需要通过NAT将容器IP的port映射为宿主机的IP和port。

Bridge模式实战(一)

基于Docker引擎启动Nginx WEB容器,默认以Bridge方式启动Docker容器,会动态DHCP给Docker容器分配IP、网关等信息,操作指令如下:

#查看镜像列表;

docker images

#运行新的Nginx容器;

docker run -itd docker.io/nginx:latest

#查看启动的nginx容器

docker ps

#查看nginx容器的IP地址;

docker inspect 510ea29c39f6|grep -i ipaddr

访问nginx容器80端口服务;

curl -I WEB容器,默认以Bridge方式启动Docker容器,此处使用pipework工具手工给容器指定桥接网卡,并且手工配置IP地址,操作指令如下:

#查看镜像列表;

docker images

#运行新的Nginx容器;

docker run -itd --net=none docker.io/nginx:latest

#查看启动的nginx容器

docker ps

#查看nginx容器的IP地址;(没有IP地址)

docker inspect 265a3745752e|grep -i ipaddr

安装pipework IP配置脚本工具,方法如下:

#安装pipework

git clone ~/pipework/pipework /usr/local/bin/

#查看pipework工具是否配置正确;

pipework -h

基于pipework工具手工指定容器的IP,并且设置容器为桥接方式上网,命令如下:

#docker0为网桥名称,172.17.0.18/16为容器IP和掩码,172.17.0.1为容器网关

pipework  docker0 265a3745752e 172.17.0.18/16@172.17.0.1

ping  172.17.0.18 -c 2

curl -I  WEB容器,默认以Bridge方式启动Docker容器,而且Docker0的网桥IP为172.17.0.0/16网段,可以通过指令修改Docker网桥的IP网段,例如将网桥IP段修改为10.10.0.1/16段,操作指令如下:

#删除原有网络信息;

service docker stop

ip link set dev docker0 down

brctl delbr docker0

iptables -t nat -F POSTROUTING

#添加新的docker0网络信息;

brctl addbr docker0

ip addr add 10.10.0.1/16 dev docker0

ip link set dev docker0 up

#配置Docker的文件;

cat>/etc/docker/daemon.json<

{"registry-mirrors": [""10.10.0.1/16"

}

EOF

#启动新的Docker容器,查看容器桥接网络IP地址,如图所示:

docker run -itd docker.io/nginx:latest

docker inspect 72fec5ccdf73|grep -i ipaddr

Bridge模式实战(四)

基于Docker引擎启动Nginx WEB容器,默认以Bridge方式启动Docker容器,而且Docker0的网桥IP为172.17.0.0/16网段,默认局域网的其他物理机是不能直接访问Docker容器的。

为了实现Docker容器跟局域网通信,并且实现局域网其他的物理机也可以访问容器的IP(不配置NAT映射),可以自定义桥接网络br0,将br0跟物理网卡eth0或者ens33桥接。

操作方法如下:

#添加ens33网卡指定bridge桥接网卡名称br0;

cd /etc/sysconfig/network-scripts/

#查看ifcfg-ens33网卡IP地址;

cat ifcfg-ens33

TYPE="Ethernet"

DEVICE="ens33"

ONBOOT="yes"

BRIDGE="br0"

IPADDR=192.168.0.141

NETMASK=255.255.255.0

GATEWAY=192.168.0.1

#查看ifcfg-br0网卡IP地址;

cat ifcfg-br0

DEVICE="br0"

BOOTPROTO=static

ONBOOT=yes

TYPE="Bridge"

IPADDR=192.168.0.141

NETMASK=255.255.255.0

GATEWAY=192.168.0.1

#重启network网络服务;

service network restart

#修改docker引擎,使其读取br0网桥;

cat /etc/sysconfig/docker-network

DOCKER_NETWORK_OPTIONS="-b=br0"

#启动Docker容器,设置为none模式,然后使用br0网桥,指令如下:

#br0为网桥名称,192.168.0.11/24为容器IP和掩码,192.168.0.141为容器网关

docker run -itd --net=none --name=nginx-v1 docker.io/nginx

pipework  br0  nginx-v1  192.168.0.11/24@192.168.0.141

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot实现全局异常处理方法总结
下一篇:华为发布MDC领域的最新的产品,促进智能驾驶产业健康发展
相关文章

 发表评论

暂时没有评论,来抢沙发吧~