当前位置: 首页 > news >正文

Linux 复现Docker NAT网络

Linux 复现Docker NAT网络

docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间
请添加图片描述
使用ifconfig命令查看到的就是默认网络命名空间,docker0就是网桥,容器会把docker0当成路由,将流量发往docker0这个虚拟网桥上,然后docker0会走本地路由表发到你路由表上下一跳地址,如果当前层已经是物理机了就是路由器,如果你用的是虚拟机则就是你虚拟机的虚拟网桥,然后就是套娃
请添加图片描述
启动一个容器,我们再来看宿主机网络设备。从下图可以看到当我们启动redis容器后,本机网络设备新增了一个虚拟以太网设备veth9733c,容器redis02 ip为172.17.0.2,这个没有在本地网络设备中显示出来(在下文会讲这个地址在哪里出现),容器redis02进程id
请添加图片描述

命名空间

然后就是耳熟能详的词了——命名空间,docker 是利用linux命名空间实现的资源隔离。而容器redis02的ip地址也是存在于命名空间,linux veth类型网络设备总是成对出现,而这里只有一个veth设备是因为另一个peer在redis02的命名空间中.进入redis02网络命名空间的方法也很简单,就是利用redis02的进程id(pid). 使用nsenter -n --target 1281进入。到这里docker 的nat网络就已经实现了,网关路由docker0, nat中的网络设备docker以bridge网络模式创建的容器
请添加图片描述

复现docker nat网络

用到的命令行工具:ip,ifconfig

  1. 创建网桥:

    ip link add dev br0 type bridge
    ifconfig br0 172.20.0.1 netmask 255.255.255.0 broadcast 172.20.255.255
    ip link set br0 up
  2. 创建网络命名空间

    初始化netns
    ip netns add one
    将系统默认命名空间绑定到ip netns以供ip 命令操作
    ln -s /proc/1/ns/net /var/run/netns/default
  3. 进入一个新的网络命名空间

    unshare -n -f /usr/bin/zsh
  4. 在新网络命名空间中创建veth设备

    创建一个veth 设备对,eth0放在当前命名空间, veth01放系统默认网络命名空间
    ip link add dev eth0 type veth peer name veth01 netns default
    将veth01连接到虚拟网桥br0,后面这个设备就会把br0当路由
    ip netns exec default ip link set veth01 master br0
    ifconfig eth0 172.20.0.2
    ip link set eth0 up
    ip netns exec default ip link set veth01 up

效果

命令空间内
请添加图片描述
命名空间外
请添加图片描述
在命名空间中使用redis-server /etc/redis/redis.conf --daemonize no跑一个redis看看效果,可以看到宿主机6379是没有被监听的,但是通过命名空间创建的虚拟以太网设备的ip地址可以进去
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何在 CentOS 上配置本地 YUM 源
  • 2024软件测试面试题汇总【备战金九银十】内容较长建议收藏
  • mybatilsplaus 常用注解
  • 本地部署,去除动漫图像背景Anime Remove Background
  • Blinn-Phong优化phong模型的数学依据
  • 前端的页面代码
  • 代码随想录算法训练营:26/60
  • 通义千问Qwen-VL-Chat大模型本地训练(二)
  • Spring Boot 实现统一异常处理:构建健壮的应用
  • 恢复出厂设置手机变成砖
  • 网关、DHCP协议、ip地址、子网掩码简单介绍
  • 【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构
  • 无障碍快捷方式图标
  • centos7安装jenkins
  • Databricks 收购 Tabular 的意义:数据开放框架的胜利
  • @jsonView过滤属性
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【comparator, comparable】小总结
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • FineReport中如何实现自动滚屏效果
  • Js基础知识(四) - js运行原理与机制
  • Spark学习笔记之相关记录
  • webpack+react项目初体验——记录我的webpack环境配置
  • 对JS继承的一点思考
  • 聚簇索引和非聚簇索引
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 少走弯路,给Java 1~5 年程序员的建议
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #70结构体案例1(导师,学生,成绩)
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #php的pecl工具#
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (3)llvm ir转换过程
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (安卓)跳转应用市场APP详情页的方式
  • (第30天)二叉树阶段总结
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (回溯) LeetCode 40. 组合总和II
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (四)linux文件内容查看
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)拼包函数及网络封包的异常处理(含代码)
  • *** 2003
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .Net实现SCrypt Hash加密
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @property python知乎_Python3基础之:property
  • [000-01-011].第2节:持久层方案的对比