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

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

构建和运行容器:

  1. 首先构建两个容器:

    进入flask_app目录,执行docker build -t flask-app.构建 Flask 应用容器。

    进入mysql目录,执行docker build -t mysql-container.构建 MySQL 容器。

  2. 然后运行容器:

    先运行 MySQL 容器:docker run -d --name mysql_container mysql-container

    再运行 Flask 应用容器:docker run -d -p 5000:5000 --name flask_container --link mysql_container flask - app

  3. 这里--link选项用于在flask_containermysql_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"]
  1. 构建容器:

    在第一台宿主机上进入user-service目录,执行docker build - t user-service-container.构建user-service容器。

    在第二台宿主机上进入order-service目录,执行docker build - t order-service-container.构建order-service容器。

  2. 运行容器:

    在第一台宿主机上运行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"]
  1. 构建容器:docker build -t text-processing-container.
  2. 运行容器:docker run -d --network none --name text_processing_container text-processing-container

这个容器使用--network none选项,意味着它没有网络连接。它只会在本地容器内部执行文件处理任务,从input.txt读取内容并将处理后的内容写入output.txt,而不会与外部网络或其他容器进行交互。

相关文章:

Docker容器五种网络驱动模式详解

Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行&#xff0c;同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动&#xff0c;Docker 可以创建不同类型的网络&#xff0c;以满足各种应用场景的需求。 传统上&am…...

netfilter简介及流程图

Netfilter 是 Linux 内核中用于网络包过滤和操作的框架&#xff0c;由 Rusty Russell 于1998年创立&#xff0c;旨在改进旧的 ipchains 和 ipfwadm 实现。它采用模块化设计&#xff0c;具有良好可扩展性&#xff0c;并在2000年3月合并进Linux 2.3.x内核版本。 Netfilter的主要…...

Vue 前端代码规范

在 Vue 前端开发中&#xff0c;遵循代码规范可以提高代码的可读性、可维护性和团队协作效率。以下是一些详细的 Vue 前端代码规范&#xff0c;涵盖了多个方面&#xff1a; ### 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&#xff08;Trusted Information Security Assessment Exchange&#xff09;认证是由德国汽车工业协会&#xff08;VDA&#xff09;主导开发的一种信息安全评估标准。该认证旨在确保汽车供应链中的信息安全&#xff0c;帮助汽车产业链中的企业保护其敏…...

Python中所有子图标签Legend显示详解

在数据可视化中&#xff0c;图例&#xff08;legend&#xff09;是一个非常重要的元素&#xff0c;它能够帮助读者理解图表中不同元素的含义。特别是在使用Python进行可视化时&#xff0c;matplotlib库是一个非常强大的工具&#xff0c;能够轻松创建包含多个子图的图表&#xf…...

python脚本中使用git命令

python脚本中使用git命令 一、背景 在做项目输入文件的版本管理的时候,我发现我需要用到库上面的文件来作为版本管理比较的输入,通常情况下,我是先根据tag将两个版本的文件拉取到本地,然后放进我的工程里在运行脚本来完成版本的比较,但是我发现这样其实很麻烦,所以就想着…...

本地maven项目打包部署到maven远程私库

目的&#xff1a;在自己的maven项目中&#xff0c;要把当前maven项目部署到maven私库&#xff0c;供其他人引入依赖使用。 首先要确保你当前能访问到你的私库&#xff0c;能拉私库的maven依赖即可。 maven部署命令&#xff1a; mvn deploy:deploy-file -Dmaven.test.skiptrue -…...

自己搭建专属AI:Llama大模型私有化部署

前言 AI新时代&#xff0c;提高了生产力且能帮助用户快速解答问题&#xff0c;现在用的比较多的是Openai、Claude&#xff0c;为了保证个人隐私数据&#xff0c;所以尝试本地&#xff08;Mac M3&#xff09;搭建Llama模型进行沟通。 Gpt4all 安装比较简单&#xff0c;根据 G…...

[免费]SpringBoot公司财务管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBoot公司财务管理系统&#xff0c;分享下哈。 项目视频演示 【免费】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 项目实战】&#xff08;1&#xff09;YOLO5 环境配置与检测 【YOLO 项目实战】&#xff08;10&#xff09;YOLO8 环境配置与推理检测 【YOLO 项目实战】&#xff08;11&#xff09;YOLO8 数据…...

基于matlab的单目相机标定

链接&#xff1a; 单目相机标定&#xff08;使用Matlab&#xff09; 用Matlab对单目相机参数的标定步骤&#xff08;保姆级教程&#xff09; 1.准备代码 调用摄像头代码&#xff08;用于测试摄像头是否可用&#xff09;&#xff1a; #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美化 本期&#xff0c;我们将深入挖掘 Navicat 的实用的SQL代码美化功能。你只需简单地点击“SQL 美化”按钮&#xff0c;即可轻松完成 SQL 的格式化。 随着 17 版本的发布&#xff0c;Navicat 也带来了众多的新特性&#xff0c;包括兼容更多数据库、全新的模型设计、可视化…...

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…...

新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?

在新能源汽车行业迅猛发展的今天&#xff0c;智慧充电桩作为支持这一变革的关键基础设施&#xff0c;正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区&#xff0c;从企业园区到住宅小区&#xff0c;智慧充电桩不仅提供了便捷的充电服务&#xff0c;还通过…...

计算机的错误计算(一百八十六)

摘要 就上节&#xff08;即&#xff08;一百八十五&#xff09;&#xff09;内容&#xff0c;有读者来信&#xff0c;建议用另外一个大模型计算。本节详细讲解该大模型的对错&#xff0c;特别是涉及 Python Decimal的内容以及泰勒展式内容。 例1. 已知 用大模型计算 下面是…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...