前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手动实现docker容器bridge网络模型

手动实现docker容器bridge网络模型

作者头像
编程黑洞
发布于 2023-03-04 07:36:36
发布于 2023-03-04 07:36:36
50300
代码可运行
举报
文章被收录于专栏:编程黑洞编程黑洞
运行总次数:0
代码可运行

Network Namespace

Namespace 技术是容器虚拟化的重要技术,可以将进程隔离在自己的 Namespace 中。而 Network Namespace 技术是将进程隔离在自己的网络空间中,拥有独立的网络栈,仿佛自己处于独立的网络中。

网络栈是指网卡、回环设备、路由表和 iptables 规则等等。网络栈是指网卡、回环设备、路由表和 iptables 规则等等。

容器间网络互通

容器的 bridge 网络模式会创建属于自己的 Network Namespace 来隔离自己与宿主机,拥有属于自己的网络栈。可以理解为不同的 Network Namespace 是不同的主机,那么它们想要网络通信,该如何实现?

首先想到的当然是交换机和路由器了,因为它们是处于同一个网络中,所以使用交换机即可,而 Linux 提供了 bridge 来充当虚拟交换机的角色,将多个 Network Namespace 接入到 bridge 中,它们就能网络互通了。

那么如何将容器的 Network Namespace 接入到 bridge 呢?

veth pair

veth pair 是成对出现的虚拟网卡,可以把它看做成一个管道,或者一根网线,从一段输入的数据包会从另一端输出,可以通过它来连接容器的 Network Namespace 和 bridge。

使用 veth pair + bridge 的网络模型如下:

实践

我们不用安装 docker,直接用 Network Namespace 来模拟容器的网络环境。

  1. 创建 bridge 设备

这里使用 ip 命令来对 bridge 进行操作,也可以使用 brctl 命令,该命令是在 bridge-utils 包中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip link add br0 type bridge
[root@localhost ~]# ip link set dev br0 up
[root@localhost ~]# ip addr add 10.0.0.3/24 dev br0

