ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Docker 网络详解

2019-10-25 19:38:43  阅读:252  来源: 互联网

标签:容器 docker0 宿主机 网络 网卡 详解 网桥 Docker


Docker 网络详解

  • Bridge contauner 桥接式网络模式

  • Host(open) container 开放式网络模式

  • Container(join) container 联合挂载式网络模式,是host网络模式的延伸

  • None(Close) container 封闭式网络模式

Bridge(桥接式网络模式)

1. 介绍

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机启动的Docker容器会连接到这个虚拟网桥上,默认分配网段为172.17.0.0/16,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机,附加在其上的任何网卡之间都能自动转发数据包。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机创建一对虚拟网卡veth pair 设备,Docker将veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主句中,以vethxxx这样的名字命名,并将这个网络设备加入到docker0网桥中。

veth 是 Virtual ETHernet 的缩写,是一种虚拟网络设备。它的特点是:当它被创建以后,总是以两张虚拟网卡(Veth peer)形式成对出现,并且在一个网卡上的数据包可直接转发给另一个与之对应的网卡上,即使这两个网卡不在同一个namespace中。

2. 容器与容器间的通信

容器1(172.17.0.2)ping 容器2(172.17.0.3);
根据路由规则,数据包从容器1(172.17.0.2)的eth0转发至与之对应的veth上,该veth桥接在了docker0上,此时数据包到达了docker0,docker0扮演交换机的角色,并广播ARP请求寻找容器2(172.17.0.3)的mac地址,而此时容器2的另一个veth 设备桥接在了docker0,并收到ARP请求,发现自己是172.17.0.3 ,故将其mac地址回复给容器1,此时容器1和容器2就可以进行通信了,并且在容器1可以查看到缓存的容器2的mac地址。

3. 容器与外部网络通讯

同理,如果容器ping另一个主机,它发出去的数据包经过docker0网桥流向宿主机的eth0网卡,eth0再将数据包转发给与之相通的主机,于是,容器便可以跟其它主机通信了。(主要宿主机eth0能到达,容器都可以与之通信)

4. 宿主机与容器通讯

当宿主机访问容器时,数据包从docker0流入到与容器的eth0对应的veth设备,veth与容器的eth0相通信。

5. 外部访问容器

默认情况,其他外部网络(宿主机以外)无法访问到容器内的端口,通常的做法是使用-p或者-P选项,来暴露容器中的端口到宿主机上,外部网络通过访问宿主机的端口从而访问到容器端口。本质上来说,该方式是通过iptables规则转发实现的。

6. 自定义网桥

除了使用默认docker0作网桥以为还可以使用docker network 相关命令自定义网桥,以下将创建一个br1的网络,子网是172.30.0.0/16,网关为172.30.0.1。

#创建br1网桥
docker network create -d bridge --subnet '172.30.0.0/16' --gateway '172.30.0.1' br1

#查看docker网络
 docker network ls

 NETWORK ID          NAME                    DRIVER              SCOPE
 b9c01f82c16b        br1                     bridge              local

 #自定义网桥的使用
 docker run -it --network br1 镜像名称 bash

Host(开放式网络模式)

Host模式使用是在容器启动时候指明–network host,此时容器共享宿主机的Network Namespace,容器内启动的端口直接是宿主机的端口,并且容器不会创建网卡和IP,直接使用宿主机的网卡和IP,但是容器内的其他资源是隔离的,如文件系统、用户和用户组。这种模式的好处就是效率高,因为不需要额外的网络开始,直接使用宿主机网络。

docker run -d --name nginx --network host nginx:latest

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i02j9vWg-1572002564963)(nginx.png)]

Container(联合挂载式网络模式)

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo回环 通信。同样,kubernetes中的pod的话,pod内的网络也是靠这样的共享方式来实现的。

None(封闭式网络模式)

使用–network none选项指定其网络模式,在该模式下虽然容器有着自己的Network Namespace,但是容器内没有网卡、IP、路由信息,只有一个lo回环接口。如果需要网络配置则需要用户手动进行配置网卡、ip以及路由信息,通常这样的容器用于承担某些无需网络介入的工作,如离线任务、备份等。


交个朋友吧,希望这里有你想要的

青夕的github,欢迎Star

青夕的博客,欢迎访问

青夕的公众号,欢迎关注

标签:容器,docker0,宿主机,网络,网卡,详解,网桥,Docker
来源: https://blog.csdn.net/czxljy999/article/details/102748590

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有