docker(5、网络1) 网络的几种类型 和网络互通添加网卡
Docker 提供的几种原生网络
Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls
命令查看:
none 网络
在容器创建时,不指定任何网络模式。由用户自己在适当的时候去指定。手动使用none模式来实现两个容器之间的互通
封闭隔离,对安全性要求高并且不需要联网的应用。某个容器的唯一用途是生成随机密码
host 网络
Host模式顾名思义就是共用主机的网络,它的网络命名空间和主机是同一个,使用宿主机Namespace、IP和端口。
可以通过 --network=host
指定使用 host 网络
在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的
Docker host 容器可以直接配置 host 网路。最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。
缺点就是牺牲一些灵活性,端口冲突问题,Docker host 上已经使用的端口就不能再用
bridge 网络
Docker 安装时会创建一个 命名为 docker0
的 linux bridge。如果不指定--network
,创建的容器默认都会挂到 docker0
上
当前 docker0 上没有任何其他网络设备
一个新的网络接口 vethaa1ec79
被挂到了 docker0
上,vethaa1ec79
就是新创建容器的虚拟网卡
实际上 [email protected]
和 vethaa1ec79
是一对 veth pair。veth pair 是一种成对出现的特殊网络设备
[email protected]
已经配置了 IP 172.17.0.2
,通过 docker network inspect bridge
看一下 bridge 网络的配置信息:
bridge 网络配置的 subnet 就是 172.17.0.0/16,并且网关是 172.17.0.1 就是 docker0
也可以看到容器的网络信息
容器网络拓扑结构如图
自定义网络
根据业务需要可通过 bridge 驱动创建类似前面默认的 bridge 网络
1、自定义网络自动分配IP段
docker network create --driver bridge my-net # my-net 是我创建的桥
新增了一个网桥 br-85d4990932b8
,这里 85d4990932b8
正好新建 bridge 网络 my_net
的短 id。
执行 docker network inspect
查看一下 my_net
的配置信息: 这里 172.18.0.0/16 是 Docker 自动分配的 IP 网段
1、自定义网络手动分配IP段
创建网段时指定 --subnet
和 --gateway
参数
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my-net2
新的 bridge 网络 my_net2
,网段为 172.22.16.0/24,网关为 172.22.16.1
1、容器要使用新的网络自动分配ip,需要在启动时通过 --network
指定:
docker run -it --network my-net2 busybox
容器的 IP 都是 docker 自动从 subnet 中分配
2、容器要使用新的网络手动分配ip
注:只有使用 --subnet
创建的网络才能指定静态 IP。(my-net不能手动指定会报错,my-net2可以)
(my-net不能手动指定会报错,my-net2可以)报错如下
容器之间互通
同一网桥下的容器可以ping 通 ,不同网桥上的容器如何互通, 解决方法就是在容器上添加一块另一个网桥的网卡
如上图 容器1 是ping不通容器2和容器3的 容器2 和容器3 是可以互通的
如何解决互通容器1ping通容器2和容器3 ,解决方案就是在容器1 上加上容器2和3 的网络
docker network connect my-net2 容器1