当前位置:首页 » 《关注互联网》 » 正文

Docker 4 (网络模式:Docker原生网络、自定义网络、容器通信、跨主机容器网络)_奋斗的小猴的博客

25 人参与  2021年08月12日 09:23  分类 : 《关注互联网》  评论

点击全文阅读


目录

  • 一、Docker原生网络
    • 1.桥接网络
    • 2.host网络
    • 3.none模式
  • 二、Docker自定义网络
    • 1.创建自定义网桥
    • 2.双网卡实现不同网段间通信
  • 三、Docker容器通信
    • 1.内部访问外部
    • 2.外部访问内部
  • 四、跨主机容器网络
    • 1.跨主机同网段容器通信
    • 2.跨主机不同网段容器通信

一、Docker原生网络

docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。docker安装后会自动创建3种网络:bridge、host、none;
首先将前面的harbor仓库停掉
请添加图片描述
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
请添加图片描述

1.桥接网络

主机可以直接访问,外部主机是不可见的。容器通过宿主机的NAT规则后可以访问外网。
在这里插入图片描述
安装网桥管理工具包
请添加图片描述
查询网桥信息
请添加图片描述
运行一个容器查看桥接
请添加图片描述
删除掉容器之后,桥接又消失了!
请添加图片描述

2.host网络

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性;
在这里插入图片描述

host网络模式需要在容器创建时指定 --network=host;
可以看到桥接口上没有出现新的桥接口
请添加图片描述
我们查看端口,可以发现docker运行容器所使用的镜像nginx占用的是80端口
请添加图片描述
这时如果再运行一个容器,起名为demo2,启动之后,查看进程有两个进程demo,demo2
请添加图片描述
但是很快再查看进程,demo2消失了,这是因为加上参数–network host会占用虚拟机的80端口,所以刚开始尝试启动会看到进程,但是会被demo的80端口挤掉demo2
请添加图片描述
查看日志
请添加图片描述

3.none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用。 --network=none指定;
先删除掉刚才创建的容器
请添加图片描述
重新运行容器,ip addr的可以看到只有lo接口
请添加图片描述

二、Docker自定义网络

1、自定义网络模式,docker提供了三种自定义网络驱动:bridge、overlay、macvlan;
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。
2、建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。
先运行两个容器
请添加图片描述
docker inspect : 获取容器/镜像的元数据,查看各自的ip
请添加图片描述
请添加图片描述
可以看到和docker 0处于同一网段
请添加图片描述
当容器停掉时,资源会释放,重新启动则会按照启动顺序分配动态ip;
启动顺序为先启动demo2容器再demo1
请添加图片描述
此时demo2容器分到的ip是172.17.0.2
请添加图片描述
demo1容器分到的ip是172.17.0.3
请添加图片描述
运行busybox镜像产生的容器,分配到的ip是172.17.0.4且容器可以相互ping通
请添加图片描述
删除容器
请添加图片描述

1.创建自定义网桥

查看类型为bridge
请添加图片描述
使用自定义网桥运行容器
请添加图片描述
再运行一个容器,发现可以ping 通demo1,说明这个模式是可以提供解析
请添加图片描述
还可以自己定义网段:在创建时指定参数:–subnet 、–gateway
请添加图片描述
查看信息
请添加图片描述
使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的
请添加图片描述
请添加图片描述
使用自定义网络再运行busybox镜像产生的容器,测试连通性
请添加图片描述
可以ping通
请添加图片描述

2.双网卡实现不同网段间通信

创建一个新的自定义网络mynet1
请添加图片描述
分别用不同的自定义网络,启动busybox镜像容器
请添加图片描述
可以看到,桥接到不同网桥上的容器,彼此是不通信的,docker在设计上就是要隔离不同network的;
那么如何使两个不同网桥的容器通信呢?可以使用 docker network connect命令为容器添加第二块网卡
请添加图片描述
用mynet1启动busybox镜像容器
请添加图片描述
为该容器配置第二块网卡;
docker attach :连接到正在运行中的容器,再查看其ip,已经有了另一网段的ip,且可以ping通了
请添加图片描述

三、Docker容器通信

