【Docker】Linux网桥连接多个命名空间

这篇具有很好参考价值的文章主要介绍了【Docker】Linux网桥连接多个命名空间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

veth实现了点对点的虚拟连接,可以通过veth连接两个namespace,如果我们需要将3个或者多个namespace接入同一个二层网络时,就不能只使用veth了。

在物理网络中,如果需要连接多个主机,我们会使用bridge(网桥),或者又称为交换机。Linux也提供了网桥的虚拟实现。下面我们试验通过Linux bridge来连接三个namespace。

【Docker】Linux网桥连接多个命名空间,CI/CD/CM,docker,linux,容器,网桥,命名空间

创建3个Network Namespace

$ ip netns add ns0

$ ip netns add ns1

$ ip netns add ns2

$ ip netns list
ns2
ns1
ns0

创建3对veth pair

$ ip link add type veth

$ ip link add type veth

$ ip link add type veth

$ ip link
23: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 02:31:8e:3f:e3:41 brd ff:ff:ff:ff:ff:ff
24: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether a6:fa:24:af:7e:25 brd ff:ff:ff:ff:ff:ff
25: veth2@veth3: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether b6:44:af:1c:9d:34 brd ff:ff:ff:ff:ff:ff
26: veth3@veth2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 02:89:cd:6d:91:5e brd ff:ff:ff:ff:ff:ff
27: veth4@veth5: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether d6:44:b0:6d:f2:af brd ff:ff:ff:ff:ff:ff
28: veth5@veth4: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 4e:9d:92:7f:97:6e brd ff:ff:ff:ff:ff:ff

创建网桥

创建名为bridge0的网桥

$ ip link add bridge0 type bridge

启动bridge0网桥:

$ ip link set dev bridge0 up

查询bridge0网桥:

$ ip addr
29: bridge0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether c2:a8:ec:6b:f5:9e brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.1/16 brd 172.16.255.255 scope global bridge0
       valid_lft forever preferred_lft forever

绑定网口

Network Namespace、veth pair、bridge都创建完毕,下面通过命令将每对veth pair的一端绑定在network namespace,另一端绑定在docker0网桥上,用于实现网络互通。

配置第一个网络命名空间ns0:

// 将veth1添加进ns0
$ ip link set dev veth1 netns ns0

// 为ns0中的veth1配置ip
$ ip netns exec ns0 ip addr add 172.16.0.11/16 dev veth1

// 启动ns0中的veth1网卡
$ ip netns exec ns0 ip link set dev veth1 up

// 将veth0添加加网桥bridge0
$ ip link set dev veth0 master bridge0

// 启动veth0网卡
$ ip link set dev veth0 up

$ ip netns exec ns0 ip addr
24: veth1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether a6:fa:24:af:7e:25 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.11/16 scope global veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a4fa:24ff:feaf:7e25/64 scope link
       valid_lft forever preferred_lft forever

配置第二个网络命名空间ns1:

// 将veth3添加进ns1
$ ip link set dev veth3 netns ns1

// 为ns1中的veth3配置ip
$ ip netns exec ns1 ip addr add 172.16.0.33/16 dev veth3

// 启动ns1中的veth3网卡
$ ip netns exec ns1 ip link set dev veth3 up

// 将veth2添加加网桥bridge0
$ ip link set dev veth2 master bridge0

// 启动veth2网卡
$ ip link set dev veth2 up

$ ip netns exec ns1 ip addr
26: veth3@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 02:89:cd:6d:91:5e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.33/16 scope global veth3
       valid_lft forever preferred_lft forever
    inet6 fe80::89:cdff:fe6d:915e/64 scope link
       valid_lft forever preferred_lft forever

配置第三个网络命名空间ns2:

// 将veth5添加进ns2
$ ip link set dev veth5 netns ns2

// 为ns2中的veth5配置ip
$ ip netns exec ns2 ip addr add 172.16.0.55/16 dev veth5

