Docker之网络:容器通信的模式与技术

2023-10-27

Docker的网络基础:

默认网络模式,特殊的几种网络模式,容器和宿主机的通信方式,容器与外部主机的通信方式。

一:Docker默认的原生网络:bridge桥接

在bridge模式下,容器没有一个公有IP,只有宿主机可以直接访问。外部主机是不可见的。
容器通过宿主机的NAT规则,才可以访问外网。

yum install -y bridge-utils 下载查看桥接的指令工具

在这里插入图片描述

在这里插入图片描述

这两个例子都是在告诉我们,容器的原生网络,在没有指定模式时,默认是会出现在桥接上,通过docker0这个桥接,与外部进行通信。我们使用ip a查看宿主机的网络设定:可以看到有生成docker0这个桥接:而它的网络IP,是一个私有网段。
在这里插入图片描述

宿主机与容器的通信:通过桥接。
在这里插入图片描述

二:host模式:

host模式同样使用的是原生网桥,通过docker0这个桥接与外部和宿主机进行通信。不同的是,host模式会使用宿主机的主机名。另外,host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少了隔离性。

在这里插入图片描述

在这里插入图片描述


三:none模式:

none模式是一种无网络模式,即程序本身不需要与外部通信,只需要自己运行即可。

在这里插入图片描述
使用docker inspect v1 v1为我拉起的这个容器名,来查看容器的配置参数。

在这里插入图片描述


四:Docker以容器名通信:joined模式

容器之间除了使用ip通信外,还可以使用容器名称通信。

joined模式为一种较为特殊的网络模式: 处于joined模式的容器,相当于共用网络。

处于这个模式下的Docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

在这里插入图片描述

在这里插入图片描述


五:link模式:链接容器

link模式主要用于链接两个容器,让其可以一直处于能被互相联系到的状态。

格式: --link :alias
name和id为源容器的name和id,alias为源容器再link下的别名

在这里插入图片描述

link的主要功能不止于此,他还是动态的!

当前的解析:
在这里插入图片描述

在这里插入图片描述
新的解析:
在这里插入图片描述

link动态解析,链接后相当于永久保持联系方式,无论双方怎样变化,联系方式依旧会有。


六:Docker自定义网络:bridge

docker提供了三种自定义网络驱动:

bridge、overlay、macvlan

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能。
overlay和macvlan是用于创建跨主机网络的

自定义网络:特点:内含DNS解析,并且可以指定IP地址。原始网桥不可以指定IP

下面为bridge,类似于原生网络的bridge
在这里插入图片描述
在宿主机上使用ip a可以看到:my_net1生成了新的一个虚拟网络设备,所有添加到这个网络中的容器都会连接到这个接口。

在这里插入图片描述
自定义网络是可以为其指定IP的,从而不必跟着网段递增原则。

指定网段和IP:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

桥接到不同网桥上的容器,彼此是不同通信的。docker在设计上就是要隔离不同的network。

理一下:
my_net1:172.18.0.x网段:v1:172.18.0.2:v2:172.18.0.3
my_net2:172.20.0.x网段:v3:172.20.0.2:v4:172.20.0.3在这里插入图片描述
那么如果想让v1和v3,v4也通信,即实现在不同网桥的容器通信:

就需要添加网卡,采用双网卡结构进行通信。

在这里插入图片描述

  docker network connect 网卡 要添加的容器

在这里插入图片描述


七:外网访问容器:端口映射:

一条指令就学会:

  docker run -d --name nginx -p 80:80 nginx.latest
  #-d 代表后台运行 --name为给容器命名 -p为端口映射,冒号前面为宿主机端口,冒号后面为容器端口

外网访问容器用到了docker-proxy和iptables DNAT:
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

先看下方线路的箭头:
外部信息发送到宿主机网卡设备上,docker-proxy识别到请求的是docker容器,于是将请求信息发送给docker桥接docker0,通过docker0宿主机就可以把请求信息发送至docker容器,从而由容器去处理请求。

返回来看上方箭头:

docker容器如果要返回信息到外网时,一定要先通过docker0这个桥接与宿主机进行通信,宿主机通过NAT的方式,将请求发送给自己的网卡,然后传到外部的网络。

要始终铭记一点:docker容器是和宿主机共享内核的,是寄托在宿主机上的。


八:跨主机、容器通信:

跨主机网络解决方案主要有以下:
docker原生的overlay和macvlan
第三方的flannel、weave、calico

macvlan网络方案实现:

它是linux kernel提供的一种网卡虚拟化技术。不需要使用linux bridge,直接使用物理接口即可。

macvlan网络在二层上是隔离的,所以不同马层vlan网络的容器无法通信【不在同一网段】,可在三层上通过网关将macvlan网络连通【路由器】。

