第08讲:Docker中的网络类型bridge和host

news2024/11/20 11:42:48

Docker 中的网络模式早先是 3 种,后来又加了 1 种,一共是 4 种。这里,我们只涉及、介绍使用其中 2 种网络模式:bridge 模式和 host 模式。

  • bridge 是驱动( Driver )类型为 bridge 的默认网络;
  • host 是驱动( Driver )类型为 host 的默认网络。

不同的网络模式的背后,存在一个驱动( Driver )的概念。

你可以通过下述命令查看 Docker 当前的网络情况:

[root@localhost ~]#docker network ls

如果愿意,你可以任意创建驱动( Driver )类型为 bridge 或 host ( 以及其它 2 种类型 )的网络。

在这里插入图片描述

一、bridge 网络

提示:这种模式下,容器和宿主机的地位是平等的

在驱动类型是 bridge 的网络( 默认网络为 bridge )中,容器和宿主机都连接到了一个叫作「网桥」的东西上,这正是「bridge 网络」这个称呼的由来。

说明:
这里涉及到的『网桥』的概念其实和我们使用 docker 并没有多大的关系,我们后续的 docker 的命令的使用中不会直接面对这个概念,所以,我们不过多地展开了。
这里,大家对它有一个基本的认识就足够了:正因为设备( 多个容器和宿主机 )连上了同一个网桥,所以,它们才在一个“局域网”中。也正因为如此,它们的( 虚拟 )IP 的前半部分一定是一样的,即,它们在同一个网段中。

这种模式下,每一个容器都有专属于自己的 IP 。例如,172.23.0.3

你可以通过以下命令查看某个容器的 IP 地址:

# 查看指定容器的 IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名

示例:查看tomcat1容器在docker中的ip地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' tomcat1

你也通过下面的命令查看所有容器的 IP 地址:

# 查看所有容器的 IP
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

需要注意的是,宿主机一定是在所有的虚拟网络中,都有它的「位置」有点就“九省通衢”的感觉。因此,宿主机每「多加入」一个网络,它就会「多」出来一个虚拟 IP 。你可以通过如下命令查看你的宿主机所具有的所有的 IP( 包括了回环IP、物理网络 IP 和虚拟网络 IP )

a、默认的 bridge 网络

你可以通过 docker network ls 来查看网络信息,其中有一个名为 bridge 的 bridge 模式网络。

默认情况下,当你使用 docker run 命令时去创建并启动一个容器时,该容器的网络模式就是 bridge 模式。前提是你在 docker run 中没有使用下面讲到的 --llink 。

在这种情况下,docker 会见这个新创建的容器添加到名为 bridge 的网络中。你可以通过如下命令查看 brige 网路中有哪些容器,以及它们的 IP :

docker network inspect --format '{{json .Containers}}' bridge

b、自建 bridge 网络

你可以使用如下命令自建 bridge 类型的网络:

语法:
docker network create --driver bridge <网络名>

示例:
# docker network create -d bridge hello

接下来再使用 docker run 创建并启动容器时多使用一个 --network <网络名> 的选项,将容器添加到指定局域网中。例如:

docker run -d --rm --net hello --name mysql-3306 -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_ROOT_HOST=% \
    mysql:8.0.16

docker run -d --rm --net hello --name mysql-3307 -p 3307:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_ROOT_HOST=% \
    mysql:8.0.16

使用之前的命令,你会发现它们仨都在 hello 局域网中。

c、使用 bridge 网络

当多个容器在同一个 bridge 类型的局域网中( 例如上例的 hello 局域网 )时,在 A 容器中,可以使用 B 容器的容器名替代 B 容器的 IP 地址!

  • 进入上例的 mysql-3306 容器:

    docker exec -it mysql-3306 /bin/bash
    
  • 第 2 步:在 mysql-3306 中,用 mysql 的命令行客户端去连 mysql-3307

    mysql -h mysql-3307 -u root -p123456
    

注意:这里 -h 的后面本应该出现 mysql-3307 服务器的 IP 地址的,现在这里出现的是它的名字。

  • 第 3 步:创建名为 woniu_db的 database 作为证明,然后退出。

    mysql> create database woniu_db;
    
  • 第 4 步:分别进入 mysql-3306 和 mysql-3307,分别用 mysql 命令行客户端连接自己,验证一下,scott 数据库在哪里?

d、–link 选项

前一章说明并验证过:在同一个 bridge 类型的网络中,两个容器可以直接用对方的容器名来替代本该使用 IP 的地方。

但是 bridge 网络例外。多个容器都位与 bridge 网络中,按理说本该符合上述规则,但是这就是 bridge 网络的特殊之处。

