Docker容器五种网络驱动模式详解
Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行,同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动,Docker 可以创建不同类型的网络,以满足各种应用场景的需求。
传统上,大多数计算解决方案都被认为是单一用途的解决方案—您通常不会遇到单个主机(或虚拟机)承载多个工作负载(尤其是生产工作负载)的机器。对于容器,情况发生了变化。随着轻量级容器和高级编排平台(如Kubernetes和DC/OS)的出现,在同一主机上运行不同工作负载的多个容器以及分布在多个主机上的应用程序的不同实例是非常常见的。在这种情况下,容器网络有助于允许(或限制)跨容器通信。为了方便这个过程,Docker提供了不同的网络模式。
值得注意的是,Docker的所有网络模式都是通过软件定义网络(SDN)实现的。具体来说,在Linux系统上,Docker修改iptables规则以提供所需的访问/隔离级别。使用Docker的标准安装,可以使用以下网络驱动程序:Bridge 、 Host 、Overlay 、Macvlan、None, 下面详细说明每个网络驱动模式。

bridge 网络(默认网络类型)
-
应用场景
用于在同一宿主机上运行的容器之间进行通信。这是最常见的应用场景,例如,一个 Web 应用容器和一个数据库容器运行在同一台服务器上,它们可以通过 bridge 网络相互连接。比如,一个基于 Django 的 Web 应用容器需要连接到一个 MySQL 容器,就可以使用 bridge 网络实现通信。
-
优势
简单易用,是 Docker 默认的网络模式,对于初学者和大多数常见的容器间通信场景很方便。容器可以自动分配 IP 地址,并且可以通过容器名称进行通信,不需要手动配置复杂的网络设置。例如,在一个开发环境中,多个微服务容器可以快速地通过 bridge 网络连接起来进行开发和测试。
host 网络
-
应用场景
当容器需要直接使用宿主机的网络栈时非常有用。例如,一些性能要求极高的网络应用,如网络性能测试工具(如
iperf),如果使用 host 网络,容器的网络性能可以更接近直接在宿主机上运行的性能。另外,一些需要与宿主机上特定网络服务紧密集成的容器,比如监控宿主机网络接口的容器,也可以使用 host 网络。 -
优势
网络性能好,因为容器直接使用宿主机的网络接口,减少了网络层的开销。容器的网络端口和宿主机的网络端口是相同的,外部网络访问容器就像直接访问宿主机一样,对于一些需要直接暴露服务的应用比较方便,不需要进行端口映射。
none 网络
-
应用场景
适用于那些完全不需要网络连接的容器。例如,一些只在本地进行数据处理,不需要与外部或其他容器通信的容器,如某些离线的数据处理任务容器,像只进行本地文件格式转换的容器就可以使用 none 网络。
-
优势
提供了最高程度的网络隔离。对于一些安全要求极高的容器,使用 none 网络可以确保容器不会因为网络攻击而受到威胁,因为它根本没有网络连接。同时,对于资源有限的环境,如果不需要网络功能,使用 none 网络可以节省网络相关的资源。
overlay 网络
-
应用场景
用于跨多个 Docker 宿主机的容器之间的通信。在集群环境中,当有多个容器分布在不同的物理服务器上,并且需要相互通信时,overlay 网络就可以发挥作用。例如,在一个分布式的微服务架构中,不同服务器上的微服务容器需要相互协作,就可以通过 overlay 网络实现通信。
-
优势
支持跨主机通信,能够构建复杂的分布式容器网络。它可以通过软件定义网络(SDN)的方式进行配置,提供了灵活的网络拓扑结构。可以将多个不同物理位置的容器连接在一起,形成一个统一的虚拟网络,方便进行容器的部署和管理。
macvlan网络
-
应用场景
当需要为容器分配独立的 MAC 地址,使其在网络中看起来像独立的物理设备时使用。例如,在一些企业网络环境中,需要容器具有独立的网络标识,就像传统的物理服务器一样,这时可以使用 macvlan 网络。
-
优势
容器可以获得真实的物理网络接口的特性,在网络层面上,容器就如同直接连接到网络中的物理设备。这对于需要深度集成到现有物理网络架构中的容器应用很有帮助,并且可以更好地利用网络设备的功能,如 VLAN 等。
bridge示例
首先创建一个简单的 Web 应用容器和一个数据库容器的示例。假设 Web 应用是一个基于 Python Flask 的简单应用,数据库使用 MySQL。
创建一个名为flask_app的目录,在其中创建app.py文件,内容如下:
from flask import Flask
from flask_mysqldb import MySQLapp = Flask(__name__)
app.config['MYSQL_HOST'] ='mysql_container' # 使用容器名称来连接数据库
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'test_db'mysql = MySQL(app)@app.route('/')
def index():cur = mysql.connection.cursor()cur.execute("SELECT * FROM test_table")data = cur.fetchall()cur.close()return str(data)if __name__ == "__main__":app.run(host='0.0.0.0', port=5000)
在flask_app目录下创建Dockerfile:
FROM python:3.9
WORKDIR /app
COPY. /app
RUN pip install flask flask - mysqldb
EXPOSE 5000
CMD ["python", "app.py"]
对于 MySQL 容器,创建一个mysql目录,在其中创建init.sql文件,内容如下:
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE IF NOT EXISTS test_table (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255));
INSERT INTO test_table (data) VALUES ('Test Data');
在mysql目录下创建Dockerfile:
FROM mysql:8.0
COPY init.sql /docker - initdb.d/
ENV MYSQL_ROOT_PASSWORD=password
EXPOSE 3306
构建和运行容器:
-
首先构建两个容器:
进入
flask_app目录,执行docker build -t flask-app.构建 Flask 应用容器。进入
mysql目录,执行docker build -t mysql-container.构建 MySQL 容器。 -
然后运行容器:
先运行 MySQL 容器:
docker run -d --name mysql_container mysql-container再运行 Flask 应用容器:
docker run -d -p 5000:5000 --name flask_container --link mysql_container flask - app -
这里
--link选项用于在flask_container和mysql_container之间建立连接,并且由于它们在默认的 bridge 网络下,flask_app中的代码可以通过容器名称mysql_container来访问 MySQL 容器。
overlay示例:
假设在一个分布式的微服务架构中有两个微服务,一个是用户服务(user-service),一个是订单服务(order-service),它们分布在不同的 Docker 宿主机上。
首先,在两台宿主机上都需要配置 overlay 网络。假设网络名称为my-overlay-network,可以使用docker network create - d overlay my-overlay-network命令来创建(这一步需要在支持 overlay 网络的 Docker Swarm 环境中进行)。
对于user-service,创建user-service目录,在其中创建app.py文件,内容如下(简单的示例,假设使用 Flask):
from flask import Flask
import requestsapp = Flask(__name__)@app.route('/user - order - info/<user_id>')
def user_order_info(user_id):order_service_url = "http://order - service:5001/order - for - user/{}".format(user_id)response = requests.get(order_service_url)return response.textif __name__ == "__main__":app.run(host='0.0.0.0', port=5000)
在user-service目录下创建Dockerfile:
FROM python:3.9
WORKDIR /app
COPY. /app
RUN pip install flask requests
EXPOSE 5000
CMD ["python", "app.py"]
对于order-service,创建order-service目录,在其中创建app.py文件,内容如下:
from flask import Flaskapp = Flask(__name__)@app.route('/order - for - user/<user_id>')
def order_for_user(user_id):# 简单的示例,返回一个固定的订单信息return "Orders for user {}: [Order 1, Order 2]".format(user_id)if __name__ == "__main__":app.run(host='0.0.0.0', port=5001)
在order-service目录下创建Dockerfile:
FROM python:3.9
WORKDIR /app
COPY. /app
RUN pip install flask
EXPOSE 5001
CMD ["python", "app.py"]
-
构建容器:
在第一台宿主机上进入
user-service目录,执行docker build - t user-service-container.构建user-service容器。在第二台宿主机上进入
order-service目录,执行docker build - t order-service-container.构建order-service容器。 -
运行容器:
在第一台宿主机上运行
user-service容器:docker run -d --network my-overlay-network --name user-service-container user-service-container在第二台宿主机上运行
order - service容器:docker run -d --network my-overlay-network --name order-service - container order-service-container这里,通过
--network my-overlay-network选项,两个分布在不同宿主机上的容器可以相互通信。user-service可以通过http://order-service:5001访问order-service,实现了跨主机的微服务通信。
host示例:
以iperf网络性能测试工具为例。
创建iperf目录,在其中创建Dockerfile:
FROM ubuntu:latest
RUN apt - get update && apt - get install - y iperf
EXPOSE 5201
CMD ["iperf", "-s"]
构建容器:docker build -t iperf - container.
运行容器:docker run -d --network host --name iperf_server iperf - container
这里--network host表示容器使用主机网络。在这种模式下,容器的iperf服务会直接绑定到宿主机的5201端口(假设没有其他程序占用),就像直接在宿主机上运行iperf - s一样。当在外部网络中的其他设备上运行iperf - c <宿主机IP>时,就可以直接连接到这个容器中的iperf服务进行网络性能测试。
Macvlan网络示例
假设要将一个容器作为一个独立的网络设备连接到企业网络的 VLAN 中。
首先,创建macvlan-container目录,在其中创建Dockerfile(以 Ubuntu 为例):
FROM ubuntu:latest
RUN apt-get update && apt-get install - y iputils-ping
EXPOSE 80
CMD ["ping", "8.8.8.8"]
构建容器:docker build -t macvlan-container.
假设企业网络的 VLAN 接口为eth0,子网为192.168.1.0/24,网关为192.168.1.1。创建 macvlan 网络:
docker network create - d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 - o parent = eth0 my-macvlan-network
运行容器:
docker run -d --network my-macvlan-network --name macvlan - container macvlan-container
这个容器使用--network my-macvlan-network加入 macvlan 网络,它会获得一个独立的 MAC 地址,在网络中就像一个独立的物理设备,可以与企业网络中的其他设备(如通过ping命令测试与外部的8.8.8.8通信)进行通信,并且可以根据企业网络的配置(如 VLAN 等)进行相应的网络操作。
None网络示例
假设创建一个简单的文件处理容器,用于将一个文本文件中的内容转换为大写。
创建一个text_processing目录,在其中创建process.py文件,内容如下:
def process_file():with open("input.txt", "r") as file:content = file.read()processed_content = content.upper()with open("output.txt", "w") as file:file.write(processed_content)
if __name__ == "__main__":process_file()
text_processing目录下创建Dockerfile:
FROM python:3.9
WORKDIR /app
COPY. /app
RUN pip install - - no - network
CMD ["python", "process.py"]
- 构建容器:
docker build -t text-processing-container. - 运行容器:
docker run -d --network none --name text_processing_container text-processing-container
这个容器使用--network none选项,意味着它没有网络连接。它只会在本地容器内部执行文件处理任务,从input.txt读取内容并将处理后的内容写入output.txt,而不会与外部网络或其他容器进行交互。
相关文章:
Docker容器五种网络驱动模式详解
Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行,同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动,Docker 可以创建不同类型的网络,以满足各种应用场景的需求。 传统上&am…...
netfilter简介及流程图
Netfilter 是 Linux 内核中用于网络包过滤和操作的框架,由 Rusty Russell 于1998年创立,旨在改进旧的 ipchains 和 ipfwadm 实现。它采用模块化设计,具有良好可扩展性,并在2000年3月合并进Linux 2.3.x内核版本。 Netfilter的主要…...
Vue 前端代码规范
在 Vue 前端开发中,遵循代码规范可以提高代码的可读性、可维护性和团队协作效率。以下是一些详细的 Vue 前端代码规范,涵盖了多个方面: ### 1. **项目结构** - **目录结构**:- src/ 目录下应包含 components/、views/、store/、router/、ass…...
JAVA:组合模式(Composite Pattern)的技术指南
1、简述 组合模式(Composite Pattern)是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它使客户端对单个对象和组合对象的使用具有一致性。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什么是组合模式 组合模式…...
js常用方法之: 预览大图(uniapp原生方法封装)
方法: //预览图片 pic可传单个图片地址字符串 或 图片数组(带index) previewPic: function(pic, index) {if (!pic) return;if (index undefined) {let array [];array.push(pic);uni.previewImage({urls: array,current: array[0]});} else {uni.previewImage({urls: pic,…...
python 高级用法
1、推导列表 ans [ x for x in range(6)] print(ans)ans [ x for x in range(6) if x > 2] print(ans)ans [ x*y for x in range(6) if x > 2 for y in range(6) if y < 3] print(ans) 2、map 函数 a list(map(list,"abc")) print(a) b list(map(ch…...
TISAX认证最新消息
一、TISAX认证概述 TISAX(Trusted Information Security Assessment Exchange)认证是由德国汽车工业协会(VDA)主导开发的一种信息安全评估标准。该认证旨在确保汽车供应链中的信息安全,帮助汽车产业链中的企业保护其敏…...
Python中所有子图标签Legend显示详解
在数据可视化中,图例(legend)是一个非常重要的元素,它能够帮助读者理解图表中不同元素的含义。特别是在使用Python进行可视化时,matplotlib库是一个非常强大的工具,能够轻松创建包含多个子图的图表…...
python脚本中使用git命令
python脚本中使用git命令 一、背景 在做项目输入文件的版本管理的时候,我发现我需要用到库上面的文件来作为版本管理比较的输入,通常情况下,我是先根据tag将两个版本的文件拉取到本地,然后放进我的工程里在运行脚本来完成版本的比较,但是我发现这样其实很麻烦,所以就想着…...
本地maven项目打包部署到maven远程私库
目的:在自己的maven项目中,要把当前maven项目部署到maven私库,供其他人引入依赖使用。 首先要确保你当前能访问到你的私库,能拉私库的maven依赖即可。 maven部署命令: mvn deploy:deploy-file -Dmaven.test.skiptrue -…...
自己搭建专属AI:Llama大模型私有化部署
前言 AI新时代,提高了生产力且能帮助用户快速解答问题,现在用的比较多的是Openai、Claude,为了保证个人隐私数据,所以尝试本地(Mac M3)搭建Llama模型进行沟通。 Gpt4all 安装比较简单,根据 G…...
[免费]SpringBoot公司财务管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBoot公司财务管理系统,分享下哈。 项目视频演示 【免费】SpringBoot公司财务管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息化技术&…...
5G 模组 RG500Q常用AT命令
5G 模组 RG500Q常用AT命令 5G 模组 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…...
【YOLO 项目实战】(11)YOLO8 数据集与模型训练
欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO 项目实战】(1)YOLO5 环境配置与检测 【YOLO 项目实战】(10)YOLO8 环境配置与推理检测 【YOLO 项目实战】(11)YOLO8 数据…...
基于matlab的单目相机标定
链接: 单目相机标定(使用Matlab) 用Matlab对单目相机参数的标定步骤(保姆级教程) 1.准备代码 调用摄像头代码(用于测试摄像头是否可用): #https://blog.csdn.net/qq_37759113/art…...
DB-GPT 智谱在线模型配置
LLM_MODELzhipu_proxyllm PROXY_SERVER_URLhttps://open.bigmodel.cn/api/paas/v4/chat/completions ZHIPU_MODEL_VERSIONglm-4 ZHIPU_PROXY_API_KEY70e8ec7113882ff5478fcecaa47522479.ExY2LyjcvWmqrTAf...
Navicat 17 功能简介 | SQL 美化
SQL美化 本期,我们将深入挖掘 Navicat 的实用的SQL代码美化功能。你只需简单地点击“SQL 美化”按钮,即可轻松完成 SQL 的格式化。 随着 17 版本的发布,Navicat 也带来了众多的新特性,包括兼容更多数据库、全新的模型设计、可视化…...
RTA_OS内核源码解析 3.9-任务激活
RTA_OS内核源码解析 3.9-任务激活 文章目录 RTA_OS内核源码解析 3.9-任务激活一、激活简介二、同步激活2.1 中断管理2.2 异常条件判断2.3 激活Task2.4 任务调度2.4.1 Os_RaiseCrossCoreISR2.4.2 Os_CrossCoreISR三、异步激活3.1 异常条件判断3.2 激活Task一、激活简介 一般将T…...
新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?
在新能源汽车行业迅猛发展的今天,智慧充电桩作为支持这一变革的关键基础设施,正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区,从企业园区到住宅小区,智慧充电桩不仅提供了便捷的充电服务,还通过…...
计算机的错误计算(一百八十六)
摘要 就上节(即(一百八十五))内容,有读者来信,建议用另外一个大模型计算。本节详细讲解该大模型的对错,特别是涉及 Python Decimal的内容以及泰勒展式内容。 例1. 已知 用大模型计算 下面是…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