实现:两台宿主机都需要双网卡,并且开启网卡混杂模式,docker容器ip需要在同一网段:

 主机1:
 ip link set eth0 promisc on  #开启混杂模式
 ip link set up eth0   #启用网卡【我虚拟网卡是新加的,没有启用,已经启用则不需要这一步】
 ##这里我双网卡新开的一块为eth0,根据自己情况选择。但是macvlan方式会独占网卡。
 ##两台要通信的docker容器所在宿主机都要开启混杂模式
 
 docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o  parent=eth0 mac_net1
 #创建macvlan网络,网段可以任意,我就选择了20段,因为我docker0是17段的。
 #要指定父级网卡,会占用该网卡【eth0】
 #我命名该网络为mac_net1  ,命名无要求,方便识别即可。
 
 docker run -it --name v1 --network mac_net1 --ip 172.20.0.10 ubuntu
 #运行一个使用该网络的容器,指定IP  【因为这是自定义网络】

在这里插入图片描述
主机2:
在这里插入图片描述

在这里插入图片描述

macvlan网络结构:

在这里插入图片描述

在这里插入图片描述
容器接口直接与宿主机网卡连接,不需要在网桥上再添加接口,不需要NAT或者端口映射。所以有一个明显缺点,会占用网卡

但是该技术提供了一种解决办法:使用vlan子接口实现多macvlan网络。
vlan可以将物理二层网络划分4094个逻辑网络,彼此隔离,vlan id取1-4094