// 启动ns2中的veth5网卡
$ ip netns exec ns2 ip link set dev veth5 up

// 将veth4添加加网桥bridge0
$ ip link set dev veth4 master bridge0

// 启动veth4网卡
$ ip link set dev veth4 up

$ ip netns exec ns2 ip addr
28: veth5@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4e:9d:92:7f:97:6e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.55/16 scope global veth5
       valid_lft forever preferred_lft forever
    inet6 fe80::4c9d:92ff:fe7f:976e/64 scope link
       valid_lft forever preferred_lft forever

验证多个namespace之间的通信

$ ip netns exec ns0 ping 172.16.0.33 -c 2
PING 172.16.0.33 (172.16.0.33) 56(84) bytes of data.
64 bytes from 172.16.0.33: icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 172.16.0.33: icmp_seq=2 ttl=64 time=0.038 ms

--- 172.16.0.33 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.026/0.032/0.038/0.006 ms

$ ip netns exec ns0 ping 172.16.0.55 -c 2
PING 172.16.0.55 (172.16.0.55) 56(84) bytes of data.
64 bytes from 172.16.0.55: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 172.16.0.55: icmp_seq=2 ttl=64 time=0.036 ms

--- 172.16.0.55 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.036/0.041/0.047/0.008 ms

通过上面的试验,我们验证了可以使用Linux bridge来将多个namespace连接到同一个二层网络中。你可能注意到,在分配IP地址的时候,我们只为veth在namespace中那一端的虚拟网卡分配了地址,而没有为加入bridge那一端分配地址。这是因为bridge是工作在二层上的,只会处理以太包,包括ARP解析,以太数据包的转发和泛洪;并不会进行三层(IP)的处理,因此不需要三层的IP地址。

使用brctl

上面我们是借助ip link来创建网桥的,要想更好的操作网桥可以使用brctl,这个命令来自bridge-utils安装包。

brctl相关的命令如下:

$ brctl help
never heard of command [help]
Usage: brctl [commands]
commands:
        addbr           <bridge>                add bridge
        delbr           <bridge>                delete bridge
        addif           <bridge> <device>       add interface to bridge
        delif           <bridge> <device>       delete interface from bridge
        hairpin         <bridge> <port> {on|off}        turn hairpin on/off
        setageing       <bridge> <time>         set ageing time
        setbridgeprio   <bridge> <prio>         set bridge priority
        setfd           <bridge> <time>         set bridge forward delay
        sethello        <bridge> <time>         set hello time
        setmaxage       <bridge> <time>         set max message age
        setpathcost     <bridge> <port> <cost>  set path cost
        setportprio     <bridge> <port> <prio>  set port priority
        show            [ <bridge> ]            show a list of bridges
        showmacs        <bridge>                show a list of mac addrs
        showstp         <bridge>                show bridge stp info
        stp             <bridge> {on|off}       turn stp on/off

查看网桥绑定的端口

使用brctl show命令来查询网桥下绑定的网卡。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.02318e3fe341       no              veth0
                                                        veth2
                                                        veth4

给bridge删除接口

使用brctl delif可以给bridge删除接口。

$ brctl delif bridge0 veth0

$ brctl show bridge0
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth2
                                                        veth4

给bridge增加接口

使用brctl addif可以给bridge增加接口。

$ brctl addif bridge0 veth0

$ brctl show bridge0
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth0
                                                        veth2
                                                        veth4

创建网桥

使用brctl addbr可以创建网桥。

$ brctl addbr bridge1

$ brctl show
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth0
                                                        veth2
                                                        veth4
bridge1         8000.000000000000       no

相当于命令ip link add bridge1 type bridge

删除网桥

使用brctl delbr可以删除网桥。

$ brctl delbr bridge1

$ brctl show
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth0
                                                        veth2
                                                        veth4

相当于命令ip link delete bridge1文章来源地址https://www.toymoban.com/news/detail-745836.html

