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. 已知 用大模型计算 下面是…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
