Docker中的网络怎么选?

182 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17天,点击查看活动详情

Docker网络概述

刚接触Docker的时候只是匆匆看了如何上手的章节从而跳过了很多重要额知识,直到项目在测试环境中偶发会出现Dubbo接口调用问题却找不到好的解决方案时,我才想到要来Docker官网中找寻我想要的答案,起初我很纳闷为啥容器内需要划分这几种类型的网络。但随着看完这几种类型的网络介绍后,我心中的困惑才被一一一解开,不得不佩服其设计理念的高明之处!network其实是Docker创造的虚拟环境中的一部分,让应用具有自己独立的网络体系,形成容器自身的网络设备、网络相关模块、IP协议栈、IP路由表、端口套接字等。

image.png

1、none网络

none就是无,none网络就是什么网络都没有!意思是挂载在这个网络下的容器是不带任何网卡的,可以说是一个封闭的网络。如果说你的应用对安全性有要求且不需要连接其他网络的可以使用none网络。

image.png

2、host网络

host网络共享Docker host的网络栈,即容器的网络配置与host一模一样。我们尝试运行一个容器busybox,然后在容器内查看ip和hostname你会发现和宿主机完全一样。

docker run -it --network=host busybox
image.png

host网络最大的优势在于性能,如果你容器中部署的应用对网络传输效率要求较高时,不妨选择host网络。缺点也很明显,就是宿主机上已经使用的端口,容器内便不能再使用了。

3、bridge网络

在Linux上安装Docker成功后会默认创建一个docker0的bridge。如果我们在创建容器时不指定network的话则会默认挂载在docker0上。

image.png

我们使用brctl show命令可以看到目前还没有容器挂载在docker0下,这时我们不妨启动一个不指定任何network的httpd容器。启动后就会看到docker0下多了一个网络接口veth26a6897,veth26a6897就是创建出的虚拟网卡。

image.png

这时我们可以尝试进入容器内,查看该网卡的ip地址,可以看到分配了IP地址为172.17.0.2,这就是我之前说的测试环境出现的问题,我司的项目是微服务多模块,服务间采用dubbo调用,结果服务间调用时提示接口不存在。如果当时我了解容器网络的知识的话可能就很快解决这个问题了。这里IP地址和网关都是从docker0网卡那得来的

image.png

我们不妨在宿主机上输入 ifconfig docker0 命令查看docker0的IP和网关就一目了然了

image.png

4、user-defined网络

我们除了Docker提供的三种网络模型外还可以选择根据自身业务需求创建自定义网络。Docker提供了三种自定义网络驱动:bridge、overlay和macvlan。其中overlay和macvlan支持创建跨主机的网络。

我们尝试使用bridge驱动创建一个自定义的网络,创建完成后查看网络结构变化,会出现一个新的br-cd68c5373bf4网桥。

image.png

我们可以通过docker network inspect 查看刚创建的网桥的配置信息,可以看到新的my_net是bridge驱动,且分配的地址网段是172.18.0.0/16

image.png

当然我们也可以自定义网段,通过 --subnet和--gateway参数来设置

image.png

新建的网络如果需要应用在某个容器上,可以通过启动命令行添加--network来制定,当启动多个容器都归属于同一网络内多个容器之间是可以互相通信的。

docker run -it --network=my_net2 busybox