四、bridge网络模式(默认)
bridge网络模式是默认的网络模式,我们通过下面几个步骤,来理解以下bridge网络模式工作原理
- 第一步:查看容器内部网络接口:我们运行一个容器,如
docker run -it --name test centos /bin/bash
。因为使用-it
参数,此时我们的命令行窗口正在与容器进行交互。执行ip addr
命令,发现容器内部有两个网络接口一个是eth0(注意39这个数字,下文用到),一个是lo(本地回环接口-127.0.0.1)。
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> //此处省略若干不重要信息
39: eth0@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> //此处省略若干不重要信息
- 第二步:测试容器连接宿主机外网:
ping 192.168.1.111
能够ping通,我的容器宿主机ip是192.168.1.111
,证明容器与宿主机之间的网络是通的。 - 第三步:查看宿主机网络接口 :另外开一个宿主机访问终端,在宿主机上使用
ifconfig
命令,我们会看到这样两个网络接口:docker0,veth<随机串>
(如:veth1d3961b)这样2个网络接口。其中docker0是docker安装的时候创建的,veth1d3961b是容器启动的时候创建的。
我们可以猜想一定是上面提到的这些网络接口存在网络连接,才会让容器与宿主机之间存在网络联通。我们使用下面的命令验证一下(都在宿主机上执行)。
# ethtool -S veth1d3961b
NIC statistics:
peer_ifindex: 39
上面的命令说明veth1d3961b相当于一根虚拟网线,一端连接到容器内部的39号网络接口eth0。再看下面的命令,veth1d3961b的另一端连接的是docker0。
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242f757aefd no veth1d3961b
如果brctl命令不存在,使用
yum install bridge-utils
安装
结合上面的这张图,再去理解一下上面的操作。
五、none网络模式
使用下面的命令行创建的容器,使用none网络模式,即:默认没有网络配置,不具有网卡、IP、路由信息。
docker run -it --net=none --name test1 centos /bin/bash
这种模式一般又被称为“隔离模式”,常被用于在容器内完成CPU密集型任务,计算完成后将结果保留到磁盘上。在此过程中,不与外界进行网络连接,从网络层面(断开)保证计算执行过程的安全性。
docker0和宿主机的网络命名空间都不变,只是与容器的网络命名空间没有任何连接。容器之间也没有网络连接。
六、host网络模式
使用下面的命令行创建的容器,使用host网络模式。
docker run -it --net=host --name test2 centos /bin/bash
在这种模式下,容器不会获得独立的Network Namespace,与宿主机操作系统共用一个Network Namespace。即:容器不会虚拟自己的网卡,不会配置自己的IP。宿主机的IP就是容器的IP,容器的端口就是宿主机的端口,所以同一个宿主机下的多个容器不能暴漏同一个端口。
显而易见的是这种网络模式简单,没有那么多的网络接口及数据转发,所以它是性能相对比较好的网络模式。
七、container复用模式
使用下面的命令行创建的容器使用container复用模式,添加 --net="container:name or id"
启动参数可以复制一个已经存在的容器的网络配置, 被复制的容器与复制容器两者的网络完全相同。
- 使用下面的命令创建出来的容器都是bridge模式,二者的ip以及网络配置都是一样的(默认bridge模式)
docker run -it --name test3 centos /bin/bash;
docker run -it --net="container:test3" --name test4 centos /bin/bash;
- 使用下面的命令创建出来的容器都是host模式,二者的ip以及网络配置都是一样的(host模式),并且和宿主机一样。
docker run -it --net=host --name test5 centos /bin/bash;
docker run -it --net="container:test5" --name test6 centos /bin/bash;
八、自定义bridge模式
bridge模式还支持自定义,如下所示:在宿主机范围内定义了一个名称为zimug-bridge的网络,网络模式是bridge。
docker network create --driver bridge zimug-bridge
自定义完成之后,可以通过命令查看该网络,如下所示:
# docker network ls
NETWORK ID NAME DRIVER SCOPE
cc425782673c bridge bridge local
a5b5700dedb4 host host local
fca0cfbdc8f2 none null local
27c745cc28a4 zimug-bridge bridge local
我们通过下面的2个命令,新建2个容器都加入zimug-bridge网络
docker run -it --network=zimug-bridge --name test5 centos /bin/bash;
docker run -it --network=zimug-bridge --name test6 centos /bin/bash;