其于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过程与操作
桥接模式简单拓扑
创建过程:
- 启动Docker容器之后,首先宿主机上会创建一对虚拟网卡veth 设备,veth设备总是成对出现的,组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来,veth设备常用来连接两个网络设备。
- Docker将veth 设备的一端放在新创建的容器中,并命名为eth0,然后将另一个veth 设备放在宿主机中,以vethxxx这样类似的名字命名,并将这个网络设备vethxxx加入到docker0网桥中,可以通过brctl show命令查看。
- 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
- 此时容器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