到了这里,关于【Docker】Linux网桥连接多个命名空间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 14. Docker中实现CI和CD

    目录 1、前言 2、什么是CI/CD 3、部署Jenkins 3.1、下载Jenkins 3.2、启动Jenkins 3.3、访问Jenkins页面 4、Jenkins部署一个应用 5、Jenkins实现Docker应用的持续集成和部署 5.1、创建Dockerfile 5.2、集成Jenkins和Docker 6、小结 持续集成(CI/CD)是一种软件开发的经验总结。它用于帮助开发团队和交付

    2024年02月11日
    浏览(51)
  • [Docker实现测试部署CI/CD----自由风格的CI操作[最终架构](5)]

            前面的架构存在的问题是, 若有多个目标服务器都需要使用该镜像,那么每个目标服务 器都需要在本地构建镜像,形成系统资源浪费。 若能够在 Jenkins 中将 镜像构建好并推送到 Harbor 镜像中心 ,那么无论有多少目标服务器需要该镜像,都只需要从 Harbor 拉取即可

    2024年02月14日
    浏览(54)
  • 【持续集成CI/持续部署CD】六、Docker Compose构建CI全流程

    1. 创建宿主机挂载目录并赋权 2. 新建 Jenkins+Sonar 安装脚本 jenkins-compose.yml 脚本,这里的 Jenkins 使用的是 Docker 官方推荐的镜像 jenkinsci/blueocean,在实际使用中发现,即使不修改插件下载地址,也可以下载插件,所以比较推荐这个镜像。 3. 在 jenkins-compose.yml 文件所在目录下执行

    2024年02月10日
    浏览(55)
  • 【CI/CD】基于 Jenkins+Docker+Git 的简单 CI 流程实践(上)

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是 持续集成 及 持续交付、部署 。在此,我们在京东云上以一个案例简单实践下 CI 流程。 1.1 CI/CD 持续集成 (Continuous Integration,

    2024年02月13日
    浏览(54)
  • Docker 配置 Gitea + Drone 搭建 CI/CD 平台

    本文的IP地址是为了方便理解随便打的,不要乱点 首先使用 docker 搭建 Gitea 服务器,用于管理代码版本,数据库选择mysql Gitea 服务器的 docker-compose.yml 配置文件如下: 运行前先去数据库服务器中新建一个名为 gitea 的数据库 命令: CREATE DATABASE gitea 编写完成后在当前目录下运行

    2024年01月23日
    浏览(44)
  • 持续交付的力量: 使用Docker Swarm进行CI/CD

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 1.1 Docker Swarm 简介 Docker Swarm 是 Docker 官方的集群管理和编排工具,用于管理多个 Docker 节点和容器,并分发容器到这些节点上运行。Docker Swarm 具有可扩展性、故障转移和负

    2023年04月26日
    浏览(62)
  • docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

          GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。       GitLab是由GitLabInc.开发,使用MIT许可证的基于

    2024年02月03日
    浏览(47)
  • docker部署gitlab CI/CD (一)第一篇:部署gitlab及汉化

    网上很多类似教程,但多少有点夹带私货,有的竟然拉取的第三方镜像,而且很多都要修改配置文件,完全不知道是为什么,于是结合其他人的博客和官方文档, 知其然也要知其所以然,于2023年4月17日写下这篇。 官方文档: https://docs.gitlab.com/ee/install/docker.html 主要参考博客

    2023年04月17日
    浏览(48)
  • [Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

    CI,Continuous Integration,持续集成。即将持续不断更新的代码经构建、测试后也持续不断的集成到项目主干分支。 CD,包含两层含义:Continuous Delivery,持续交付,和 Continuous Deployment,持续 部署。 持续交付:是持续集成的后续步骤,持续频繁地将软件的新版本交付到类生产环境

    2024年02月14日
    浏览(51)
  • [Docker实现测试部署CI/CD----相关服务器的安装配置(2)]

            Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 下载Linux版本的jdk,解压到/usr/local目录 进入 /etc/profile 目录,设置环境变量 刷新配置文件,输入

    2024年02月14日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包