[root@localhost ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether fe:fc:fe:af:4b:ea brd ff:ff:ff:ff:ff:ff
60: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 7e:b5:12:2d:fd:d4 brd ff:ff:ff:ff:ff:ff
  1. 创建 3 个 Network Namespace

使用 ip netns 命令可以对 Network Namesapce 进行操作,所以使用该命令创建 net0、net1 两个 Network Namespace

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip netns add net0
[root@localhost ~]# ip netns add net1
  1. 创建两对 veth pair

首先创建两对 veth pair 虚拟网卡,它们是一一对应的,veth0 和 veth1,veth2 和 veth3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip link add veth0 type veth peer name veth1
[root@localhost ~]# ip link add veth2 type veth peer name veth3

查看创建出来的 4 个虚拟网卡,@前面的是该网卡的名称,后面的是该网卡的另一端。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip a
...
67: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 7e:b5:12:2d:fd:d4 brd ff:ff:ff:ff:ff:ff
68: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 26:22:ef:1a:b3:33 brd ff:ff:ff:ff:ff:ff
69: veth3@veth2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c6:f2:d1:2d:c7:95 brd ff:ff:ff:ff:ff:ff
70: veth2@veth3: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ee:4b:0d:17:60:b1 brd ff:ff:ff:ff:ff:ff
  1. 将 veth pair 的一端接入到 Network Namespace 中,并设置好其 IP 地址
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip link set dev veth0 netns net0
[root@localhost ~]# ip netns exec net0 ip addr add 10.0.0.1/24 dev veth0
[root@localhost ~]# ip netns exec net0 ip link set dev veth0 up


[root@localhost ~]# ip link set dev veth2 netns net1
[root@localhost ~]# ip netns exec net1 ip addr add 10.0.0.2/24 dev veth2
[root@localhost ~]# ip netns exec net1 ip link set dev veth2 up

ip netns exec 命令可以进入到指定的 Network Namespace 中执行命令

  1. 将 veth pair 的另一端设置到 bridge 中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip link set dev veth1 master br0
[root@localhost ~]# ip link set dev veth3 master br0

[root@localhost ~]# ip link set dev veth1 up
[root@localhost ~]# ip link set dev veth3 up

可以通过命令 bridge link 查看到 veth1、veth3都插入到 br0 中了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# bridge link
67: veth1 state UP @(null): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2 
69: veth3 state UP @(null): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2

也可以通过 brctl 命令查看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# brctl show
[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.7eb5122dfdd4       no              veth1
                                                        veth3

测试

  1. 首先监听 br0 网卡
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# tcpdump -i br0
  1. 在 net0 中 ping net1 的 ip
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ip netns exec net0 ping -c 3 10.0.0.2
  1. 会发现监听 br0 网卡是有流量的:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# tcpdump -i br0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
02:39:41.251428 ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28
02:39:41.251495 ARP, Reply 10.0.0.2 is-at ee:4b:0d:17:60:b1 (oui Unknown), length 28
02:39:41.251502 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 15665, seq 1, length 64
02:39:41.251702 IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 15665, seq 1, length 64
02:39:42.251435 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 15665, seq 2, length 64
02:39:42.251554 IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 15665, seq 2, length 64
02:39:43.251414 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 15665, seq 3, length 64
02:39:43.251512 IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 15665, seq 3, length 64
02:39:46.261377 ARP, Request who-has 10.0.0.1 tell 10.0.0.2, length 28
02:39:46.261400 ARP, Reply 10.0.0.1 is-at 26:22:ef:1a:b3:33 (oui Unknown), length 28

可以看到先是 10.0.0.1 发送的 ARP 获取 10.0.0.2 的 MAC 地址,然后再发送 ICMP 的请求和响应,最后 10.0.0.2 也发送 ARP 获取 10.0.0.1 的 MAC 地址。

因为 bridge 是二层网络设备,所以它是需要通过识别 MAC 地址来进行通信的局域网。

后面我又通过 net0 ping net1 的 ip,发现它没有发送 ARP 了,这个是因为第一次 bridge 已经将 MAC 地址和端口的映射关系已经记录了下来,后面可以直接通过查表,而不用再发送 ARP 了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# tcpdump -i br0 -n 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
02:40:01.267689 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 15991, seq 1, length 64
02:40:01.267948 IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 15991, seq 1, length 64
02:40:02.267509 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 15991, seq 2, length 64
02:40:02.267641 IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 15991, seq 2, length 64
02:40:03.267458 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 15991, seq 3, length 64
02:40:03.267582 IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 15991, seq 3, length 64

宿主机访问容器

  1. 再次监听 br0 网卡
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tcpdump -i br0
  1. 在宿主机上 ping 容器内部 ip,是可以 ping 通的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ping 10.0.0.1 -n 3
  1. 查看监听的 br0 网卡流量:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# tcpdump -i br0 -n 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
02:56:03.232293 ARP, Request who-has 10.0.0.1 tell 10.0.0.3, length 28
02:56:03.232342 ARP, Reply 10.0.0.1 is-at 26:22:ef:1a:b3:33, length 28
02:56:03.232379 IP 10.0.0.3 > 10.0.0.1: ICMP echo request, id 3964, seq 1, length 64
02:56:03.232402 IP 10.0.0.1 > 10.0.0.3: ICMP echo reply, id 3964, seq 1, length 64
02:56:04.232494 IP 10.0.0.3 > 10.0.0.1: ICMP echo request, id 3964, seq 2, length 64
02:56:04.232554 IP 10.0.0.1 > 10.0.0.3: ICMP echo reply, id 3964, seq 2, length 64
02:56:05.232517 IP 10.0.0.3 > 10.0.0.1: ICMP echo request, id 3964, seq 3, length 64
02:56:05.232607 IP 10.0.0.1 > 10.0.0.3: ICMP echo reply, id 3964, seq 3, length 64
02:56:08.245354 ARP, Request who-has 10.0.0.3 tell 10.0.0.1, length 28
02:56:08.245412 ARP, Reply 10.0.0.3 is-at 7e:b5:12:2d:fd:d4, length 28

可以看到是 10.0.0.3 访问通了 10.0.0.1 ,我们是通过宿主机访问的容器内部,为什么源 ip 变成 10.0.0.3?

  1. 通过查看宿主机的路由表,可以看到当我们 ping 10.0.0.1 时,是匹配上了该条路由,然后走 br0 网卡,使用的源 ip 是 br0 的 ip 10.0.0.3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip r
...
10.0.0.0/24 dev br0 proto kernel scope link src 10.0.0.3 
...

容器内访问外部

  1. 配置 Network Namespace 中将 bridge 作为默认网关

当我们在 net0 内部访问外部 ip 时,会发现网络不可达。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip netns exec net0 ping 10.65.132.187
connect: Network is unreachable

这个是因为没有匹配上路由表上的原因

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip netns exec net0 ip r
10.0.0.0/24 dev veth0 proto kernel scope link src 10.0.0.1

我们加上默认网关,也就是在没有匹配上其他路由时,走该网关

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip netns exec net0 ip r add default via 10.0.0.3 dev veth0

[root@localhost ~]# ip netns exec net0 ip r 
default via 10.0.0.3 dev veth0 
10.0.0.0/24 dev veth0 proto kernel scope link src 10.0.0.1 
  1. 配置宿主机 iptables 的 SNAT 规则

我们再次在容器中访问外部 ip 时,发现网络还不可达,但是我们监听 br0 网卡发现是有数据包的,也就是路由配的没问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# tcpdump -i br0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
03:23:23.738010 IP 10.0.0.1 > 10.65.132.187: ICMP echo request, id 11228, seq 1, length 64
03:23:24.737415 IP 10.0.0.1 > 10.65.132.187: ICMP echo request, id 11228, seq 2, length 64

我们再看宿主机上的路由,是有配置默认路由的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip r
default via 10.61.74.1 dev ens18 proto static metric 100

所以我再监听一下宿主机的网卡 ens18 看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# tcpdump -i ens18 dst host 10.65.132.187
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes
03:24:47.162152 IP 10.0.0.1 > 10.65.132.187: ICMP echo request, id 13281, seq 1, length 64
03:24:48.161585 IP 10.0.0.1 > 10.65.132.187: ICMP echo request, id 13281, seq 2, length 64

发现也是有数据包的,但是原地址是 net0 的 ip 地址 10.0.0.1,外部是不认识的,所以需要配置 iptables,将源 IP 改为宿主机的 IP。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建规则
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -o br0 -j MASQUERADE

# 查看规则
[root@localhost ~]# iptables -L POSTROUTING -t nat
...
MASQUERADE  all  --  10.0.0.0/24          anywhere

上面设置 ipatbels 的命令的含义是,在 POSTROUTING 链的 nat 表中添加一条规则,当数据包的源 IP 网段为 10.0.0.0/24 时,并且不是网卡 br0 发送的,就执行 MASQUERADE 动作,该动作就是源地址改为宿主机地址的转换动作。

现在就可以 ping 通外部 IP 了,查看 ens18 网卡的数据包,源地址已经修改成宿主机网卡 ens18 的地址了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# tcpdump -i ens18 dst host 10.65.132.187 -n 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes
03:41:51.157483 IP 10.61.74.37 > 10.65.132.187: ICMP echo request, id 3972, seq 1, length 64
03:41:52.158483 IP 10.61.74.37 > 10.65.132.187: ICMP echo request, id 3972, seq 2, length 64

那外部 IP 回包时,只有宿主机的 IP,并没有容器的 IP,那宿主机怎么知道发送容器中呢?

这个是因为内核 netfilter 会追踪记录连接,我们在增加了 SNAT 规则时,系统会自动增加一个隐式的反向规则,这样返回的包会自动将宿主机的 IP 替换为容器 IP。

外部访问容器暴露的服务

docker 容器可以通过-p 的方式将容器内部的端口暴露到宿主机中,给外部访问,这个是怎么实现的呢?

  1. 这个是通过 iptables 的 DNAT 规则实现的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建规则
[root@localhost ~]# iptables -t nat -A PREROUTING  ! -i br0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80

# 查看规则
[root@localhost ~]# iptables -L PREROUTING -t nat
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:10.0.0.1:80

创建规则的命令的意思是,在 PREROUTING 链的 nat 表中添加一条规则,数据包的来源网卡不是 br0,数据包协议是 tcp,目的端口是 80,则进行 DNAT,将目的 IP 从宿主机 IP 改为容器 IP。

  1. 在 net0 中开启 80 端口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# nc -lp 80
  1. 在外部主机上访问宿主机的 80 端口,是可以访问成功的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@k8s-master-07rf9 ~]# telnet 10.61.74.37 80
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux 虚拟网络设备 veth-pair 详解,看这一篇就够了
顾名思义,veth-pair 就是一对的虚拟设备接口,和 tap/tun 设备不同的是,它都是成对出现的。一端连着协议栈,一端彼此相连着。如下图所示:
Linux云计算网络
2019/05/25
3.9K0
Linux虚拟网络设备bridge你真搞懂了吗?
首先,bridge是一个虚拟网络设备,所以具有网络设备的特征,可以配置IP、MAC地址等;其次,bridge是一个虚拟交换机,和物理交换机有类似的功能。
公众号: 云原生生态圈
2021/09/02
11.3K2
☀️苏州程序大白解析Linux 中的虚拟网络接口☀️《❤️记得收藏❤️》
注意: 本文中使用 ip 命令创建或修改的任何网络配置,都是未持久化的,主机重启即消失。 ​
苏州程序大白
2021/10/20
2.4K0
聊聊 Linux 上软件实现的“交换机” - Bridge!
Linux 中的 veth 是一对儿能互相连接、互相通信的虚拟网卡。通过使用它,我们可以让 Docker 容器和母机通信,或者是在两个 Docker 容器中进行交流。参见《轻松理解 Docker 网络虚拟化基础之 veth 设备!》。
开发内功修炼
2022/03/24
1.6K1
聊聊 Linux 上软件实现的“交换机” - Bridge!
5 年工作经验,Docker 的几种网络模式都说不清,你敢信?
Docker 在安装后自动提供 3 种网络,可以使用 docker network ls 命令查看
民工哥
2022/10/27
1.1K0
5 年工作经验,Docker 的几种网络模式都说不清,你敢信?
Kubernetes网络模型
在Kubernetes中设计了一种网络模型,要求无论容器运行在集群中的哪个节点,所有容器都能通过一个扁平的网络平面进行通信,即在同一IP网络中。需要注意的是:在K8S集群中,IP地址分配是以Pod对象为单位,而非容器,同一Pod内的所有容器共享同一网络名称空间。
mikelLam
2022/10/31
1.2K0
Kubernetes网络模型
VXLAN 基础教程:结合 VRF 在 Linux 中实践 VXLAN 网络
上篇文章结尾提到 Linux 是支持 VXLAN 的,我们可以使用 Linux 搭建基于 VXLAN 的 overlay 网络,以此来加深对 VXLAN 的理解,毕竟光说不练假把式。
米开朗基杨
2020/04/28
5.2K1
VXLAN 基础教程:结合 VRF 在 Linux 中实践 VXLAN 网络
Docker单机网络模型动手实验
容器的本质就是一个进程,只不过对它进行了Linux Namesapce隔离,让它看不到外面的世界,用Cgroups限制了它能使用的资源,同时利用系统调用pivot_root或chroot切换了进程的根目录,把容器镜像挂载为根文件系统rootfs。rootfs中不仅有要运行的应用程序,还包含了应用的所有依赖库,以及操作系统的目录和文件。rootfs打包了应用运行的完整环境,这样就保证了在开发、测试、线上等多个场景的一致性。
mazhen
2023/11/24
3070
Docker单机网络模型动手实验
一文搞懂 Linux network namespace
本文通过 IP 命令操作来简单介绍 network namespace 的基本概念和用法。深入了解可以看看我之前写的两篇文章 Docker 基础技术之 Linux namespace 详解 和 Docker 基础技术之 Linux namespace 源码分析。
Linux云计算网络
2019/05/25
2K0
手把手带你进入 docker 网络的世界
使用容器总感觉像变模式一样。对那些了解其内部原理的人来说,他是一种很好的方式;而对于那些不了解其内部原理的人来说,这是一种可怕的方式。
张琳兮
2021/03/04
9080
Docker 网络 host、bridge、macvlan 工作原理
Docker 作为容器的主流平台,不仅仅提供了虚拟化隔离,同时也配备的网络隔离技术,并使用不同的网络驱动满足不同的场景,这篇文章对 Docker 的3种网络实现Host、Bridge、Macvlan进行模拟验证,并在实践中理解背后的基本原理。
我的小碗汤
2020/01/13
3.5K0
Docker 网络 host、bridge、macvlan 工作原理
干货 | 手把手带你搞定4大容器网络问题
一直以来,网络都是容器中令人头疼的问题。本文的主要目的是带你解决容器网络问题,让你不再对它恐惧。
CloudBest
2021/03/29
1K0
干货 | 手把手带你搞定4大容器网络问题
docker网络之bridge
https://blog.csdn.net/u014027051/article/details/53908878/
charlieroro
2020/03/24
1.1K0
docker网络之bridge
手工模拟实现 Docker 容器网络!
如今服务器虚拟化技术已经发展到了深水区。现在业界已经有很多公司都迁移到容器上了。我们的开发写出来的代码大概率是要运行在容器上的。因此深刻理解容器网络的工作原理非常的重要。只有这样将来遇到问题的时候才知道该如何下手处理。
开发内功修炼
2022/03/24
8490
手工模拟实现 Docker 容器网络!
docker容器单机网络
通过文章 容器的本质 (opens new window)可知,容器只是一个进程,而容器所能看到的网络栈,是隔离在自己的 Network Namespace (opens new window) 中。docker 容器单机网络支持四种网络模式,也都是基于 Network Namespace 实现的。本文主要是介绍这四种模式的使用方法及实现原理。
编程黑洞
2023/03/04
3800
docker容器单机网络
使用 Linux 网络虚拟化技术探究容器网络原理
在 使用 Go 和 Linux Kernel 技术探究容器化原理 一文中,我们揭秘了容器的本质就是一个特殊的进程,特殊在为其创建了 NameSpace 隔离运行环境,并用 Cgroups 为其控制资源开销。
gopher云原生
2022/11/22
1.7K0
使用 Linux 网络虚拟化技术探究容器网络原理
docker网络之overlay
使用docker network的好处是:在同一个网络上的容器之间可以相互通信,而无需使用expose端口特性
charlieroro
2020/03/24
2.3K0
docker网络之overlay
容器网络基础(一)
我们一定听过容器的基础原理,namespace做隔离,Cgroups做限制,rootfs做文件系统,容器本质上是linux的一个进程,那么为什么大多数场景下,容器不直接使用宿主机上的网络,而要是通过network namespace隔离出一组专属的网络空间呢?(容器的基础原理,可参考:https://coolshell.cn/articles/17010.html)
智零办法就是多
2022/04/13
1.5K0
Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)
自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求。容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。下面将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker。前面已经在Docker容器学习梳理--基础知识(2)这一篇中详细介绍了Docker的网络配置以及pipework工具。 docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,
洗尽了浮华
2018/01/23
3.6K0
Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)
K8s面试系列: Flannel VS Calico 基于 L2 与 L3 的 CNI 之战(一)
在童年期,我们更多是处于认知,而不是意欲的状态。—— 《作为意欲和表象的世界》第二卷第三十一章
山河已无恙
2025/02/25
1680
K8s面试系列: Flannel VS Calico 基于 L2 与 L3 的 CNI 之战(一)
推荐阅读
相关推荐
Linux 虚拟网络设备 veth-pair 详解,看这一篇就够了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验