Docker网络原理

Docker网络概述

1.桥接模式介绍

bridge模式是docker的默认网络模式。

桥接模式是一种用于连接两个不同网络段的设备,使它们能够共享通信的一种方式
桥接设备工作在OSI模型的第二层,即数据链路层,通常基于MAC地址进行帧转发

物理层连接: 桥接设备通常有两个或多个网络接口,用于连接不同的物理网络。
这些接口可以是以太网接口,Wi-Fi接口等。

MAC地址学习: 当桥接设备启动时,它开始学习连接的网络上设备的MAC地址。
桥接设备通过观察网络流量并记录源MAC地址来建立MAC地址表。

帧转发: 当设备发送帧(数据包)时,桥接设备查看目标MAC地址。
如果目标MAC地址在桥接设备的MAC地址表中,它会将帧仅发送到相应接口。
如果目标MAC地址不在表中,桥接设备会将帧发送到所有其他接口

桥接模式在物理和数据链路层上工作通过学习和转发MAC地址,连接不同的网络,从而使它们看起来像是一个单一的网络。这种模式通常用于局域网的扩展和连接。

2.Docker网络实现原理

桥接模式是一种网络模式,它在 Docker 中的工作方式可以分为以下几个步骤:

  • 虚拟网络桥创建: 当您启动 Docker 守护进程时,Docker 创建一个虚拟网络桥(通常称为 docker0),它是一个虚拟的网络设备,类似于物理网络设备的交换机。
  • 分配唯一的 IP 地址: 每次您运行一个容器时,Docker 分配一个唯一的 IP 地址给该容器。这个 IP 地址是在桥接模式网络的子网中。
  • 连接容器到桥接网络: 当容器启动时,Docker 将容器的虚拟网络接口(veth pair)连接到虚拟网络桥上。其中一个端点位于容器内,而另一个端点位于主机上。
  • 容器与主机通信: 通过桥接模式,容器可以直接与主机通信。这意味着容器可以访问主机上运行的服务,而主机也可以通过容器的 IP 地址访问容器内的服务。
  • 容器之间的通信: 如果有多个容器在相同的桥接网络上运行,它们可以通过各自的 IP 地址直接通信。Docker 会自动在桥接网络上设置路由,使得容器之间可以直接交流。
  • NAT(网络地址转换): 默认情况下,Docker 使用 Network Address Translation(NAT)技术,将容器的私有 IP 地址映射到主机上的公共 IP 地址。这样,容器可以与外部网络通信,而外部网络看到的是主机的 IP 地址。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。
如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

示例:

docker run -itd --name test1 -P nginx:1.22.0 /bin/bash
#随机映射端口(从32768开始)docker run -itd --name test2 -p 43000:80 nginx:1.22.0	/bin/bash
#指定映射端口
宿主机端口:主机上用于接收来自外部请求的端口。在这个例子中,它是43000。
容器端口:Docker容器内部正在监听的端口。在这个例子中,它是80,因为NGINX通常默认监听80端口。#使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。
可以使用iptables -t nat -vnL 查看。

docker exec -it test1 bash
cd /usr/share/nginx/html/
echo this is test1 > index.html
cd /bin/
nginxdocker exec -it test2 bash
cd /usr/share/nginx/html/
echo this is test2 > index.html
cd /bin/
nginx浏览器访问:
20.0.0.10:32768
20.0.0.10:43000

Docker网络模式详解

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

//查看docker网络列表
docker network ls
或
docker network listdocker network ls 
NETWORK ID     NAME      DRIVER    SCOPE
3dab1f670163   bridge    bridge    local
4f62ba81b69c   host      host      local
4fef7ef6a38b   none      null      local
-------------------------------------------------------------------------------------------
NAME: 是Docker网络的名称。在这里,你列出了三个网络,它们的名称分别是bridge、host和none。
NETWORK ID: 每个Docker网络都有一个唯一的网络ID。
DRIVER: 这是Docker使用的网络驱动程序。在这里,bridge表示使用的是桥接网络,host表示使用的是主机网络,而none表示没有网络。
SCOPE: 表示网络的作用范围。local表示该网络仅在本地主机上可用。
-------------------------------------------------------------------------------------------//使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
container模式:使用 --net=container:NAME_or_ID 指定。
bridge模式:使用 --net=bridge 指定,默认设置,可省略。

1.Host

主机模式:
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
在主机模式下,容器与主机共享同一个网络命名空间,直接使用主机的网络栈。
这使得容器可以使用主机的 IP 地址和端口,从而不需要进行额外的端口映射。

