Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式
启动容器时,通过-p 宿主机端口:容器端口
,就可以通过访问宿主机端口
访问到容器,这种原理机制是啥,有没有其它方式可以让宿主机和容器通信,以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。
文章目录
- 容器通信必备网络知识
- Linux的network namespace网络命名空间
- veth虚拟以太网卡
- 虚拟以太网桥
- Docker容器默认三种基础网络模式
- bridge模式
- bridge模式通信机制
- bridge模式基础操作
- 创建容器指定bridge模式
- 查看容器的ip地址和网关信息
- 查询所有bridge模式下的容器
- host网络模式
- host模式通信机制
- host模式基础操作
- 创建容器指定host模式
- 查看host网络模式下容器
- none网络模式
- none模式通信机制
- none网络基础操作
- 创建容器指定none网络模式
- 查询none网络模式下的容器
- Container网络模式
- Container模式通信机制
- Container模式基础操作
- 容器启动时指定使用另一个容器的网络
- 自定义网络模式
- 自定义网络机制
- Docker-自定义网络基础操作
- 创建自定义网络
- 创建容器指定自定义网络
- 新增连接网络
- 断开网络
- 移除网络
- 总结
容器通信必备网络知识
Linux的network namespace网络命名空间
linux的内核namespacesj 它在Linux内核2.6版本引入,作用是隔离Linux系统的设备,以及IP地址、端口、路由表、防火墙规则等网络资源。因此,每个网络namespace里都有自己的网络设备(如IP地址、路由表、端口范围、/proc/net目录等)
这么做的好处就是隔离,直观的例子就是由于每个容器都有自己的(虚拟)网络设备,并且容器里的进程可以放心地绑定在端口上而不必担心冲突,这就使得在一个主机上同时运行多个监听80端口的Web服务器变为可能,如下图:
veth虚拟以太网卡
是虚拟以太网卡[Virtual Ethernet]缩写,
veth设备
总是成对的,因此我们称之为veth pair
。veth pair
一端发送的数据会在另外一端接收,是双向通道。根据这一特性,veth pair
常被用于跨network namespace
之间的通信,即分别将veth pair
的两端放在不同的namespace里
虚拟以太网桥
两个network namespac可以通过veth pair连接,但是要做到两个以上network namespace相互连接,veth pair就显得捉襟见肘。它正如字面意思描述的那样,有牵线搭桥的意思,用于连接网络设备,它是一台虚拟的网络交换机,任意物理设备比如veth0和虚拟设备(比如降到的veth pair)都可以连接到这个设备上。
Docker容器默认三种基础网络模式
安装Docker以后,会默认创建三种网络,可以通过sudo docker network ls
查看
apple@bogon ~ % docker network lsNETWORK ID NAME DRIVER SCOPE
c38043cc6113 bridge bridge local
b15c29da9f0f host host local
c22f88bafff0 none null local
接下来我们讲解这三种网络的基本使用和原理
bridge模式
bridge模式通信机制
在该模式中Docker 守护进程创建了一个虚拟以太网桥 docker0
,新建的容器的虚拟以太网卡veth0
配对的pair接口
自动桥接到这个docker0网桥
上,附加在其上的任何网卡
之间都能自动转发数据包。
Bridge 桥接模式的实现步骤主要如下:
- Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方
- Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0
- Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性
未启动任何容器前,先通过指令ip addr
查询出目前所有的网卡接口,目前有三个网卡
接口,分别是
docker0
虚拟以太网桥enX0
表示宿主机物理网卡接口lo
是本地回环地址,有这个可以使用127.0.0.1
连接本地
启动mysql容器
sudo docker run -di --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql
宿主机上执行ip addr
多了一个网卡接口veth3ff2d31
,这个就是mysql容器启动后docker通过linux的veth pair
技术创建的成对的网卡接口,宿主机的网卡接口是veth3ff2d31,容器的网卡接口veth0。
登陆上容器上sudo docker exec -it mysql01 /bin/bash
,可以在容器/sys/class/net
路径下看到网卡eth0
,lo可以忽略,它是本地回环接口,有它可以ping通127.0.0.1
其中27:veth3ff2d31@if26
其中27和26成对出现,可以在目标容器中通过cat /sys/class/net/eth0/ifindex
知道容器网卡的veth0
的ifindex是26,执行/sys/class/net/eth0/iflink
知道网卡配对的一端ifindex是27
退出容器后,在宿主机上通过cat /sys/class/net/veth3ff2d31/ifindex
知道网卡veth3ff2d31
的ifindex是27,执行/sys/class/net/veth3ff2d31/iflink
知道veth3ff2d31
网卡配对的一端ifindex是26
bridge模式基础操作
创建容器指定bridge模式
关于 bridge 网络模式的使用,只需要在创建容器时通过参数 --net bridge
或者 --network bridge
指定即可,当然这也是创建容器默认使用的网络模式,也就是说这个参数是可以省略的
# 1.启动mysql,不添加--net bridge,默认是bridge
sudo docker run -di --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql# 2.启动mysql,不添加--net bridge,默认是bridge
sudo docker run --net bridge -di --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql
查看容器的ip地址和网关信息
对于每个容器的 IP 地址和 Gateway 信息,我们可以通过 docker inspect 容器名称|ID
进行查看,在 NetworkSettings 节点中可以看到详细信息。
查询所有bridge模式下的容器
通过 docker network inspect bridge
查看所有 bridge 网络模式
下的容器,在 Containers 节点中可以看到容器名称。
host网络模式
host模式通信机制
采用 host 网络模式
的 Docker Container,可以直接使用宿主机的 IP 地址
与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性
host模式基础操作
创建容器指定host模式
host 网络模式需要在创建容器时通过参数 --net host
或者 --network host
指定,例如:启动mysql使用host模式
# 启动mysql容器
sudo docker run --name mysql02 -it --net host -e MYSQL_ROOT_PASSWORD=root -d mysql
然后宿主机通过ip addr
查看信息如下:只有lo
,exX0
,docker0
,没有新建任何网卡接口
查看host网络模式下容器
可以通过 docker network inspect host
查看所有 host 网络模式
下的容器,在 Containers 节点中可以看到容器名称
none网络模式
none模式通信机制
none 网络模式是指禁用网络功能,只有 lo 接口( local 的简写),代表 127.0.0.1
,即 localhost 本地环回接口。
none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 lo 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。
none网络基础操作
创建容器指定none网络模式
在创建容器时通过参数 --net none
或者 --network none
指定;
启动mysql容器指定none网络模式
sudo docker run --name mysql03 -it --net none -e MYSQL_ROOT_PASSWORD=root -d mysql
查询none网络模式下的容器
我们可以通过 docker network inspect none
查看所有 none 网络模式下的容器,在 Containers 节点中可以看到容器名称
Container网络模式
Container模式通信机制
Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数--net container:已运行的容器名称|ID
或者 --network container:已运行的容器名称|ID
指定;
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信
Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。
Container模式基础操作
容器启动时指定使用另一个容器的网络
自定义网络模式
自定义网络机制
虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到 IP 地址的自动 DNS 解析
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server
,使容器可以直接通过容器名称
通信。方法很简单,只要在创建容器时使用 --name
为容器命名即可。
但是使用 Docker DNS 有个限制:只能在user-defined
网络中使用。也就是说,默认的 bridge 网络
是无法使用 DNS 的,所以我们就需要自定义网络
简而言之就是自定义网络是基于前文提到的bridge,none,host模式创建,并且拥有了通过网络名称通信的特征
Docker-自定义网络基础操作
创建自定义网络
通过 docker network create
命令可以创建自定义网络模式
docker network create
命令使用详情,发现可以通过 --driver 指定网络模式,网络模式只有三种是前文提到的bridge,host,none模式,默认是 bridge
网络模式,提示如下:
创建一个基于 bridge 网络模式
的自定义网络模式 cyl_network
,完整命令如下:
sudo docker network create cyl_network
通过 docker network ls
查看网络模式:
创建容器指定自定义网络
sudo docker run -di --name bbox05 --net custom_network busybox
通过 docker inspect 容器名称|ID
查看容器的网络信息,在 NetworkSettings 节点中可以看到详细信息
新增连接网络
通过 docker network connect 网络名称 容器名称
为容器连接新的网络模式。
执行以下指令,可以为容器bbox05新增bridge网络
sudo docker network connect bridge bbox05
断开网络
通过docker network disconnect 网络名称 容器名称
命令断开网络。
sudo docker network disconnect cyl_network bbox05
通过 docker inspect 容器名称|ID
再次查看容器的网络信息,发现只剩下默认的 bridge模式
移除网络
可以通过 docker network rm 网络名称
命令移除自定义网络模式,网络模式移除成功会返回网络模式名称。
sudo docker network rm cyl_network
再次执行sudo docker network ls
发现cyl_network已经移除
注意:如果通过某个自定义网络模式创建了容器,则该网络模式无法删除。
总结
上文讲解了docker默认的三种网络模式bridge、host、none的通信机制和基本操作,再此基础上又延伸了container网络模式和自定义网络,这五种网络模式原理总结如下:
网络模式 | 原理 | 隔离性 |
---|---|---|
bridge | 为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式 | 高 |
host | 容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口 | 低 |
none | 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等 | 无网络 |
container | 新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等 | 跟随指定容器的网络模式而定,若指定容器是bridge则高,host则低 |
自定义网络 | 只有自定义网络,才启用容器名称到 IP 地址的自动 DNS 解析,才能通过容器名称进行网络通信 | 根据指定的模式而定 |
相关文章:

Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式
启动容器时,通过-p 宿主机端口:容器端口,就可以通过访问宿主机端口访问到容器,这种原理机制是啥,有没有其它方式可以让宿主机和容器通信,以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。 文章…...

