使用docker网络的host模式时,使用下面的命令启动一个容器,当容器启动后,在容器中可以看到宿主机中所有的网络设备,这种方式下在Container中可以操作宿主机的网络资源。
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。这样网络的隔离性基本就丧失了,由于这是Container共享Host的网络和端资源,也就是有些端口宿主机可能已经占用,Container无法再使用。
[root@10-10-63-106 ~]# docker run -i -t --net=host centos6.3-base-v2 /bin/bash
[root@10-10-63-106 /]#
[root@10-10-63-106 /]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 52:54:00:D0:A6:2A
inet addr:10.10.63.106 Bcast:10.10.255.255 Mask:255.255.0.0
inet6 addr: fe80::5054:ff:fed0:a62a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10556531 errors:0 dropped:0 overruns:0 frame:0
TX packets:11149744 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2811097616 (2.6 GiB) TX bytes:2155625978 (2.0 GiB)
Docker
Container的Host模式,由于使用host的网络资源,不需要额外的网桥和建立虚拟的网卡资源。相当于父进程在创建子进程的过程中,由于没有传入CLONE_NEWNET所以我们Container和Host共享同一个网络环境。采用这种方式的Container如果Host的eth接口配置的是公网的IP地址,则Container可以直接使用Host的IP地址提供服务,无需进行NAT地址的转换,提高了效率。这时的Container不再拥有独立的端口号资源,而是需要和Host进行竞争端口资源。