docker run -itd --name test1 --network host nginx /bin/bash
docker exec -it test1 bashroot@pup1:/bin# cd /usr/share/nginx/html/
root@pup1:/usr/share/nginx/html# echo this is nginx > index.html cd /bin/
root@pup1:/bin# nginx
#开启容器nginx服务时需要关闭宿主机的nginx服务,防止端口冲突浏览器访问本机地址:20.0.0.10

2.Container

这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
两个容器的进程可以通过lo网卡设备通信。

docker run -itd --name test2 --net=container:test1 nginx /bin/bash
docker exec -it test2 bashcd /usr/share/nginx/html/
echo this is nginx2 > index.html
nginx#需要先关闭容器test1的nginx服务
exec -it test1 bash
nginx -s stop浏览器访问本机地址:
20.0.0.10

docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
8daac0b47a21   nginx     "/docker-entrypoint.…"   13 minutes ago   Up 13 minutes             test2
08f7a9d0ddc9   nginx     "/docker-entrypoint.…"   59 minutes ago   Up 59 minutes             test1docker inspect -f '{{.State.Pid}}' 8daac0b47a21
47563ls -l /proc/47563/ns
#查看可以发现两个容器的 net namespace 编号相同

3.None

该模式关闭了容器的网络功能。
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。
这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

docker run -itd --name test3 --net=none nginx /bin/bash
docker exec -it test3 bash
nginxcd /usr/share/nginx/html/
echo this is nginx3 > index.htmlcd /etc
cat hosts
curl 127.0.0.1

 

4.Bridge

默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,
通过docker0网桥以及iptables nat 表配置与宿主机通信。

5.自定义网络

直接使用bridge模式,是无法支持指定IP运行docker的,例如执行以下命令就会报错:

docker run -itd --name test3 --network bridge --ip 172.17.0.10 nginx:latest /bin/bash
//创建自定义网络
#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork
-------------------------------------------------------------------------------------------
#docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,
那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记。#mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。
-------------------------------------------------------------------------------------------
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 nginx:latest /bin/bash进入虚拟机访问172.18.0.10

补充

查看容器的输出和日志信息

docker logs 容器的ID/名称
#创建容器时不加/bin/bash

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个简单的 postman设置接口关联让我措施了大厂的机会

postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这个过程的实现称为关联。 在postman中实现关联操作的步骤如下: 1、利用postman获取上一个接口指定的返回值…

YOLOv8 YoLov8l 模型输出及水果识别

