Docker网络模式深入剖析

一、简介

基于Docker run创建Docker容器时,可以使用–net选项指定容器的网络模式,Docker默认有以下四种网络模式:

  • host模式,使用–net=host指定;
  • container模式,使用–net=container:NAME_or_ID指定;
  • none模式,使用–net=none指定;
  • bridge模式,使用–net=bridge指定,默认设置;

二、Host模式(不推荐)

默认Docker容器运行会分配独立的Network Namespace隔离子系统,基于host模式,容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

三、Container模式(不推荐)

新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。

四、Bridge桥接模式(推荐)

1、基础知识

Bridge模式是Docker默认的网络模式,该模式会为每一个容器分配Network Namespace、设置IP、路由等配置,默认会将Docker容器连接到一个虚拟网桥交换机Docker0上。

宿主机:
在这里插入图片描述注:这个docker0既是一个桥接网卡也是一个虚拟网桥交换机,注意它是虚拟的。docker容器的网关ip地址也是这个ip。

docker容器:
在这里插入图片描述
首先我要说一个现象,我们开启一个docker容器,ifconfig便会多出一个东西:
注:这里我开了两台docker容器:
在这里插入图片描述注:veth中文名字叫虚拟网卡设备,它是成对的,启动了容器后,一个在宿主机一端,名叫vethxxxx,一个在docker容器里名叫eth0(这个名字是固定的)

2、如下为桥接模式拓扑图

在这里插入图片描述

3、brctl命令查看虚拟网桥交换机详情
yum install bridge-utils -y
brctl show

在这里插入图片描述

五、None模式(企业推荐)

None模式顾名思义就是,网络什么都没有配置,没有ip,没有网卡,什么都没有,需要自己使用pipwork工具进行配置。
注:docker run命令中有none网络模式,便不能再-p映射端口了,因为没有ip,无法映射端口,至于解决办法还没发现!
pipwork配置网络实战

1、编辑docker-network文件
vim /etc/sysconfig/docker-network
systemctl restart docker

在这里插入图片描述

2、编辑ifcfg-ens33、ifcfg-br0网络配置文件
cd /etc/sysconfig/network-scripts/
vim ifcfg-ens33

DEVICE=ens33
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
BRIDGE="br0"
vim ifcfg-br0

DEVICE="br0"
BOOTPROTO=none
ONBOOT=yes
TYPE="Bridge"
IPADDR=172.16.193.200
NETMASK=255.255.255.0
GATEWAY=172.16.193.2 #利用pipework工具指定容器网关时,需要使用这个ip

注:后面pipework工具指定容器网关不能使用虚拟网桥交换机的网卡ip

systemctl restart network #使配置生效
ifconfig

在这里插入图片描述注:将ens33接口桥接到虚拟网卡br0!

3、下载、安装pipwork工具
git clone https://github.com/jpetazzo/pipework
cp ./pipework/pipework /usr/local/bin/
4、以None模式启动容器
docker run -itd -p 6022:22 --net=none docker.io/jdeathe/centos-ssh
ifconfig
5、利用pipwork工具为docker容器设置网络
pipework    br0       0ae0e8cff698 172.16.193.100/24@172.16.193.2
#	虚拟网卡交换机的名称   容器ID		 指定容器的IP      指定容器的网关
#注意这里网关不能填172.16.193.200,至于为什么请看下文详解!
docker exec -it 0ae0e8cff698 /bin/bash
yum install net-tools -y
ifconfig
route -n
ping www.baidu.com #看看网络是否通了,通了就对了!

在这里插入图片描述看,这样就成功了,如果你把容器网关设置为虚拟网桥交换机的网卡ip(172.16.193.200),那么你只能ping通内网ip,不能上外网

6、为什么容器网关设置为虚拟网桥交换机(br0)的网卡ip(172.16.193.200)不行?

请结合上文的桥接模式架构图理解!

假设我们设置其网关为172.16.193.200,因为我们的虚拟的网桥交换机不具备路由功能,到了网关是需要路由的。所以它无法路由!如果填172.16.193.2,那么在到达网关172.16.193.2之前都是局域网广播寻址,是可以找到网关的,且网关具有路由功能。那为什么我们以前设置网关为172.16.193.200都可以呢!因为我们把虚拟网桥交换机的ip和宿主机的ip合并了。以前未合并时你填的是宿主机的ip,宿主机是有路由表,是具有路由功能的,你可以route -n

发布了188 篇原创文章 · 获赞 150 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/104444960
今日推荐