前言
Docker网络主要解决下面几个问题:
同一个宿主机上的多个容器之间如何通信
容器与外部如何通信
跨主机容器如何通信
同一个宿主机上多容器之间的通信
同一个宿主机上多容器之间的网络可以分为下面几种网络:none网络、host网络、bridge网络、user-defined网络。其中前面三种网络,在安装docker时会自动创建,如下图我们可以通过命令docker network ls查看:
所谓none网络,其实就是没有网络。当一个容器挂在到该网络时,该容器只有用于本地LOOPBACK的网卡,没有其他可以与外部通讯的网卡。创建容器时时我们可以通过 --network=none指定使用none网络:docker run -it --newwork=none busybox
所谓host网络是指容器共享Docker 宿主机的网络栈。我们可以在创建容器时使用 --network=host指定使用host网络:docker run -it --network=host busybox
所谓bridge网络是指Docker安装时会创建的命名为docker0的Linux bridge。如果创建容器时不指定--network,则默认容器都会挂到docker0上。
所谓user-defined网络,是指用户可以根据业务需要创建user-defined网络,Docker提供三种user-defined网络驱动:bridge、overlay和macvlan。比如创建bridge网络示例:docker network create --driver bridge my_network
同一个宿主机上的多个容器容器要能通信,必须要有属于同一个网络的网卡。然后容器就可以通过IP交互了。具体做法是在容器创建时通过 --network指定同一个网络,或者通过docker network connect将现有容器加入到指定网络
容器与外部如何通信
首先我们先看在容器内是否可以访问外部网络,如下我们在容器内ping www.baidu.com可知是通的,其实这是通过NAT实现的
然后我们看外部如何访问容器网络,如下图我们启动了一个容器:
然后我们在浏览器里面访问http://localhost:8080/就可以看到容器内部启动的监听端口为80的服务。其实我们创建容器时,通过端口映射把宿主机上的8080端口映射到了容器内部的80端口,从而实现外部可以访问容器内部的服务。
跨主机容器通信
跨主机网络方案包括:
(1)docker原生的overlay和macvlan;
(2)第三方方案:常用的包括flannel、weave和calico
本文我们研究overlay,为支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于VxLAN的overlay网络。VxLAN可将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的以太网二层服务,但是拥有更强的扩展性和灵活性
我们可以使用docker network create -d overlay my_overlay_network来创建一个overlay网络。一开始执行会报错如下:
这时我们需要执行下面命令,让当前节点成为管理节点,然后就可以创建覆盖网络:
然后我们就可以在创建容器时指定网络为该覆盖网络。
最后我们可以在另外一个机器2上执行下面命令让该机器成为机器1的管理节点:
然后再机器2也启动一个容器,并且指定网络为覆盖网络,则这两个容器就可以跨主机通信了。
戳下面阅读
👇
点亮再看哦👇