你同样可以使用 mysql-3306 和 mysql-3307 来做验证,你在 mysql-3307 中使用 -h mysql-3306 来连接 mysql-3306 你会看到如下错误信息:

ERROR 2005 (HY000): Unknown MySQL server host 'mysql-3306' (0)

想要在 bridge 网络中实现类似效果,必须多使用 --link 选项。从上帝视角看,当 A 容器( 未来 )要去使用 B 容器的名字去连接 B 时,那么你在创建并启动 A 容器的 docker run 命令中要多使用 --link <B容器名> 才行。例如:

docker run -d --name mysql-3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_ROOT_HOST=% mysql:8.0
docker run -d --name mysql-3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_ROOT_HOST=% --link mysql-3306 mysql:8.0

再验证一次,这次就可以了。

2、host 网络

提示:这种模式下,容器相当于是宿主机中的一个进程,而「不是一个独立的机器」。

在 host 模式中,虚拟机( 即,容器 ) 没有自己的 IP ,它用到的是宿主机的 IP( 和端口 ),这种情况下,各个虚拟机( 即,容器 )谁是谁,主要靠它占用的是宿主机的哪个端口来分辨。

host 网络的特点在于,容器中所运行的程序必然会占用宿主机的对应端口。即,mysql 容器必然占用宿主机的 3306 端口;redis 容器必然占用宿主机的 6379 端口;ngxin 容器必然占用 80 端口;… 。所以,host 网络模式创建并运行的容器,不需要 -p 来做端口映射。例如:

docker run -d --rm --name=mysql-3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -e MYSQL_ROOT_HOST=% \
    -v /docker/mysql/3306/data:/var/lib/mysql \
    --net host \
    mysql:8.0

如果你使用之前查看容器 IP 的命令来查看 mysql-3306 的 IP ,你会发现它没有自己的 IP 。

host 网络最大的优点就是理论上速度快( 因为,没有网桥分发数据这个环节 ),它的性能要好于 bridge 类型的网络。但是付出的代价是:因为无法指定端口映射,因此在同一个宿主机上只能其一个特定类型的服务。

例如,在 host 模式下,你无法启动 2 个 mysql 容器。因为它俩都需要宿主机的 3306 端口。但宿主机 3306 端口只有一个,因此,只有第一个 mysql 容器能启动成功。

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

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

相关文章

『 MySQL篇 』:库操作、数据类型

目录 目录 一、初识数据库 数据库 数据库管理系统 SQL语言 二、详解MySQL MySQL 存储引擎 三、简单的库操作 设置数据库的编码字符集 创建数据库 显示数据库 使用数据库 删除数据库 四、MySQL数据类型 数值类型 字符串类型 日期类型 一、初识数据库 学习 MyS…

SpringBoot整合ELK教程

SpringBoot整合ELK教程 1 基础概念 ELK 即 Elasticsearch、Logstash、Kibana&#xff0c;组合起来可以搭建线上日志系统&#xff0c;本文主要讲解使用 ELK 来收集测试框架产生的日志。 Elasticsearch&#xff1a;用于存储收集到的日志信息&#xff1b;Logstash&#xff1a;用于…

如何成为优秀合格的管理者之角色定位

目录 导语 一、管理者的角色误区和角色定位 &#xff08;一&#xff09;管理者对上级 &#xff08;二&#xff09;管理者对下属 *如何要做好“老师”的角色&#xff1f; &#xff08;三&#xff09;管理者跨部门协作 &#xff08;四&#xff09;管理者对自己 二…

springboot:接手老项目,领导让更新数据库说明文档,如何3分钟完成任务

0 引言 最新在重新整理老项目的文档&#xff0c;其中数据库说明文档上一版更新还是在1年多前&#xff0c;文档中的数据结构说明与当前数据库严重脱节&#xff0c;所以更新数据库说明文档已经是迫在眉睫的事情了。 因为项目是一个比较大型且“年长‘的项目&#xff0c;涉及了多…

谷粒商城-基础篇-Day09-整合Ware服务

整合Ware服务 将服务注册到nacos中 spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: gulimall-wareMapperScan("com.atguigu.gulimall.ware.dao")//mybatis包扫描 SpringBootApplication EnableDiscoveryClient//开启服务发现 EnableT…

进入内存,透彻理解数据类型存在的意义,整形在内存中存储,大小端字节序,浮点型在内存中存储

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习C进阶、数据结构、算法、JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01;&#x1f4dc;所属专栏&#xff1a;C语言✈往期博文回顾&#xff1a;【Java基础篇…

Java——》AtomicInteger源码分析

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Java——》AtomicInteger源码分析一、测试用例二、…

Java基础学习笔记(一)面向对象

