Docker几种网络模式

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

Host模式;使用–net=host指定

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

Container模式;使用–net=container:NAME or ID指定

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

None模式;使用–net=none来指定。

None模式与其他的模式都不同,如果处于None模式,Docker容器拥有自己的Network Namespace,但是并不为Docker容器进行任何网络配置。也就是说该Docker容器没有网卡、IP、路由等信息,需要手工为Docker容器添加网卡、配置IP等,典型Pipework工具为Docker容器指定IP等信息;

Bridge桥接模式,这个也是docker默认的网络模式,即Docker run时,不加–net指定网络模式时,自动启动此模式。

Bridge模式是Docker默认的网络模式,该模式会为每一个容器分配Network Namespace、设置IP、路由等配置,默认会将Docker容器连接到一个虚拟网桥交换机Docker0上
以Bridge桥接模式,说明创建Docker Bridge过程与操作
桥接模式简单拓扑
在这里插入图片描述
创建过程:

  1. 启动Docker容器之后,首先宿主机上会创建一对虚拟网卡veth 设备,veth设备总是成对出现的,组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来,veth设备常用来连接两个网络设备。
  2. Docker将veth 设备的一端放在新创建的容器中,并命名为eth0,然后将另一个veth 设备放在宿主机中,以vethxxx这样类似的名字命名,并将这个网络设备vethxxx加入到docker0网桥中,可以通过brctl show命令查看。
  3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
  4. 此时容器IP与宿主机能够通信,宿主机也可以访问容器中的IP地址,在Bridge模式下,连在同一网桥上的容器之间可以相互通信,同时容器也可以访问外网,但是其他物理机不能访问docker容器IP,需要通过NAT将容器IP的port映射为宿主机的IP和port。

操作方法:

vim /etc/sysconfig/network-scripts/ifcfg-ens33
#修改网卡,增加:BRIDGE="br0"
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33      
m ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
IPADDR=192.168.68.129
NETMASK=255.255.255.0
GATEWAY=192.168.68.2
DNS1=114.114.114.114
DNS2=1.2.4.8

cp /etc/sysconfig/network-scripts/ifcfg-ens33  /etc/sysconfig/network-scripts/ifcfg-br0
vim /etc/sysconfig/network-scripts/ifcfg-br0

#修改ifcfg-br0如下
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
fg-br0 
TYPE=Bridge
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.68.129
NETMASK=255.255.255.0
GATEWAY=192.168.68.2
DNS1=114.114.114.114
DNS2=1.2.4.8
[root@localhost ~]# 
#重启网卡,启动docker服务,即可;

service network restart
service docker start

可以看到,现在增加一个br0网卡并与网卡ens33绑定了,宿主机有两个虚拟网卡:Docker0和br0
在这里插入图片描述
Docker默认提供了一个隔离的内网环境,启动时会在宿主机上建立一个docker0的虚拟网卡,每个容器都是连接到docker0网卡上的。而docker0的ip段为172.17.0.1,如果想让容器与宿主机同一网段的其他机器访问,就必须在启动docker的时候将某个端口映射到宿主机的端口。

而为了直接让容器和宿主机通信,不需要映射端口,需要修改Docker启用时候默认使用br0网卡。这个咋修改呢?需要修改docker这个软件的配置文件

ls /etc/sysconfig/docker-network
vim /etc/sysconfig/docker-network
#在DOCKER_NETWORK_OPTIONS=后面增加"-b=br0"
#-b表示指定桥接,br0为桥接网卡名称  如果是源码安装docker,执行/usr/local/docker/bin/dockerd -b=br0
[root@localhost ~]# cat /etc/sysconfig/docker-network  
# /etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS="-b=br0"   
[root@localhost ~]# 

#重启一下docker服务
systemctl restart docker

启docker虚拟机:

1).自动分配置IP启动:
docker run -itd –privileged –name=caixin centos7-ansible:V2

这种方式启动容器,容器只能通过端口映射方式与宿主要通信,使用上不方便。

2).手机设定IP启动:
docker run -itd –net=none –privileged –name=caixin centos7-ansible:V2
这种方法可以使启动的容器的IP和宿主机在同一个网段。直接可以和宿主机通信,企业生产环境常使用这一种方式。可以使用pipework工具来配置IP。

#首先要下载安装pipework
wget https://github.com/jpetazzo/pipework/archive/master.zip
mv master.zip  pipework.zip
unzip pipework.zip
cp pipework /usr/bin/

#手动docker一个容器,网络模式为none,然后通过pipework设定新启动的容器ip:192.168.68.11
[root@localhost pipework-master]# docker run -itd --net=none  --privileged centos7-ansible:V2             
08c6f52a09d7fe1fe1f800cd8fa804562e95760edb15281c16ba518872d04442
[root@localhost pipework-master]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
08c6f52a09d7        centos7-ansible:V2   "/bin/bash"         6 seconds ago       Up 5 seconds                            heuristic_wilson
[root@localhost pipework-master]# pipework br0 08c6f52a09d7 192.168.68.11/24@192.168.68.129

[root@localhost pipework-master]# ping 192.168.68.11
PING 192.168.68.11 (192.168.68.11) 56(84) bytes of data.
64 bytes from 192.168.68.11: icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from 192.168.68.11: icmp_seq=2 ttl=64 time=0.053 ms

以上手动启动了一台容器,并手动分配IP。如果一次性启动多个容器,比如20台,分配20个IP,怎么操作?只需要执行:

for i in $(seq 11 30);do docker run -itd --name=vm$i --net=none --privileged centos7-ansible:V2 ;sleep 1 ;pipework br0 vm$i 192.168.68.$i/24@192.168.68.129 ;done
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿蔡BLOG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值