容器与主机、容器与容器之间是互相隔离的。同时,我们可以通过配置 docker 网络,为容器创建完全独立的网络命名空间,或者使容器共享主机或者其他容器的网络命名空间,以应对不同场景的需要。
这里有4 种常用的单宿主机网络模式:
- bridge 模式;
- host 模式;
- container 模式;
- none 模式。
1 bridge模式
Docker 服务启动时,会自动在宿主机上创建一个 docker0 虚拟网桥 (Linux Bridge, 可以理解为一个软件虚拟出来的交换机)。它会在挂载到它的网口之间进行转发。同时 Docker 随机分配一个可用的私有 IP 地址给 docker0 接口。如果容器使用默认网络参数启动,那么它的网口也会自动分配一个与 docker0 同网段的 IP 地址。
获取两个容器的ip地址,互相ping一下,证明它们的网络能够连通
此时网络拓扑结构如下所示:
1.1 自定义网桥
除了使用默认 docker0 做网桥,我们还可以使用docker network相关命令自定义网桥:
这里将创建一个网桥br0,设定网段是172.71.0.0/24,网关为172.71.0.1:docker network create -d bridge --subnet '172.71.0.0/24' --gateway '172.71.0.1' br0# -d 指定管理网络的驱动方式,默认为bridge# --subnet 指定子网网段# --gateway 指定默认网关
docker run -d -t --network br0 --name b2 busyboxdocker run -d -t --network br0 --name b3 busybox# 互相 ping 一下验证网络连通docker exec b2 ping b3docker exec b3 ping b2
ping 测试过程中,输入的并不是 IP,而是容器名。在自定义网桥中,容器名会在需要的时候自动解析到对应的 IP,也解决了容器重启可能导致 IP 变动的问题。
1.2 端口映射访问容器
将宿主机的本地端口,与指定容器的服务端口进行映射绑定,之后访问宿主机端口时,会将请求自动转发到容器的端口上,实现外部对容器内网络服务的访问。
2 host模式
host 模式下启动的容器,网络不再与宿主机隔离,访问容器服务可以直接使用访问宿主机对应的网络端口,且不需要端口转发。
网络拓扑图:
5 总结
- bridge模式:使用端口映射访问容器是常用的方式之一,它配置简单,通用性强,可以跨宿主机访问,基本覆盖个人日常使用的场景,但它仍有一些缺陷。
- host模式:host 模式下的容器与宿主机共享同一个网络环境,容器可以使用宿主机的网卡和外界的通信,不需要转发拆包,性能好。但 host 模式也有非常严重的缺点:容器没有隔离的网络,会与其他服务竞争宿主机的网络,导致宿主机网络状态不可控,因此无法用在生产环境。
- container模式:在 container 模式下的容器,会使用其他容器的网络命名空间,其网络隔离性会处于 bridge 桥接模式与 host 模式之间:当容器共享其他容器的网络命名空间,则在容器之间不存在网络隔离;而它们又与宿主机以及其他不在此共享中的容器存在网络隔离。
- none 模式提供了一种空白的网络配置,方便用户排除其他干扰,用于自定义网络。
