Docker提供几种原生网络,从覆盖范围可以分为单个host上的容器网络和跨多个host的网络。
Doker在安装的时候会自动在host上创建三个网络,使用如下命令查看

docker network ls

docker学习-bridge网络

none 网络

故名思议,none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络。
该网络一般应用到一些对安全性要求高并且不需要联网的应用,比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取

host 网络

连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络。

在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。host 网络的使用场景如下:

直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。

Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables。

brige网络操作

brige网络是应用最广泛的网络类型。
Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上。

brctl show

docker学习-bridge网络

当前docker0上没有任何其他网络设备

创建一个名为net1的Bridge网络

docker network create net1

docker学习-bridge网络
查看net网桥,subnet已经自动配置为

docker network inspect net1

docker学习-bridge网络

创建一个名为net2的bridge网桥,指定subnet=172.10.10.0/24

docker network create --driver bridage --subnet 172.10.10.0/24 --gateway 172.10.10.1 net2

docker学习-bridge网络

启动名为centos1的容器,并加入net1网络

docker run --name centos1 -dit --network=net1 centos

docker学习-bridge网络
启动名为centos2的容器,并加入net2网络
docker学习-bridge网络
启动名为centos3的容器,并加入net2网络,同时指定该容器IP=172.10.10.10
docker run --name centos3 -dit --network=net2 --ip 172.10.10.10 centos
docker学习-bridge网络

分别查看3个centos容器的IP地址信息。其中cnetos2和centos3位于同一网段,centos1与前两者位于不同网段
docker inspect centos1
docker学习-bridge网络
docker inspect centos2
docker学习-bridge网络
docker inspect centos3
docker学习-bridge网络

以下面这张图来理解bridge网络
docker学习-bridge网络
容器主要是通过veth pair连接到 brigde网络,它是一对成对出现的特殊网络设备,简单可以理解为由一根虚拟网线连接起来的一堆网卡,网卡的一头(如eth@if34)在容器中,另外一头(如veth28c57df)挂在网桥docker0上