本文最后更新于:2023年12月5日 晚上
docker 网络支持 5 种网络模式:none、bridge、host、container、network-net
创建新容器时,docker run
命令可以指定网络模式:
bridge 模式
默认模式,容器连接到一个虚拟网桥与外界通信,通过 SNAT 访问外网,通过 DNAT 可以让容器被外部主机访问,所以此模式也称为 NAT 模式
此模式会启动宿主机的 ip_forward 功能
bridge 模式特点:
- 网络资源隔离:不同主机的容器之间无法直接通信
- 因为 NAT 转换,所以性能较低
- 端口管理繁琐,每个容器必须手动指定唯一的端口,容易产生端口冲突
修改默认的 bridge 模式网络配置:
方法一:修改 docker.service
方法二:修改 daemon.json,推荐这种方法
host 模式
容器和宿主机之间网络不隔离(其他资源隔离),容器不创建自己的虚拟网卡,而是使用宿主机的网卡和 IP 地址,因此在容器里面查看到的 IP 信息就是宿主机的信息,访问容器的时候直接使用宿主机 IP+容器端口即可
此模式由于直接使用宿主机的网络无需转换,网络性能最高,但是各容器内使用的端口不能相同,适用于运行容器端口比较固定的业务
host 网络模式特点:
- 共享宿主机网络
- 网络性能无损耗
- 网络故障排除相对简单
- 各容器网络无隔离
- 网络资源无法分别统计
- 端口管理困难: 容易产生端口冲突
- 不支持端口映射
范例:
none 模式
容器不会进行任何网络配置,没有网卡、没有 IP 也没有路由,因此默认无法与外界通信,需要手动添加网卡配置 IP 等,所以极少使用
containter 模式
指定一个已经存在的容器(选择与其通信频繁的容器),共享其网络,因此这个容器的端口不能和被指定容器的端口冲突
这种模式也较少使用
自定义网络模式
自定义网络内的容器可以直接通过容器进行相互的访问
可以使用自定义网络模式,实现不同集群应用的独立网络管理,而互补影响,而且在一个网络内,可以直接利用容器名称相互访问,非常便利
创建自定义网络:
容器间通信
禁止同宿主机的不同容器间通信
docker.service
daemon.json
容器名称互联
前文中,自定义网络模式,可以实现容器名称互联,如果是默认模式,想要实现这个功能,需要在创建容器时,使用–link 选项
范例:实现 a1 和 a2 容器名称互联
同宿主机之间不同网络的容器通信
同一个宿主机,创建两个容器,一个使用自定义网络,一个使用默认的 bridge 模式,默认这两个容器是无法通信的,如果想要实现通信,有两种方式:修改 iptables 规则 和 通过docker network connect
实现
本笔记只记录第二种方式:
范例:默认 docker0 中的容器为 test1,自定义网络 test-net 中的容器为 test2
docker 容器创建后,必不可少的要和其它主机或容器进行网络通信
docker 的网络模式和 KVM 很相似
docker 网络连接模式
跨宿主机的容器之间网络通信
四种方法:
- 桥接
- NAT
- Open vSwitch
- weave
生产中,以上四种都不用,而是通过 k8s 实现,如果真的用到了,再回来复习课件
案例:docker & LVS 实现网络架构高可用
整体规划图:
过程略..