Convolutional Occupancy Networks【ECCV】
论文:https://arxiv.org/pdf/2003.04618 代码:GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1:卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构,表现能力…...
Android Studio 问题集锦
报 Plugin [id: ‘com.android.application’, version: ‘8.1.3’, apply: false] was not found in any of the following sources: 场景:在一个Android 11的项目中添加一个Android 9的项目作为其Module,结果导致原项目无法正常运行,且原项…...

J.搬砖【蓝桥杯】/01背包+贪心
搬砖 01背包贪心 思路:要让重量更小的在更前面,价值更大的在更后面,vi−wj>vj−wi viwi>vjwj 第 i 个箱子放在第 j 个箱子下面就显然更优。所以进行排序再用01背包即可。 #include<iostream> #include<algorithm> #defi…...

拥塞控制的微观行为与力学解释
本文以 tcptrace 图为基,描述传输的微观行为,并给出一个初中几何描述的压水井模型。 统计复用网络的拥塞控制,宏观看 inflight,微观看 pacing rate,宏观大方向不对,微观再正确也不行。 而网络的统计动力学…...
每日一读: 硬件网卡tx支持哪些功能特性offload(ixgbe驱动为例)
ixgbe驱动 rte_eth_dev_info_get -> ixgbe_dev_info_get -> ixgbe_get_tx_port_offloads uint64_t ixgbe_get_tx_port_offloads(struct rte_eth_dev *dev) {uint64_t tx_offload_capa;struct ixgbe_hw *hw IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);tx_…...

