Docker网络之单host网络及使用案例

Docker网络之单host网络及使用案例

2023年7月6日发(作者:)

Docker⽹络之单host⽹络及使⽤案例前⾔前⾯总结了Docker基础以及Docker存储相关知识,今天来总结⼀下Docker单主机⽹络的相关知识。⽏庸置疑,⽹络绝对是任何系统的核⼼,他在Docker中也占有重要的作⽤。⼀、Docker默认⽹络在新安装docker的主机上执⾏docker network ls便能看到docker默认安装的所有⽹络,分别是none⽹络、host⽹络和bridge⽹络。1.1 none ⽹络none⽹络就是什么都没有的⽹络。挂在这个⽹络下的容器除了lo,没有其他任何⽹卡。容器run时,可以通过添加--network=none参数来指定该容器使⽤none⽹络。那么这样⼀个只有lo的⽹络有什么⽤呢?此处CloudMan指出:none⽹络应⽤与隔离场景,⼀些对安全性要求⾼并且不需要联⽹的应⽤可以使⽤none⽹络。⽐如某个容器的唯⼀⽤途是⽣成随机密码,就可以放到none⽹络中避免密码被窃取。我可以理解none⽹络肯定是⽤于隔离的,然⽽我好奇的是⽣成的随机密码如何发送到外部呢?如何被外部调⽤呢?这是我没有想明⽩的问题。有知道的希望不吝赐教!谢谢!1.2 host ⽹络连接到host⽹络的容器共享Docker宿主机的⽹络栈,即容器的⽹络配置与host宿主机完全⼀样。可以通过添加--network=host参数来指定该容器使⽤host⽹络。在容器中可以看到host的所有⽹卡,并且连hostname也是host的。host⽹络的使⽤场景⼜是什么呢?直接使⽤Docker host的⽹络最⼤的好处就是性能,如果容器对⽹络传输效率有较⾼要求,则可以选择host⽹络。当然不便之处就是牺牲⼀些灵活性,⽐如要考虑端⼝冲突问题,Docker host上已经使⽤的端⼝就不能再⽤了。Docker host的另⼀个⽤途是让容器可以直接配置 host ⽹路。⽐如某些跨host的⽹络解决⽅案,其本⾝也是以容器⽅式运⾏的,这些⽅案需要对⽹络进⾏配置。相当于该容器拥有了host主机的⽹络,那么其ip等配置也相同,相当于主机中套了⼀个与外部⼀模⼀样的容器,可以直接通过host的ip地址来访问该容器。1.3 bridge ⽹络在不指定--network参数或者--network=bridge的情况下创建的容器其⽹络类型都是bridge。Docker在安装时会在宿主机上创建名为docker0的⽹桥,所谓⽹桥相当于⼀个虚拟交换机,如果使⽤上述两种⽅式run的容器都会挂到docker0上。容器和docker0之间通过veth进⾏连接,veth相当于⼀根虚拟⽹线,连接容器和虚拟交换机,这样就使得docker0与容器连通了。⼆、⾃定义容器⽹络理论上有了上述三种⽹络已经⾜够满⾜普通⽤户的需求,但是有时候可能⽤户需要指定⾃⼰的⽹络,以此来适应某些配置,如ip地址规划等等。2.1 创建⾃定义⽹络Docker提供三种user-defined⽹络驱动:bridge,overlay和macvlan。overlay和macvlan⽤于创建跨主机的⽹络,会在下⼀篇⽂章介绍。所以本⽂介绍创建bridge⾃定义⽹络。命令如下:docker network create -d bridge --subnet 172.10.0.0/24 --gateway 172.10.0.1 my_net-d bridge表⽰⾃定义⽹络的驱动为bridge,--subnet 172.10.0.0/24 --gateway 172.10.0.1分别指定⽹段和⽹关。这样就创建好了⼀个⾃动⼀⽹络,可以通过以下命令查看此⽹络的信息:docker network inspect my_net会得到此⽹络的配置信息,my_net是刚刚创建的⽹络名称,如果为bridge就是查看docker创建的默认bridge⽹络信息。每创建⼀个⾃定义⽹络便会在宿主机中创建⼀个⽹桥(docker0是创建的默认⽹桥,其实原理是⼀致的,⽽且也是对等的。)。名字为br-<⽹络短ID>,可以通过brctl show命令查看全部⽹桥信息。docker的⾃定义⽹络与OpenStack中的⽹络信息倒是基本⼀致。所以⼀通百通,只要docker的明⽩了,所有虚拟化甚⾄实体的⽹络也就基本都搞清楚了。2.2 使⽤⾃定义⽹络通过以下命令为容器指定⾃定义⽹络:docker run -it --network my_net --ip 172.10.0.3 busybox其实这与使⽤docker默认⽹络是⼀致的,都是添加--network参数参数,此处也添加了--ip参数来指定容器的ip地址。三、不同容器之间的连通性同⼀个⽹络(默认⽹络或者⾃定义⽹络)下的容器之间是能ping通的,但是不同⽹络之间的容器由于⽹络独⽴性的要求是⽆法ping通的。原因是iptables-save DROP掉了docker之间的⽹络,⼤概如下:-A DOCKER-ISOLATION -i docker0 -o br-ac4fe2d72b18 -j DROP-A DOCKER-ISOLATION -i br-ac4fe2d72b18 -o docker0 -j DROP-A DOCKER-ISOLATION -i br-62f17c363f02 -o br-ac4fe2d72b18 -j DROP-A DOCKER-ISOLATION -i br-ac4fe2d72b18 -o br-62f17c363f02 -j DROP-A DOCKER-ISOLATION -i br-62f17c363f02 -o docker0 -j DROP-A DOCKER-ISOLATION -i docker0 -o br-62f17c363f02 -j DROP那么如何让不同⽹络之间的docker通信呢?接下来介绍容器间通信的三种⽅式。3.1 IP 通信IP通信就是直接⽤IP地址来进⾏通信,根据上⾯的分析需要保证两个容器处于同⼀个⽹络,那么如果不在同⼀个⽹络如何处理呢?如果是实体机我们很容易理解,只需要为其中⼀台服务器添加⼀块⽹卡连接到另⼀个⽹络就可以了。容器同理,只需要为其中⼀个容器添加另外⼀个容器的⽹络就可以了。使⽤如下命令:docker network connect my_net httpdconnect命令能够为httpd容器再添加⼀个my_net⽹络(假设httpd原来只有默认的bridge⽹络)。这样上⾯创建的busybox容器就能与此次connect的httpd容器进⾏通信。3.2 Docker DNS Server通过 IP 访问容器虽然满⾜了通信的需求,但还是不够灵活。因为我们在部署应⽤之前可能⽆法确定IP,部署之后再指定要访问的IP会⽐较⿇烦。对于这个问题,可以通过docker⾃带的DNS服务解决。从Docker 1.10 版本开始,docker daemon 实现了⼀个内嵌的DNS server,使容器可以直接通过“容器名”通信。⽅法很简单,只要在启动时⽤--name为容器命名就可以了。下⾯的命令启动两个容器bbox1和bbox2:docker run -it --network=my_net --name=bbox1 busyboxdocker run -it --network=my_net --name=bbox2 busybox然后,bbox2就可以直接ping到bbox1了,但是使⽤docker DNS有个限制,只能在user-defined⽹络中使⽤。默认的bridge⽹络是⽆法使⽤的。3.3 joined 容器joined 容器是另⼀种实现容器间通信的⽅式。joined 容器⾮常特别,它可以使两个或多个容器共享⼀个⽹络栈,共享⽹卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。host⽹络使得容器与宿主机共⽤同⼀个⽹络,⽽jointed是使得两个容器共⽤同⼀个⽹络。请看下⾯的例⼦:先创建⼀个httpd容器,名字为web1。docker run -d -it --name=web1 httpd然后创建busybox容器并通过--network=container:web1指定jointed容器为web1:docker run -it --network=container:web1 busybox这样busybox和web1的⽹卡mac地址与IP完全⼀样,它们共享了相同的⽹络栈。busybox 可以直接⽤127.0.0.1访问web1的http服务。其实也很容易理解,之前的--network参数指定了默认⽹络或者⾃定义⽹络,⽽此处是指定了⼀个容器,那么当然意思就是使⽤这个容器的⽹络。这也有点类似上⼀篇⽂章讲到的共享存储。joined 容器⾮常适合以下场景:不同容器中的程序希望通过loopback⾼效快速地通信,⽐如web server与app server。希望监控其他容器的⽹络流量,⽐如运⾏在独⽴容器中的⽹络监控程序。其实就是应⽤于即需要独⽴⽽⼜需要两个容器⽹络⾼度⼀致的场景。3.4 容器与外部⽹络的连通性3.4.1 容器访问外部⽹络容器默认是能访问外部⽹络的。通过NAT,docker实现了容器对外⽹(此处外⽹不⼀定是互联⽹)的访问。3.4.2 外部⽹络访问容器通过端⼝映射的⽅式实现外部⽹络访问容器,即通过-p参数实现将容器的端⼝映射到外部端⼝。总结以上所述是⼩编给⼤家介绍的Docker⽹络之单host⽹络及使⽤案例,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688591868a153106.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信