在这里插入图片描述


              大大的小小阳
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker之网络:容器通信的模式与技术 的相关文章

  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 如何使用 docker-machine 中的 docker-compose 将文件从 docker 容器复制到主机

    我在 gradle 容器中为我的硒测试生成了报告 我正在尝试将文件从 docker 容器复制到本地主机 作为解决方法 我使用 docker cp 将文件从容器复制到本地 并且它有效 如何使用 docker compose Volume 来实
  • 对构建过程依赖于与另一个容器通信的应用程序进行 Docker 化

    我有一个 Ruby on Rails 应用程序 我正在尝试对其进行容器化 以便可以使用 Docker 进行部署 version 3 4 services db image postgres web container name my rai
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • Linux 上的基准测试程序

    对于一项任务 我们需要使用不同的优化和参数来对我们的实现进行基准测试 有没有一种可行的方法可以在Linux命令行 我知道时间 上使用不同的参数对小程序进行基准测试 从而为我提供CSV或类似内容的时间数据 输出可能类似于 Implementa
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • “google cloud run”将 HOME 更改为 CMD 的 /home,其中 RUN 使用 /root

    我正在做的是在 Dockerfile 中的 RUN 命令中设置 sbcl 和 Quicklisp 然后使用 CMD 加载我的自定义代码 当我在本地计算机上使用 Docker 运行它时 一切都很好 但是当我将其推送到 google run 时
  • docker 1.12中在服务的每个容器中绑定vip addr的目的是什么?

    Docker使用ipvs的NAT模式来实现服务负载均衡 在NAT模式下 真实服务器对VIP一无所知 据我了解 VIP仅用于不同服务的容器之间的通信 因此它应该只出现在iptables的mangle表中 我相信现在 2016 年 8 月上周
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • git lfs linux,Git LFS 操作指南

    Gitee gitee com 已支持 Git LFS 功能 目前该功能针对付费企业开放 Git LFS 简介 Git LFS Large File Storage 大文件存储 是 Github 开发的一个 Git 的扩展 用于实现 Git
  • Node.js安装教程及其简介

    目录 Node js简介 Node js安装教程 案例 步骤一 引入 required 模块 步骤二 创建服务器 分析Node js 的 HTTP 服务器 Node js简介 本质 服务端的JS 引入 required 模块 我们可以使用
  • Java中PrintWriter、BufferedWriter以及BufferredReader基本使用详解

    PrintWriter的使用 PrintWriter 是具有自动行刷新的缓冲字符输出流 这是一个高级流 所谓的自动行刷新 意思就是说 在构造函数中指定autoFlush的值为true时 则 println printf 或 format 方
  • 测试用例_场景法

    场景法 一 应用场合 主要用于测试软件的业务流程和业务逻辑 是一种基于软件业务的测试方法 测试人员把自己当成最终用户 尽可能真实的模拟用于在使用该软件时的各种情景 重点模拟两类操作 模拟用户正确的业务操作流程 验证软件的业务功能是否能够正确
  • 智能车摄像头三轮PID参数调节

    代码已上传CSDN 包含摄像头和PID控制 设置了VIP可取这个小门槛 有兴趣可以点击下方链接自取哈 https download csdn net download weixin 53129688 87714428https downlo
  • 3 个技巧教你轻松查看多开模拟器的端口号~

    此文章来源于项目官方公众号 AirtestProject 版权声明 允许转载 但转载必须保留原链接 请勿用作商业或者非法用途 前言 我们都知道 连接模拟器设备的字符串里 需要填上各个模拟器的端口号 比如雷电模拟器的端口号为5554 auto
  • jsp简单页面计数器

    在制作站点计数器时 如果频繁的访问数数库 比如象哪种每增加一人 便写入数据库或文件的作法 当你的站点有很大的访问量时 必然会影响性能 通常的做法有两种 一是启动一个线程定时写入访问量 二是先在内存中保存访问量 只有当访问量达到一定的数量 比
  • 797. 所有可能的路径

    797 所有可能的路径 难度中等154 给你一个有 n 个节点的 有向无环图 DAG 请你找出所有从节点 0 到节点 n 1 的路径并输出 不要求按特定顺序 二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点 空
  • 如何垂直居中一个浮动元素?

    问题网址 http bbs daxiangclass com thread 163 htm 如何垂直居中一个浮动元素 方法一 已经知道元素高宽 子盒子 div1 width 200px height 200px position absol
  • [Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)...

    先来说一下我们学校的网站 http jwxt sdu edu cn 7777 zhxt bks zhxt bks html 查询成绩需要登录 然后显示各学科成绩 但是只显示成绩而没有绩点 也就是加权平均分 显然这样手动计算绩点是一件非常麻烦
  • android studio 中JAVA文件提示android.support.v7.app.actionbaractivity is deprecated怎样处理?

    出这个提示的地方有写解决办法呀 android support v7 app ActionBarActivity is deprecated use AppCompatActivity instead 意思是 ActionBarActivi
  • 文档工程师

    想做需求工程师 不想做开发了 行不行 请给些意见 悬赏 5 发布时间 2008 06 21 提问人 huihui2525 初级程序员 本人从事软件开发工作1年多 技术上一般般 我是做j2ee的 现在感觉越来越觉得不爱做开发了 我本人性格比较
  • [429]python下安装mayavi

    Mayavi基于Python作为VTK的载体在三维图像的渲染和交互操作方面具有很多优势 最近分析数据的混沌的状态时需要在四维层面上表现数据的效果 首先在matlab tecplot和origin试验了一番 可以说他们都可以实现 但在渲染效果
  • 密码学知识点整理

    序列 流 密码的特点 加解密速度快 无错误扩散 分组 块 密码的特点 应用模式灵活多样 组内有错误扩散 在传统观念里 往往仅注重信息的秘密性 但近代人们认为 信息的真实性 完整性以及不可否认性 在应用上往往比秘密性更重要 密钥的生命周期 密
  • 基于51单片机电子指南针设计程序+原理图+PCB+Proteus仿真+设计报告

    功能介绍 系统采用了磁阻 GMR 传感器采集某一方向磁场强度后通过MCU控制器对其进行处理并显示上传 通过对电子指南针硬件电路和软件程序的分析 阐述了电子指南针基本的工作原理及实现 实际测试指南针模块精度达到1 能够在LCD上显示当前方位并
  • Python免费获取股票业绩预告【附源码】

    在众多的股票量化策略里 我比较钟爱一个策略 净利润断层 直观理解就是在股票的业绩预告 业绩快报 业绩报告等报告出来的时候 因为业绩超预期 股价会有一个跳空高开形成缺口 而且因为上攻力量比较强 这个缺口短期不会回补 而且股价会随着上攻力量越来
  • vue-router 路由超详细教程

    router 路由详细教程 一 前端路由的概念与原理 1 什么是路由 2 SPA与前端路由 3 什么是前端路由 4 前端路由的工作方式 5 实现简易的前端路由 二 vue router的基本用法 1 什么是 vue router 2 vue
  • 【Bus】编写一个Demo虚拟的总线-设备-驱动模型

    文章目录 1 前言 2 总线驱动模型三要素 2 1 总线 2 2 设备 2 3 驱动 3 Demo Code 3 1 virt bus core c 3 2 virt device c 3 3 virt driver c 问题一 virt
  • BOF——Bag-of-Featrures

    本文主要介绍 BOF Bag of Featrures 的原理及其应用 1 1 引言 文档分类领域有一种模型称为词袋 Bag of words 模型 它是自然语言处理与信息检索过程中的一种简化模型 在这种模型中 文本 段落或文档 被视为忽略
  • Docker之网络:容器通信的模式与技术

    Docker的网络基础 默认网络模式 特殊的几种网络模式 容器和宿主机的通信方式 容器与外部主机的通信方式 文章目录 Docker的网络基础 一 Docker默认的原生网络 bridge桥接 二 host模式 三 none模式 四 Dock