Docker原生网络,自定义网络,容器间通信

dokcer原生网络
  1. docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。
  2. docker安装后会自动创建3种网络:bridge、host、none
    可以使用命令查看
    在这里插入图片描述
  3. docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
# ip addr show docker0

Docker原生网络,自定义网络,容器间通信_第1张图片
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。容器通过宿主机的NAT规则后可以访问外网。
Docker原生网络,自定义网络,容器间通信_第2张图片

Docker原生网络,自定义网络,容器间通信_第3张图片
host网络模式需要在容器创建时指定 --network=host

# docker run -it --name vm1 --network host ubuntu

Docker原生网络,自定义网络,容器间通信_第4张图片
4. host模式可以让容器共享宿主机网络线,这样的好处是外部主机与容器的直接通信,但容器的网络缺少隔离性
Docker原生网络,自定义网络,容器间通信_第5张图片
none模式是指禁用网络功能,只有lo接口,在容器创建时使用
–network=none指定。

# docker run -it --name vm3 --network none ubuntu

在这里插入图片描述

dokcer自定义网络
  1. docker提供了三种自定义网络驱动:
  • bridge
  • overlay
  • macvlan

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
overlay和macvlan是用于创建跨主机网络。

建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。

  1. 创建自定义网桥
# docker run -it --name vm4 --network my_net1
# docker run -it --name vm4 --network my_net1 ubuntu
root@354e0a0c4a9d:/# ping vm4 

在这里插入图片描述
3. 还可以自定义网段

# docker network create --subnet 172.24.0.0/24 --gateway 172.24.0.1 my_net2
# docker network inspect my_net2

Docker原生网络,自定义网络,容器间通信_第6张图片
4. 使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的

# docker run -it --name vm5 --network my_net2 --ip 172.24.0.11 ubuntu

Docker原生网络,自定义网络,容器间通信_第7张图片

# docker run -it --name vm6 --network my_net2 --ip 172.24.0.12 ubuntu

Docker原生网络,自定义网络,容器间通信_第8张图片
Docker原生网络,自定义网络,容器间通信_第9张图片
在这里插入图片描述
桥接到不同网桥上的容器,彼此是不通信的
Docker原生网络,自定义网络,容器间通信_第10张图片那么如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为vm1添加一块my_net2 的网卡。
Docker原生网络,自定义网络,容器间通信_第11张图片

# docker network connect my_net2 vm2 

Docker原生网络,自定义网络,容器间通信_第12张图片

docker容器通信

容器之间除了使用ip通信外,还可以使用容器名称通信。

  • docker 1.10开始,内嵌了一个DNS server。
  • dns解析功能必须在自定义网络中使用。
  • 启动容器时使用 --name 参数指定容器名称。
# docker run -d --name vm1 --network my_net1 nginx:1.16
# docker run -it --name vm2 --network my_net1 ubuntu
root@2904c1357156:/# ping vm1 

Docker原生网络,自定义网络,容器间通信_第13张图片

  1. Joined容器一种较为特别的网络模式。
    在容器创建时使用–network=container:vm2指定。(vm2指定的是运行的容器名)
    处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
    Docker原生网络,自定义网络,容器间通信_第14张图片
# docker run -it --name vm3 --network container:vm2 ubuntu

Docker原生网络,自定义网络,容器间通信_第15张图片Docker原生网络,自定义网络,容器间通信_第16张图片
2. --link 可以用来链接2个容器
–link的格式:

  • –link :alias
  • name和id是源容器的name和id,alias是源容器在link下的别名。
# docker run -d --name web nginx:1.16 
# docker run -it --name vm1 --link web:nginx ubuntu
root@7633180228dc:/# ping nginx

在这里插入图片描述

  • 容器是如何访问外网是通过iptables的SNAT实现的
    iptables -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    Docker原生网络,自定义网络,容器间通信_第17张图片
  • 外网如何访问容器
  1. 端口映射
  2. -p 选项指定映射端口
    Docker原生网络,自定义网络,容器间通信_第18张图片
  • 外网访问容器用到了docker-proxy和iptables DNAT
  1. 宿主机访问本机容器使用的是iptables DNAT
  2. 外部主机访问容器或者容器之间的访问是通过docker-proxy实现的
    Docker原生网络,自定义网络,容器间通信_第19张图片
跨主机容器网络
  • 跨主机网络解决方案
  1. docker原生的overlay和macvlan
  2. 第三方的flaanel、weave、calico
  • 众多网络方案与docker集成
  1. libnetwork docker容器网络库
  2. CNM(Container Network Model)对容器网络进行抽象

CNM分三类组件

  1. Sandbox 容器网络栈,包含容器接口,dns,路由表,namespace
  2. Endpoint 将sandbox接入network(veth pair)
  3. Network 包含一组endpoint 同一network的endpoint可以通信

Docker原生网络,自定义网络,容器间通信_第20张图片

  • macvlan网络方案实现
  1. Linux kernel提供的一种网卡虚拟化技术
  2. 无需Linux bridge,直接使用物理接口,性能极好

在不同docker主机上添加双网卡,打开网卡的混杂模式

# ip link set eth1 promisc on
# ip link set eth1 up

在这里插入图片描述
docker主机各自创建macvlan网络

#  docker network create -d macvlan --subnet 172.26.0.0/24 --gateway 172.26.0.1 -o parent=eth1 macvlan1
# docker run -it --name vm1 --network macvlan1 --ip 172.26.0.2 ubuntu

# docker network create -d macvlan --subnet 172.26.0.0/24 --gateway 172.26.0.1 -o parent=eth1 macvlan1
# docker run  -it --name vm2 --network macvlan1  --ip 172.26.0.4 ubuntu

在这里插入图片描述

  • macvlan网络结构
  1. 没有新建Linux bridge
  2. 容器的接口直接与主机网卡连接,无需做NAT或端口映射
  3. macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
  4. vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。
  • macvlan网络间的隔离和连通
  1. macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
  2. 可以在三层上通过网关将macvlan网络连通起来。
  3. docker本身不做任何限制,像传统vlan网络那样管理即可。

你可能感兴趣的:(Docker原生网络,自定义网络,容器间通信)