容器之间除了使用ip通信外,还可以使用容器名称通信,docker 1.10开始,内嵌了一个DNS server。dns解析功能必须在自定义网络中使用,启动容器时使用 --name 参数指定容器名称。
Joined容器一种较为特别的网络模式,在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
请添加图片描述
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信;
在这里插入图片描述
再运行一个容器
请添加图片描述
–link 可以用来链接2个容器;
–link的格式:
–link < name or id >:alias
name和id是源容器的name和id,alias是源容器在link下的别名;
测试可以ping通
请添加图片描述
查看busybox的容器的域名解析文件,看到demo对应的ip是172.17.0.2
请添加图片描述
停掉demo容器,用nginx镜像重新运行一个容器test
请添加图片描述
此时这个容器被分配到172.17.0.2的ip
请添加图片描述
再启动demo,查看ip
请添加图片描述
请添加图片描述
连接到运行中的busybox的容器,查看/etc/hosts,发现已经自动修改了解析
请添加图片描述

1.内部访问外部

容器如何访问外网是通过iptables的SNAT实现的;
在这里插入图片描述
可以看到路由转发功能是开启的
请添加图片描述
真机打开火墙,开启地址伪装
请添加图片描述
那么我们在容器里面可以ping百度
请添加图片描述

2.外部访问内部

外网访问容器用到了docker-proxy和iptables DNAT,宿主机访问本机容器使用的是iptables DNAT,外部主机访问容器或容器之间的访问是docker-proxy实现;
运行容器,端口映射:-p 选项指定映射端口(访问宿主机的80端口就相当于访问Docker的80端口);
docker port :列出指定容器的端口映射
请添加图片描述
docker history nginx 也可以看到暴露的端口为80
请添加图片描述
iptables -L 列出所有规则
请添加图片描述
请添加图片描述
查看iptables DNAT目的地转换规则
请添加图片描述
请添加图片描述
真机访问宿主机的80端口,就可以成功访问到容器
请添加图片描述
docker-proxy进程占用的就是80端口
请添加图片描述
将iptables里面目的地转换规则的第六条删除
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
再次测试,发现依然能访问到nginx发布页面
请添加图片描述
将docker-proxy进程杀掉
请添加图片描述
此时外网就无法访问容器了
请添加图片描述
重新添加iptables策略
请添加图片描述
请添加图片描述
发现外网又可以访问到容器
请添加图片描述

四、跨主机容器网络

1.跨主机同网段容器通信

跨主机网络解决方案: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可以通信
在这里插入图片描述
请添加图片描述

ip link set eth1 promisc on:网卡监听模式设为混杂模式;
打开之后,ip addr的eth0出现了promisc模式!!
请添加图片描述
将之前实验的网络桥接都删除掉
请添加图片描述
同样的打开server2的网卡混杂模式
请添加图片描述
创建macvlan1网络,并使用macvlan1网络运行busybox镜像容器
请添加图片描述
server2导入镜像
请添加图片描述
同样的server2也创建macvlan1网络在这里插入图片描述
并使用macvlan1网络运行busybox镜像容器,测试可以相互ping通
请添加图片描述
请添加图片描述

2.跨主机不同网段容器通信

1、macvlan网络方案实现:Linux kernel提供的一种网卡虚拟化技术,无需Linux bridge,直接使用物理接口,性能极好。macvlan网络结构分析:没有新建linux bridge,容器的接口直接与主机网卡连接,无需NAT或端口映射。
2、macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络,vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。
3、macvlan网络间的隔离和连通:
macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的,可以在三层上通过网关将macvlan网络连通起来,docker本身不做任何限制,像传统vlan网络那样管理即可。
在两台docker主机上各添加一块网卡

请添加图片描述
请添加图片描述
添加网卡之后,查看eth1可以看到没有ip只是一个网卡;
ip link set up eth1让它启用
请添加图片描述
编辑网卡的配置文件
请添加图片描述
重新激活网卡;
发现已经激活但是promisc模式还没有打开
请添加图片描述
开启eth1的网卡混杂模式
请添加图片描述
server2也做相同的操作
请添加图片描述
server1和server2创建macvlan2网络
在这里插入图片描述
请添加图片描述
server1和server2使用macvlan2网络运行busybox镜像容器
请添加图片描述
可以看到相互都可以ping通
请添加图片描述
请添加图片描述
server1以macvlan2的网络模式运行demo容器,如何使两个不同网桥的容器通信呢;
使用 docker network connect命令为demo添加一块macvlan1 的网卡
请添加图片描述
可以看到demo的信息中会自动生成和 macvlan1同网段的ip:172.20.0.2
请添加图片描述
此时server2以macvlan1网络模式运行busybox镜像容器,可以ping通server1以macvlan2的网络模式运行demo容器;
即不同网段的ip是无法互通的,但是两个处于不同网段的容器可以通过docker network connect macvlan1 demo的方式来生成同一网段IP地址的方式来实现容器间的通信
请添加图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/25192.html

容器  网络  网段  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1