🍨 本文为[🔗365天深度学习训练营学习记录博客 🍦 参考文章:365天深度学习训练营 🍖 原作者:[K同学啊 | 接辅导、项目定制] 🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/m…

关于什么是 JVM

关于什么是 JVM,看看普通⼈和⾼⼿的回答。 普通人 JVM 就是 Java 虚拟机,是⽤来运⾏我们平时所写的 Java 代码的。优点是它会 ⾃动进⾏内存管理和垃圾回收,缺点是⼀旦发⽣问题,要是不了解 JVM 的运⾏ 机制, 就很难…

是谁还没玩AI扩图?快跟上节奏啦

最近,抖音上的AI扩图突然火了,看完真的让人笑掉大牙~~~ 这一热议的话题#AI扩图#在短视频平台抖音上的播放量已经突破7.8亿次,而相关的讨论也如同星火燎原,迅速点燃了公众的好奇心。从“用AI扩图…

中伟视界:皮带跑偏、异物检测AI算法除了矿山行业应用,还能在钢铁、火电、港口等行业中使用吗?

随着工业化的发展,皮带输送机已经成为各行业中不可或缺的重要设备,但是在使用过程中,由于各种原因,皮带常常出现跑偏问题,给生产运营带来了诸多困扰。不仅仅是矿山行业,钢铁、火电、港口等行业也都面临着皮…

C语言 扫雷游戏

代码在一个项目里完成,分成三个.c.h文件(game.c,game.h,main.c) 在Clion软件中通过运行调试。 /大概想法/ 主函数main.c里是大框架(菜单,扫雷棋盘初始化,随机函数生成雷,玩家扫雷) game.h函数声明(除main函数和游戏函数外的一些函数声明) ga…

日志打印传值 传引用 右值引用性能测试

结论 ubuntu x86平台qnx平台优化传值都是比传引用的差 但是差距很小 测试代码 #include <cstdint> #include <ctime> #include <string>#ifdef __linux__#define ITERATIONS 10000000 #else#define ITERATIONS 100000 #endiftemplate <typename... AR…

Linux设置root初始密码

目录 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; 二、Linux系统中设置root初始密码 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; windows 系统中有普通用户和特权用户&#xff0c;特权用户是 administer&#xff0c;普通用户可以…

微服务01

笔记&#xff1a; day03-微服务01 - 飞书云文档 (feishu.cn) 数据库连接不上&#xff1f; 要在虚拟机启动MySQL容器。docker start mysql 服务治理 服务提供者&#xff1a;暴露服务接口&#xff0c;供其他服务调用 服务消费者&#xff1a;调用其他服务提供的接口 注册中心&…

STL(五)(queue篇)

我发现之前一版在电脑上看 常用函数部分 没有问题,由于是手打上去的,在手机上看会发生错位问题,现已将电脑原版 常用函数部分 截图改为图片形式,不会再发生错位问题,非常感谢大家的支持 ### priority_queue优先队列出现频率非常高,尤为重要(是一定要掌握的数据结构) 1.queue队…

docker全解

docker全解 一、docker的基本概念 什么是docker? docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…

MIT线性代数笔记-第26讲-对称矩阵及正定性

目录 26.对称矩阵及正定性打赏 26.对称矩阵及正定性 实对称矩阵的特征值均为实数&#xff0c;并且一定存在一组两两正交的特征向量 这对于单位矩阵显然成立 证明特征值均为实数&#xff1a; ​    设一个对称矩阵 A A A&#xff0c;对于 A x ⃗ λ x ⃗ A \vec{x} \lambda…

作业12.8

1. 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数。将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

Matlab simulink PLL学习笔记

本文学习内容&#xff1a;【官方】2022小迈步之 MATLAB助力芯片设计系列&#xff08;一&#xff09;&#xff1a;电路仿真与模数混合设计基础_哔哩哔哩_bilibili 时域模型 testbench搭建 菜单栏点击simulink 创建空白模型 点击库浏览器 在PLL里面选择一种架构拖拽到画布。 如…

一文理解什么是交叉熵损失函数以及它的作用

今天看一个在深度学习中很枯燥但很重要的概念——交叉熵损失函数。 作为一种损失函数&#xff0c;它的重要作用便是可以将“预测值”和“真实值(标签)”进行对比&#xff0c;从而输出 loss 值&#xff0c;直到 loss 值收敛&#xff0c;可以认为神经网络模型训练完成。 那么这…

【Java用法】Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 + 数据排序

Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 数据排序 一、业务场景二、Hutool官网树结构工具2.1 介绍2.2 使用2.2.1 定义结构2.2.2 构建Tree2.2.3 自定义字段名 2.3 说明 三、具体的使用场景3.1 实现的效果3.2 业务代码3.3 实现自定义字段的排序 四、踩过的坑4.1 坑…

ambari hive on Tez引擎一直卡住

hive on tez使用./bin/hive启动后一直卡住&#xff0c;无法进入命令行 使用TEZ作为Hive默认执行引擎时&#xff0c;需要在调用Hive CLI的时候启动YARN应用&#xff0c;预分配资源&#xff0c;这需要花一些时间&#xff0c;而使用MapReduce作为执行引擎时是在执行语句的时候才会…

iPaaS架构深入探讨

在数字化时代全面来临之际&#xff0c;企业正面临着前所未有的挑战与机遇。技术的迅猛发展与数字化转型正在彻底颠覆各行各业的格局&#xff0c;不断推动着企业迈向新的前程。然而&#xff0c;这一数字化时代亦衍生出一系列复杂而深奥的难题&#xff1a;各异系统之间数据孤岛、…

基于SuperMap iObjects Java生成地图瓦片

作者&#xff1a;dongyx 前言 在GIS领域&#xff0c;地图瓦片技术作为GIS领域的关键技术&#xff0c;是提高地图服务性能的关键手段之一。通过预先生成地图的瓦片数据&#xff0c;可以显著提升用户访问地图时的响应速度和体验。SuperMap iObjects for Java作为一款强大的GIS开…

Docker, Docker-compose部署Sonarqube

参考文档 镜像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文档地址 Installing from Docker | SonarQube Docs Docker-compose文档部署地址&#xff1a; Installing from Docker | SonarQube Docs 部署镜像 2.1 docker部署 # 宿主机执行 $. vi /etc/sysctl.conf…