MyBatis的坑(动态SQL会把0和空串比较相等为true)
文章目录 前言一、场景如下二、原因分析1. 源码分析2. 写代码验证 三、解决办法代码及执行结果如下 总结 前言 在开发过程中遇到MyBatis的动态SQL的if条件不生效的情况,但经过debuger发现并不是参数问题,已经拿到了参数并传给了MyBatis,且从表…...

Springboot事务控制中A方法调用B方法@Transactional生效与不生效情况实战总结
介绍 本篇对Springboot事务控制中A方法调用B方法Transactional生效与不生效情况进行实战总结,让容易忘记或者困扰初学者甚至老鸟的开发者,只需要看这一篇文章即可立马找到解决方案,这就是干货的价值。喜欢的朋友别忘记来个一键三连哈&#x…...
python -【三】循环语句
一、while 循环 while 语法 while 条件: 条件满足时,做事情 a 0 while a < 100:print(i like python ...)a 1求 1-100 的总和 i 1 sum 0 while i < 100:sum ii 1 print(f1-100 的和是 {sum})""" 1-100 的和是 5050 ""&…...

类的内存对齐位段位图布隆过滤器哈希切割一致性哈希
文章目录 一、类的内存对齐1.1规则1.2原因 二、位段2.1介绍2.2内存分配问题2.3跨平台问题2.4使用的注意事项 三、位图的应用3.1 给40亿个不重复的无符号整数,找给定的一个数。(int的范围可以到达42亿多)3.2 给定100亿个整数,设计算…...

于ThinkPHP开发的赛事报名小程序
基于ThinkPHP开发的赛事报名微信小程序 功能包括 1、参赛公告 2、会员中心(会员注册、登录、成绩查询、资料管理、参赛记录管理) 3、个人报名和企业报名 (身份证验证防止重复报名) 4、培训报名 5、查询是否在库人员,根…...

前端学习--React部分
文章目录 前端学习--React部分前言1.React简介1.1React的特点1.2引入文件1.3JSX🍉JSX简介与使用🍉JSX语法规则 1.4模块与组件🍉模块🍉组件 1.5安装开发者工具 2.React面向组件编程2.1创建组件🍉函数式组件🍉…...

24V_2A_1.2MHZ|PCD0303升压恒频LCD背光源专用电路超小体积封装
概述 PCD0303是一个恒定频率,6针SOT23电流模式升压转换器用于小型低功耗应用。PCD0303 以1.2MHz切换,并且允许使用微小的,低成本电容器和电感器2mm或更小,内部软启动会产生较小的涌入电流延长电池寿命。PCD0303具有自动切换至轻负载下的脉冲…...
python生成词云图
生成词云图的话需要先对数据进行分词处理 , 分词方法点击查看 import pandas as pd from collections import Counter from wordcloud import WordCloud import matplotlib.pyplot as plt# 假设您已经按照之前的步骤处理了数据,并且处理后的数据保存在comments_proc…...

【使用ChatGPT构建应用程序】应用程序开发概述:1. 管理秘钥、2. 数据安全、3. 与应用程序解耦、4. 注意提示语的注入攻击
文章目录 一. 首先注意的两个方面1. 管理API密钥1.1. 用户提供API密钥1.2. 你自己提供API密钥 2. 数据安全和数据隐私 二. 软件架构设计原则:与应用程序解耦三. 注意LLM提示语的注入攻击1. 分析输入和输出2. 监控和审计3. 其他要注意的注入情况 在了解了ChatGPT的文…...
【JavaScript脚本宇宙】不可或缺的Web开发工具:图表和可视化
图形化你的数据:六款顶级JavaScript库全接触 前言 在本文中,我们将深入探讨六个强大的JavaScript库,这些库被广泛应用于数据可视化和交互式图形展示。我们将了解每个库的概述、主要特性、使用示例以及使用场景,以帮助读者更全面…...
自然语言处理(NLP)中的迁移学习
Transfer Learning in NLP 迁移学习(Transfer Learning)无疑是目前深度学习中的新热点(相对而言)。在计算机视觉领域,它已经应用了一段时间,人们使用经过训练的模型从庞大的ImageNet数据集中学习特征&…...

PLC集成BL121PO网关优化智能电网的远程管理PLC转OPC UA协议
随着工业自动化技术的不断发展,智能电网等复杂系统对于设备之间高效通信的需求日益增加。PLC转OPC UA协议转换网关BL121PO作为一款领先的协议转换设备,通过其独特的设计和功能,为用户提供了高效、安全的PLC接入OPC UA的解决方案。 设备概述 …...

爬虫案例(读书网)
一.我们还是使用简单的bs4库和lxml,使用xpath: 导入下面的库: import requests from bs4 import BeautifulSoup from lxml import etree 我们可以看见它的div和每个书的div框架,这样会观察会快速提高我们的简单爬取能力。 二.实…...

Linux系统编程(五)多线程创建与退出
目录 一、基本知识点二、线程的编译三、 线程相关函数1. 线程的创建(1)整型的传入与接收(2)浮点数的传入与接收(3)字符串的传入与接收(4)结构体的传入与接收 2. 线程的退出3. 线程的…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...