Docker 网络模式(四种)详细介绍
Docker网络模式
本文首先介绍了Docker自身的4种网络工作方式,
Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。
四种网络模式
我们在使用dockerrun创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:
·host模式,使用--net=host指定。
·container模式,使用--net=container:NAME_or_ID指定。
·none模式,使用--net=none指定。
·bridge模式,使用--net=bridge指定,默认设置。
1host模式
众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PIDNamespace隔离进程,MountNamespace隔离文件系统,NetworkNamespace隔离网络等。一个NetworkNamespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的NetworkNamespace隔离。一个Docker容器一般会分配一个独立的NetworkNamespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
2container模式
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个NetworkNamespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
3none模式
这个模式和前两个不同。在这种模式下,Docker容器拥有自己的NetworkNamespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
4bridge模式
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配NetworkNamespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。
host模式
使用Dockerrun时使用–net=host指定
Docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip。
[root@localhost~]#dockerrun-it--rm--net=hostcentos_with_netbash
–rm,退出镜像时同时删除该镜像
[root@localhost/]#ifconfig docker0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet172.17.42.1netmask255.255.0.0broadcast0.0.0.0 inet6fe80::8cfc:c7ff:fe49:f1aeprefixlen64scopeid0x20<link> ether4e:90:a4:b6:91:91txqueuelen0(Ethernet) RXpackets58bytes3820(3.7KiB) RXerrors0dropped0overruns0frame0 TXpackets6bytes468(468.0B) TXerrors0dropped0overruns0carrier0collisions0 eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet192.168.1.179netmask255.255.255.0broadcast192.168.1.255 inet6fe80::20c:29ff:fedb:b228prefixlen64scopeid0x20<link> ether00:0c:29:db:b2:28txqueuelen1000(Ethernet) RXpackets10562bytes868003(847.6KiB) RXerrors0dropped0overruns0frame0 TXpackets2985bytes390673(381.5KiB) TXerrors0dropped0overruns0carrier0collisions0 lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen0(LocalLoopback) RXpackets16bytes960(960.0B) RXerrors0dropped0overruns0frame0 TXpackets16bytes960(960.0B) TXerrors0dropped0overruns0carrier0collisions0 veth5446780:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet6fe80::c0f4:f5ff:fe71:f3bdprefixlen64scopeid0x20<link> etherc2:f4:f5:71:f3:bdtxqueuelen0(Ethernet) RXpackets7bytes558(558.0B) RXerrors0dropped0overruns0frame0 TXpackets49bytes3894(3.8KiB) TXerrors0dropped0overruns0carrier0collisions0 veth111b1ca:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet6fe80::4c90:a4ff:feb6:9191prefixlen64scopeid0x20<link> ether4e:90:a4:b6:91:91txqueuelen0(Ethernet) RXpackets7bytes558(558.0B) RXerrors0dropped0overruns0frame0 TXpackets13bytes1026(1.0KiB) TXerrors0dropped0overruns0carrier0collisions0 veth55dbbb2:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet6fe80::c84d:9ff:fecd:da27prefixlen64scopeid0x20<link> etherca:4d:09:cd:da:27txqueuelen0(Ethernet) RXpackets7bytes558(558.0B) RXerrors0dropped0overruns0frame0 TXpackets42bytes3336(3.2KiB) TXerrors0dropped0overruns0carrier0collisions0 veth5e2dff4:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet6fe80::9465:1bff:fed2:f75dprefixlen64scopeid0x20<link> ether96:65:1b:d2:f7:5dtxqueuelen0(Ethernet) RXpackets7bytes558(558.0B) RXerrors0dropped0overruns0frame0 TXpackets20bytes1584(1.5KiB) TXerrors0dropped0overruns0carrier0collisions0 veth628d605:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet6fe80::5cc8:ebff:fedb:ea69prefixlen64scopeid0x20<link> ether5e:c8:eb:db:ea:69txqueuelen0(Ethernet) RXpackets7bytes558(558.0B) RXerrors0dropped0overruns0frame0 TXpackets6bytes468(468.0B) TXerrors0dropped0overruns0carrier0collisions0 veth991629e:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet6fe80::b464:e5ff:fed5:1bd6prefixlen64scopeid0x20<link> etherb6:64:e5:d5:1b:d6txqueuelen0(Ethernet) RXpackets7bytes558(558.0B) RXerrors0dropped0overruns0frame0 TXpackets27bytes2142(2.0KiB) TXerrors0dropped0overruns0carrier0collisions0 vethb086b1c:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet6fe80::dcdf:66ff:fed8:f2dfprefixlen64scopeid0x20<link> etherde:df:66:d8:f2:dftxqueuelen0(Ethernet) RXpackets8bytes636(636.0B) RXerrors0dropped0overruns0frame0 TXpackets34bytes2700(2.6KiB) TXerrors0dropped0overruns0carrier0collisions0 [root@localhost/]#exit exit
与宿主机的IP信息对比
[root@localhost~]#ifconfig docker0Linkencap:EthernetHWaddr4E:90:A4:B6:91:91 inetaddr:172.17.42.1Bcast:0.0.0.0Mask:255.255.0.0 inet6addr:fe80::8cfc:c7ff:fe49:f1ae/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:58errors:0dropped:0overruns:0frame:0 TXpackets:6errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:3820(3.7KiB)TXbytes:468(468.0b) eth0Linkencap:EthernetHWaddr00:0C:29:DB:B2:28 inetaddr:192.168.1.179Bcast:192.168.1.255Mask:255.255.255.0 inet6addr:fe80::20c:29ff:fedb:b228/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:10661errors:0dropped:0overruns:0frame:0 TXpackets:3012errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:876797(856.2KiB)TXbytes:398049(388.7KiB) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:65536Metric:1 RXpackets:16errors:0dropped:0overruns:0frame:0 TXpackets:16errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:960(960.0b)TXbytes:960(960.0b) veth5e2dff4Linkencap:EthernetHWaddr96:65:1B:D2:F7:5D inet6addr:fe80::9465:1bff:fed2:f75d/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:7errors:0dropped:0overruns:0frame:0 TXpackets:20errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:558(558.0b)TXbytes:1584(1.5KiB) vethb086b1cLinkencap:EthernetHWaddrDE:DF:66:D8:F2:DF inet6addr:fe80::dcdf:66ff:fed8:f2df/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:8errors:0dropped:0overruns:0frame:0 TXpackets:34errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:636(636.0b)TXbytes:2700(2.6KiB) veth55dbbb2Linkencap:EthernetHWaddrCA:4D:09:CD:DA:27 inet6addr:fe80::c84d:9ff:fecd:da27/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:7errors:0dropped:0overruns:0frame:0 TXpackets:42errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:558(558.0b)TXbytes:3336(3.2KiB) veth111b1caLinkencap:EthernetHWaddr4E:90:A4:B6:91:91 inet6addr:fe80::4c90:a4ff:feb6:9191/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:7errors:0dropped:0overruns:0frame:0 TXpackets:13errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:558(558.0b)TXbytes:1026(1.0KiB) veth628d605Linkencap:EthernetHWaddr5E:C8:EB:DB:EA:69 inet6addr:fe80::5cc8:ebff:fedb:ea69/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:7errors:0dropped:0overruns:0frame:0 TXpackets:6errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:558(558.0b)TXbytes:468(468.0b) veth991629eLinkencap:EthernetHWaddrB6:64:E5:D5:1B:D6 inet6addr:fe80::b464:e5ff:fed5:1bd6/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:7errors:0dropped:0overruns:0frame:0 TXpackets:27errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:558(558.0b)TXbytes:2142(2.0KiB) veth5446780Linkencap:EthernetHWaddrC2:F4:F5:71:F3:BD inet6addr:fe80::c0f4:f5ff:fe71:f3bd/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:7errors:0dropped:0overruns:0frame:0 TXpackets:49errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:558(558.0b)TXbytes:3894(3.8KiB)
container模式
使用–net=Container:container_id/container_name,多个容器使用共同的网络看到的ip是一样的。
[root@localhost~]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 7169e8be6d3ecentos"/bin/bash"AboutanhouragoUpAboutanhourserene_goldstine 4cd696928bbecentos"bash"AboutanhouragoUpAboutanhourcent_testv2 4f5bf6f33f2ccentos"bash"AboutanhouragoUpAboutanhourgloomy_colden 0a80861145c9centos"bash"AboutanhouragoUpAboutanhourmad_carson fb45150dbc21centos"bash"AboutanhouragoUpAboutanhourcent_testv 3222c7c5c456centos"bash"2hoursagoUp2hourssick_albattani e136b27a8e17centos"bash"2hoursagoUp2hourstender_euclid [root@localhost~]#dockerexec-it7169bash [root@7169e8be6d3e/]#ifconfig bash:ifconfig:commandnotfound [root@7169e8be6d3e/]#yuminstall-ynet-toolsifconfig [root@7169e8be6d3e/]#ifconfig eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet172.17.0.8netmask255.255.0.0broadcast0.0.0.0 inet6fe80::42:acff:fe11:8prefixlen64scopeid0x20<link> ether02:42:ac:11:00:08txqueuelen0(Ethernet) RXpackets5938bytes15420209(14.7MiB) RXerrors0dropped0overruns0frame0 TXpackets4841bytes329652(321.9KiB) TXerrors0dropped0overruns0carrier0collisions0 lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen0(LocalLoopback) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 [root@7169e8be6d3e/]#exit exit [root@localhost~]#dockerrun-it--rm--net=container:7169centos_with_netbash [root@7169e8be6d3e/]#ifconfig eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet172.17.0.8netmask255.255.0.0broadcast0.0.0.0 inet6fe80::42:acff:fe11:8prefixlen64scopeid0x20<link> ether02:42:ac:11:00:08txqueuelen0(Ethernet) RXpackets5942bytes15420377(14.7MiB) RXerrors0dropped0overruns0frame0 TXpackets4855bytes330480(322.7KiB) TXerrors0dropped0overruns0carrier0collisions0 lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen0(LocalLoopback) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0
none模式
使用–net=none指定,这种模式下不会配置任何网络。
[root@localhost~]#dockerrun-it--rm--net=nonecentos_with_netbash [root@67d037935636/]#ifconfig lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen0(LocalLoopback) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0
bridge模式(默认模式)
使用–net=bridge指定,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的NetworkNamespace。类似于Vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!