博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Docker四种网络模式

Posted on 2018-03-19 17:19  bw_0927  阅读(1037)  评论(0编辑  收藏  举报

 

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