文章目录
- 一、本地节点通信
- 1.DNS
- 2.joind网络模式
- 3.端口映射
- 4.跨主机容器通信
- 二、跨主机容器通信
- 1.相同网段进行通信
- 2.不同网段进行通信
一、本地节点通信
1.DNS
- 容器之间除了使用ip通信外,还可以使用容器名称通信。
- docker 1.10开始,内嵌了一个DNS server。
- dns解析功能必须在自定义网络中使用。
- 启动容器时使用 --name 参数指定容器名称。
2.joind网络模式
- Joined容器一种较为特别的网络模式。
- 在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
- 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
两个容器共享一个网络栈
[root@server7 ~]# docker run -d --name web1 --network my_net1 nginx
[root@server7 ~]# docker run -it --rm --network container:web1 --name web2 busybox
web1容器的ip为 172.17.0.2 ,我们使用joined网络模型再新建容器:
发现和web1容器一模一样,即指定的容器使用相同网络栈。需要注意的点是:这两个容器监听的端口不能是一样的。
3.端口映射
外部主机访问容器可以通过DNAT规则和docker-proxy,只要有一种正常就能通信
我们可以看到一条DNAT中重定向的策略:即外部访问本机的80端口时,会重定向到172.17.0.2 的80端口。这就是端口重定向机制,而docker中使用的是一种双冗余机制;
重启容器后,DNAT规则和docker-proxy策略会自动恢复
4.跨主机容器通信
容器如何访问外网是通过iptables的SNAT实现的
docker proxy:
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
我们来进行双冗余测试:
我们先将iptables中的端口映射删掉:
但是此时外部仍然是可以访问的:
我们再把进程中的docker-proxy删掉:
在外部继续访问:已不能访问
这就是双冗余机制,只要有一种机制存在,就能运行。
本地容器之间的通信是通过网桥转发的,容器都连接的是docker0网桥:
重启后均会恢复
二、跨主机容器通信
-
跨主机网络解决方案
docker原生的overlay和macvlan
第三方的flannel、weave、calico -
众多网络方案是如何与docker集成在一起的
libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象
CNM分三类组件
Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
Endpoint:作用是将sandbox接入network (veth pair)
Network:包含一组endpoint,同一network的endpoint可以通信。
macvlan网络方案实现
- Linux kernel提供的一种网卡虚拟化技术。
- 无需Linux bridge,直接使用物理接口,性能极好。
macvlan网络结构分析
- 没有新建linux bridge
- 容器的接口直接与主机网卡连接,无需NAT或端口映射。
- macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
- vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
macvlan网络间的隔离和连通
macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
可以在三层上通过网关将macvlan网络连通起来。
docker本身不做任何限制,像传统vlan网络那样管理即可。
1.相同网段进行通信
清除不要的网络
两台虚拟机各添加一块虚拟网卡
开启混杂模式并激活
server7:
创建私有网络,指定macvlan驱动,指定直接使用物理网卡通信:
使用macvlan模式最好手动设置ip,因为此模式下自动设置的ip与本机没有关系:
server8以上类推
注:网段必须和server7上的私有网络的网段相同才能通信。
测试已通
2.不同网段进行通信
我们给server1再加一块网卡并将其激活
打开混杂模式:
结构网络:
给新建的网络分配容器:
但是在实际生产环境中,大量的用户需要私有网络,我们如果不断的增加网卡其实不太合理,因为硬件有限制,所以我们就可以使用----vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094,我们就可以通过这种方式来进行创建。
我们在server1上进行操作:
我们可以通过这种方式来增加子网的数量。我们现在用的就是通过物理网卡子接口的方式来创建不一样的虚拟网络:
macvlan网络间的隔离和连通
macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
可以在三层上通过网关将macvlan网络连通起来。
docker本身不做任何限制,像传统vlan网络那样管理即可。
建议在使用时指定ip地址,防止ip递增冲突。