其于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