一、本地节点通信
1.1 DNS
容器之间除了使用ip通信外,还可以使用容器名称通信。
docker 1.10开始,内嵌了一个DNS server。
dns解析功能必须在自定义网络中使用。
启动容器时使用 --name 参数指定容器名称。
1.2 joind网络模式
- Joined容器一种较为特别的网络模式。
- 在容器创建时使用--network=container:vm1指定。(vm1指定的是运行的容器名)
-
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
此容器的ip为 172.17.0.2 ,我们使用joined网络模型再新建容器:
发现和demo容器一模一样,即指定的容器使用相同网络栈。需要注意的点是:这两个容器监听的端口不能是一样的。
1.3 link网络模式
使用--link
- --link 可以用来链接2个容器。
- --link的格式:
- --link <name or id>:alias
- name和id是源容器的name和id,alias是源容器在link下的别名。
此种方式走的是/etc/hosts 文件。如下如所示:
1.4 单机跨容器通信
容器如何访问外网是通过iptables的SNAT实现的
docker proxy:
- 外网访问容器用到了docker-proxy和iptables DNAT
- 宿主机访问本机容器使用的是iptables DNAT
- 外部主机访问容器或容器之间的访问是docker-proxy实现
新建一个有端口映射的容器:
我们可以看到一条DNAT中重定向的策略:
即外部访问本机的80端口时,会重定向到172.17.0.2 的80端口。这就是端口重定向机制,而docker中使用的是一种双冗余机制:
我们来进行双冗余测试:
我们先将iptables中的端口映射删掉:
但是此时外部仍然是可以访问的:
我们再把进程中的docker-proxy删掉:
在外部继续访问:
两个同时关掉就报错了。再删除docker-proxy试试:
此时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,直接使用物理接口,性能极好。
2.1 相同网段进行通信
在server1上把我们不用的网络删掉:
将server1和server2的混杂模式打开:
创建私有网络,指定macvlan驱动,指定直接使用物理网卡通信:
使用macvlan模式最好手动设置ip,因为此模式下自动设置的ip与本机没有关系:
可以看到此容器没有虚拟网卡:
在server2上创建私有网络:
注:网段必须和server1上的私有网络的网段相同才能通信。
server2上在刚刚建立的私有网络基础上建立容器:
可以看到server2上的容器172.20.0.16 可以ping通 server1上的172.20.0.15 :
macvlan网络结构分析
- 没有新建linux bridge
- 容器的接口直接与主机网卡连接,无需NAT或端口映射。
- macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
- vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
2.2 不同网段进行通信
我们给server1再加一块网卡并将其激活:
打开混杂模式:
在物理网卡eth1上创建macvlan结构网络:
给新建的网络分配容器:
但是在实际生产环境中,大量的用户需要私有网络,我们如果不断的增加网卡其实不太合理,因为硬件有限制,所以我们就可以使用----vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094,我们就可以通过这种方式来进行创建。
我们在server1上进行操作:
我们可以通过这种方式来增加子网的数量。我们现在用的就是通过物理网卡子接口的方式来创建不一样的虚拟网络:
- macvlan网络间的隔离和连通
- macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
- 可以在三层上通过网关将macvlan网络连通起来。
- docker本身不做任何限制,像传统vlan网络那样管理即可。
建议在使用时指定ip地址,防止ip递增冲突。