http://www.dockerinfo.net/1073.html
http://cizixs.com/2016/06/01/docker-default-network
http://cizixs.com/2016/06/12/docker-network-modes-explained
[root@test]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f410a5bf84e3 bridge bridge local
2a802be35d31 host host local
30a90248e0fa none null local
abe4fe096303 v2_nebula-web bridge local
在默认情况下,docker 会在 host 机器上新创建一个 docker0
的 bridge:可以把它想象成一个虚拟的交换机,所有的容器都是连到这台交换机上面的。docker 会从私有网络中选择一段地址来管理容器,比如 172.17.0.1/16
,这个地址根据你之前的网络情况而有所不同。
docker0
就是所有魔法的关键,粗糙地说,是它连接了容器和主机网络。
容器是怎么连接到外面的网络的?
启动一个容器,进到里面的 shell,可以发现:默认情况下,容器内部能够访问外网(当然你本身机器要联通外网)。这个是怎么做到的呢?
每创建一个容器,docker 会新建一对 interfaces,这对 interfaces 最大的特性就是:从一个地方进去的网络报文都能在另外一个接口被接受,就像水管的两头。
一个接口命名为 eth0
,分配给容器内部;另外一个接口命名是 veth**
这样的形式,显示在 host 机器上,连接到 docker0
。
总结一下就是:docker 会在机器上自己维护一个网络,并通过 docker0
这个虚拟交换机和主机本身的网络连接在一起。
===========================================================
Bridge模式
当Docker服务器进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
可以通过brctl show命令查看。
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。
使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
bridge模式如下图所示:
演示:
docker run -tid --net=bridge --name docker_bri1 centos
docker run -tid --net=bridge --name docker_bri2 centos
brctl show
一个container对应一个veth
docker exec -ti docker_bri1 /bin/bash
docker exec -ti docker_bri1 /bin/bash
ifconfig –a
route –n
Host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
Host模式如下图所示:
演示:
docker run -tid --net=host --name docker_host1 ubuntu-base:v3
docker run -tid --net=host --name docker_host2 ubuntu-base:v3
docker exec -ti docker_host1 /bin/bash
docker exec -ti docker_host1 /bin/bash
ifconfig –a 此时不会为容器创建各自独立的veth
route –n
http://blog.csdn.net/vchy_zhao/article/details/70269408
例如,如果宿主机的Ip地址是10.203.2.243
,使用host模式新建一个容器,加入容器中运行的是Nginx应用,绑定在容器的80端口上,外部主机可以直接通过10.203.2.243:80
访问容器中的web应用,而使用docker run
运行容器时不需要指定-p参数.
即在使用host模式时,容器中的应用都直接绑定在宿主机的端口上,没有NAT转换.但容器的其他如文件系统等还是隔离的.
这种模式下,在容器中运行ifconfig
命令会显示宿主机eth0的信息.
Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
两个容器的进程可以通过 lo 网卡设备通信。
Container模式示意图:
演示:
docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3
docker exec -ti docker_con1 /bin/bash
docker exec -ti docker_bri1 /bin/bash
ifconfig –a
route -n
None模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
Node模式示意图:
演示:
docker run -tid --net=none --name docker_non1 ubuntu-base:v3
docker exec -ti docker_non1 /bin/bash
ifconfig –a
route -n
推