容器与主机、容器与容器之间是互相隔离的。同时,我们可以通过配置 docker 网络,为容器创建完全独立的网络命名空间,或者使容器共享主机或者其他容器的网络命名空间,以应对不同场景的需要。
这里有4 种常用的单宿主机网络模式:

  1. bridge 模式;
  2. host 模式;
  3. container 模式;
  4. none 模式。

    1 bridge模式

    Docker 服务启动时,会自动在宿主机上创建一个 docker0 虚拟网桥 (Linux Bridge, 可以理解为一个软件虚拟出来的交换机)。它会在挂载到它的网口之间进行转发。同时 Docker 随机分配一个可用的私有 IP 地址给 docker0 接口。如果容器使用默认网络参数启动,那么它的网口也会自动分配一个与 docker0 同网段的 IP 地址。
    获取两个容器的ip地址,互相ping一下,证明它们的网络能够连通
    此时网络拓扑结构如下所示:
    image.png

    1.1 自定义网桥

    除了使用默认 docker0 做网桥,我们还可以使用 docker network 相关命令自定义网桥:
    这里将创建一个网桥 br0,设定网段是 172.71.0.0/24,网关为 172.71.0.1
    1. docker network create -d bridge --subnet '172.71.0.0/24' --gateway '172.71.0.1' br0
    2. # -d 指定管理网络的驱动方式,默认为bridge
    3. # --subnet 指定子网网段
    4. # --gateway 指定默认网关
  1. docker run -d -t --network br0 --name b2 busybox
  2. docker run -d -t --network br0 --name b3 busybox
  3. # 互相 ping 一下验证网络连通
  4. docker exec b2 ping b3
  5. docker exec b3 ping b2

ping 测试过程中,输入的并不是 IP,而是容器名。在自定义网桥中,容器名会在需要的时候自动解析到对应的 IP,也解决了容器重启可能导致 IP 变动的问题。

1.2 端口映射访问容器

将宿主机的本地端口,与指定容器的服务端口进行映射绑定,之后访问宿主机端口时,会将请求自动转发到容器的端口上,实现外部对容器内网络服务的访问。

2 host模式

host 模式下启动的容器,网络不再与宿主机隔离,访问容器服务可以直接使用访问宿主机对应的网络端口,且不需要端口转发。
网络拓扑图:
image.png

5 总结

  • bridge模式:使用端口映射访问容器是常用的方式之一,它配置简单,通用性强,可以跨宿主机访问,基本覆盖个人日常使用的场景,但它仍有一些缺陷。
  • host模式:host 模式下的容器与宿主机共享同一个网络环境,容器可以使用宿主机的网卡和外界的通信,不需要转发拆包,性能好。但 host 模式也有非常严重的缺点:容器没有隔离的网络,会与其他服务竞争宿主机的网络,导致宿主机网络状态不可控,因此无法用在生产环境
  • container模式:在 container 模式下的容器,会使用其他容器的网络命名空间,其网络隔离性会处于 bridge 桥接模式与 host 模式之间:当容器共享其他容器的网络命名空间,则在容器之间不存在网络隔离;而它们又与宿主机以及其他不在此共享中的容器存在网络隔离。
  • none 模式提供了一种空白的网络配置,方便用户排除其他干扰,用于自定义网络。