序言&#xff1a;主要记录一下java的学习笔记&#xff0c;用作面试复习&#xff0c;参考的学习资料是尚硅谷Java网课链接 面向对象是P39~P69内容 文章目录一、类和对象二、传值方式三、静态与静态代码块四、包五、构造方法六、继承与构造方法七、多态八、方法的重载与重写8.1 …

[JAVA安全]CVE-2022-33980命令执行漏洞分析

前言 在 i春秋的漏洞靶标上看见了此漏洞&#xff0c;所以前来分析一下漏洞原理&#xff0c;比较也是去年 7月的漏洞。 漏洞描述&#xff1a;Apache官方发布安全公告&#xff0c;修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞&#xff0c;漏洞编号&am…

Linux驱动

Linux驱动 驱动 1.驱动课程大纲  内核模块  字符设备驱动  中断 2.ARM裸机代码和驱动有什么区别&#xff1f;  共同点&#xff1a;都能够操作硬件 (都操作寄存器)  不同点&#xff1a;  裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的框架格…

FastReport .NET 2023.1.8 Crack

FastReport .NET适用于 .NET 6、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可以在 Microsoft Visual Studio 2022 和 JetBrains Rider 中使用。 快速报告.NET 利用 .NET 6、.NET Core、Blazor、ASP.NET、MVC、Windows Forms 和 Mono 数据表示领域专家…

前端入门笔记07 —— js应用

DOM基础 document object model 基本操作 增删改查 查&#xff1a; document成员函数传入 id class tagName等内容获取DOM节点css选择去查询节点获取的DOM对象访问DOM对象的成员 let domResult; domResult document.getElementsByTagName(li); //返回一个类数组对象 Node…

Electron对在线网站做数据交互方案,实现在线网站判断Electron调用自定义接口通讯

(防盗镇楼)本文地址:https://blog.csdn.net/cbaili/article/details/128651549 前言 最近在撸VUE,想要实现一份代码既能构建Web又能构建Electron应用 并且能够判断环境是浏览器还是Electron,随后在Electron中做一些特定的事情 以往的Electron通信依靠IPC通信完成,但是发布到…

2023年,“新一代”固定资产管理平台——支持低代码平台

固定资产是各企业和工厂的主要生产要素&#xff0c;占企业整体资金比例较重&#xff0c;而且随着企业的发展&#xff0c;实物资产的数量和员工日益增多&#xff0c;固定资产的重要性日益凸显。如何高效管理这些实物资产也成了企业管理者经常考虑的问题。单纯依靠人工表格管理固…

python(一) 字符串基本用法

python&#xff08;一&#xff09; 字符串基本用法 目录1.环境安装2. 变量介绍3.变量的命名规则4. 字符串 String 基础4.1 title() 修改单词的大小写 title()4.2 upper() : 将字符串全部改为大写4.3 lower(): 将字符串全部改为小写4.4 字符串的拼接 合并字符串5. 使用制表符或者…

关于抖音年前活动的需求与思考

目录 一、前言 二、需求1 1、后端需求 2、前端需求 三、领取抽卡次数需求 1、后端需求 2、前端需求 四、必得现金红包需求 五、送重复卡需求 1、后端需求 2、前端需求 六、幸运抽奖需求 1、抽奖功能 1.1、首次(或多次)3张节气卡 抽奖 1.2、非首次或多次后5张节气…

【阶段三】Python机器学习14篇:机器学习项目实战:支持向量机分类模型

本篇的思维导图: 项目实战(支持向量机分类模型) 项目背景 目前各大新闻网站很多,网站上的消息也是各式各样,本项目通过建立支持向量机分类模型进行新闻文本分类。 数据收集 所需要的数据文件如下百度云盘链接: 链接:https://pan.baidu.com/s/1Zj-uTt_wdRcmDt3aumZ…

Java加解密(七)数字签名

目录数字签名1 定义2 数字签名特点3 应用场景4 JDK支持的信息摘要算法5 Bouncy Castle 支持的信息摘要算法6 算法调用示例数字签名 1 定义 数字签名&#xff08;digital signature&#xff09;是一种电子签名&#xff0c;也可以表示为一种数学算法&#xff0c;通常用于验证消…

【强训】Day06

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 不要二2. 把字符串转换成整数答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 关于抽象类与最终类&#xff0c;下列说法错误的是&#xff1f; A 抽象类能被继承&#xff0c;最终…

C语言零基础项目:六边形扫雷寻宝模式,详细思路+源码分享

程序简介六边形扫雷&#xff0c;寻宝模式&#xff0c;稍稍介绍一下。他也是要把所有安全的地方点出来。他没有扫雷模式的消零算法。每一个安全的点都需要单独挖出来&#xff0c;一次显示一个格子。添加了生命值的概念&#xff0c;也就是说存在一定的容错。显示的数字有别于扫雷…