Docker容器技术之Dokcer networking

我们知道,docker容器中的资源用namespace进行了隔离,每一个容器中都有自己独立的一套网络资源,docker容器如何实现单机通讯与跨主机通讯呢?本节内容将为你解答这个问题。

本节索引:

一、Docker networking相关概念

二、Docker单主机容器通信

三、Docker单主机网络配置示例

四、Dokcer跨主机容器通信介绍

 

1

一、Docker networking相关概念

Docker单主机网络创建过程:

1、创建一对虚拟接口,分别放到本地主机和新容器的命名空间中。

2、本地主机一端的虚拟接口连接到默认的docker0网桥或指定网桥上,并具有

一个以veth开头的唯一名字,如veth1234

3、容器一端的虚拟接口将放到新创建的容器中,并修改名字为eth0。这个接口

只在容器的命名空间可见。

4、从网桥可用地址段中获取一个空闲地址分配给容器的eth0(如:172.17.0.2/16),

并配置默认路由网关为docker0网卡的内部接口docker0的IP地址。

 

完成这些配置后,容器就可以使用它所能看到的eth0虚拟网卡来连接其他容器和

访问外部网络。

 

另外,可以在docker运行时通过–net参数来指定容器的网络配置,有四个可选值:

–net=bridgeBridged container 桥接式容器

–net=hostJoined container 联盟式容器

–net=noneClosed container 闭合式容器

–net=containerOpen container 开放式容器

 

四种容器networking结构对比:

2

 

 

二、Docker单主机容器通信

1、bridge模式:

docker容器默认使用bridge模式,在Docker网桥上为容器创建新的网络栈。

 

示例:bridge模式

宿主机将会创建一块虚拟网卡,网卡工作模式为桥接,默认地址为:172.17.0.1/16

3

以默认网络类型(–net=bridge)运行一个容器test

docker run –name test -it –rm busybox:latest

4

也可从容器外注入配置信息,例如:

docker run –name test  -it –rm –dns 114.114.114.114 –add-host www.wxlinux.com:1.1.1.1 busybox:latest

5

 

2、host模式

让容器使用宿主机的用户空间,和物理机共用一套TCP/IP协议栈、IP地址;拥有完全

的本地主机接口访问权限,可以跟主机其他root进程一样打开低范围端口,还可以让

容器做一些影响整个主机系统的事情,例如重启主机。因此使用此选项时要非常小心。

 

示例:host模式

以host网络类型运行一个容器test

6

docker run –name test –network host -it –rm busybox:latest

7

 

 

3、none模式

让Docker将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己

进行配置

 

示例:none模式

8

 

 

4、container模式

也称为联盟式容器:Joined container

让Docker将新建容器的进程放到一个已存在的容器的网络栈中,新容器进程有自己的文件

系统、进程列表和资源限制,但会和已存在的容器共享IP地址和端口等网络资源,两者进

程可以直接通过lo环回接口通信

 

示例:container模式

启动第一个容器

docker run –name test1 -it -rm busybox

9

启动第二个容器,共享test1容器的网络资源

10

 

 

三、Docker单主机网络配置示例

示例一:修改容器默认网桥地址

自定义docker0桥的网络属性信息:/etc/docker/daemon.json文件

{

            “bip”: “192.168.1.5/24”,

            “fixed-cidr”: “10.20.0.0/16”,

            “fixed-cidr-v6”: “2001:db8::/64”,

            “mtu”: 1500,

            “default-gateway”: “10.20.1.1”,

            “default-gateway-v6”: “2001:db8:abcd::89”,

            “dns”: [“10.20.1.2″,”10.20.1.3”]

        }

核心选项为bip,即bridge ip之意,用于指定docker0桥自身的IP地址;其它选项可通过此地

址计算得出。

11

systemctl restart docker

12

 

示例二:docker远程连接其他docker(默认没开启)

dockerd守护进程的C/S,其默认仅监听Unix SOcket格式的地址,/var/run/docker.sock;

如果使用TCP套接字,

vim /etc/docker/daemon.json

“hosts”: [“tcp://0.0.0.0:2375”, “unix:///var/run/docker.sock”]

也可向dockerd直接传递“-H|–host”选项;

 

示例:

docker主机IP:192.168.30.10

本地镜像列表如下:

13

vim /etc/docker/daemon.json

14

重启docker服务

systemctl restart docker

远程访问IP地址:192.168.30.10的镜像

docker -H 192.168.30.10:2375 image ls

15

 

 

示例三:创建另外一个bridge网络桥

默认docker启动后,自带一个docker0的网桥,地址为172.17.0.1/16

创建一个名称为mybr0,地址为172.26.0.0/16的网桥

docker network create -d bridge –subnet “172.26.0.0/16” –gateway “172.26.0.1” mybr0

16

查看网桥

17

 

 

四、Docker跨主机容器通信介绍

18

隧道方案:

Overlay:一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大

规模修改的条件下,实现应用在网络上的承载,并能与其它网络业务分离,并且以基于

IP的基础网络技术为主。Overlay 技术是在现有的物理网络之上构建一个虚拟网络,上

层应用只与虚拟网络相关。

Docker: 跨主机集群网络解决方案的一种,可以用于连接部署在多台主机上的 Docker

容器,使用网络的应用程序不必去配置端口映射等信息,Weave的通信支持加密,所以

用户可以从一个不受信任的网络连接到主机。

Flannel:一个专为kubernetes定制的三层网络解决方案,主要用于解决容器的跨主机通信

问题。

 

隧道方案优缺点:

优点:对底层的网络没有过高的要求,一般来说,只要是在一个三层可达网络里,就能构建

出一个基于隧道的容器网络。

缺点:随着节点规模的增长复杂度会提升,大规模集群情况下网络问题跟踪复杂

 

路由方案:

Calico:是一个纯三层的虚拟网络方案,Calico 为每个容器分配一个IP,每个 host都是

router,把不同 host 的容器连接起来。与VxLAN不同的是,Calico不对数据包做额外封

装,不需要 NAT 和端口映射,扩展性和性能都很好。

与其他容器网络方案相比,Calico 还有一大优势:network policy。用户可以动态定义 ACL

规则,控制进出容器的数据包,实现业务需求。

MacVLAN:Linux操作系统内核提供的网络虚拟化方案之一,更准确的说法是网卡虚拟化方

案。它可以为一张物理网卡设置多个mac地址,相当于物理网卡施展了影分身之术,由一

个变多个,同时要求物理网卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本

来是一块物理网卡连接到交换机,现在是多块虚拟网卡连接到交换机。

 

路由方案优缺点:

优点:从三层或者两层实现跨主机容器互通,没有NAT,效率比较高,和目前的网络能够融合

在一起,每一个容器都可以像虚拟机一样分配一个业务的IP。

缺点:如果几万新的容器IP冲击到路由表里,导致下层的物理设备没办法承受;而且每一个容

器都分配一个业务IP,业务IP会消耗很快。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/104693

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班