Docker进阶篇-Docker网络

一、描述

1、docker不启动,默认网络情况

查看网卡情况使用,ifconfig或者ip addr

ens33:本机网卡

lo:本机回环网络网卡

virbr0:在CentoS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现

有一个以网桥连接的私网地址的virbrO网卡(virbro网卡;它还有一个固定的默认IP地址

(192.168.122.1),是做虚拟机网桥的使用的,其作用是为连接其上的虚机网卡提供NAT访问外网

的功能。

如果不需要可以直接将lbvitd服务卸载:

yum remove libvirt-libs.x86 64

2、docker启动,网络情况

使用systemctl start docker启动Docker服务后,会多出一个docker0的虚拟网桥,默认IP地址为

172.17.0.1

当安装Docker后,默认会自动创建三个网络

docker network ls

二、docker常用网络命令

1、查看Docker网络模式

docker network ls

2、添加Docker网络 

docker network create xxx

3、删除Docker网络 

docker network rm xxx

4、查看网络源数据 

docker network inspect xxx

5、删除所有无效的网络 

docker network prune

三、docker网络的作用

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

四、docker网络模式

1、总体介绍

网络模式

简介

使用方式

bridge

为每一个容器分配、设置IP等,并将容器连接到一个docker0

虚拟网桥,默认为该模式。

--network bridge,默认使用docker0

host

容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

--network host

none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pari

和网桥连接、IP等。

--network none

container

新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等

--network container:NAME或者容器ID

2、容器实例内默认网络IP生产规则

  • 新建两个容器,命名为u1、u2
docker run  -it --name u1 ubuntu bash
docker run  -it --name u2 ubuntu bash
  • 查看u1网络设置
docker inspect u1 | tail -n 20

u1的IP地址为172.17.0.2

  • 查看u2网络设置
docker inspect u2 | tail -n 20

u2的IP地址为172.17.0.3

  • 删除u2,生成容器u3,并查看网络设置
docker rm -f u2
docker run  -it --name u3 ubuntu bash
docker inspect u3 | tail -n 20

u3的IP地址为172.17.0.3

  • 结论

docker容器内部的IP是有可能会发生改变的。

3、案例说明

3.1 bridge

Docker服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为

docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物

理网络。Docker默认指定了 docker0 接口的IP地址子网掩码,让主机和容器之间可以通过网桥

相互通信。

  • 查看 bridge 网络的详细信息,并通过 grep 获取名称项
docker network inspect bridge | grep name

  • ifoconfig

3.1.1 说明

1、Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时

会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容

器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的

Container-lP直接通信。

2、docker run的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是

docker0。在宿主机ifconfig,就可以看到docker0和自己createnetworketh0,eth1,

eth2......代表网卡一,网卡二,网卡三......,lo代表127.0.0.1,即localhostinet addr用来表示网

卡的IP地址。

3、网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。

①整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地

主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);

②每个容器实例内部也有一块网卡,每个接口叫eth0

docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

可知,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关

下各自拿到分配的ip,此时两个容器的网络是互通的。

3.1.2 验证

以tomcat容器为例,创建两个容器实例

docker run -it -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -it -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
docker ps

查看宿主机IP

ip addr | tail -n 8

查看容器tomcat81网络设置

docker exec -it tomcat81 bash
ip addr

查看容器tomcat82网络设置 

docker exec -it tomcat82 bash
ip addr

3.2 host

3.2.1 说明

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。

容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network space。容器

将不会虚拟出自己的网卡,而是直接使用宿主机的IP和端口。

3.2.2 案例 
警告

当使用了--network host时,-p端口映射将不会生效

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
docker ps

问题:

docke启动时总是遇见标题中的警告原因

docker启动时指定--network=host-net=host,如果还指定了-p映射端口,那这个时候就会有此

警告并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

解决:

解决的办法就是使用docker的其他网络模式,例如--network=bridge或者不使用-p进行端口映

射,这样就可以解决问题。

正确使用
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
docker ps

查看容器内部网络情况

docker inspect tomcat83 | tail -n 20

可知使用的是host模式,没有网关IP地址

docker exec -it tomcat83 bash
ip add

可知没有之前的配对显示,和宿主机网络一样 

没有设置-p端口映射,如何访问tomcat83?

访问方式:宿主机IP地址:8080

当有多个tomcat容器使用host模式,端口号依次递增,如8080、8081、8082......

假如运行了tomcat84使用host模式

访问方式:访问方式:宿主机IP地址:8081

docker run -d --network host --name tomcat84 billygoo/tomcat8-jdk8

3.2.3 总结

host模式容器共享宿主机网络IP,这样的好处是外部主机与容器可以直接通信。

3.3 none

3.3.1 说明

none模式下,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、

IP、路由等信息,只有一个lo(本地回环地址 127.0.0.1),需要手动为Docker容器添加网卡、配置IP等。

3.3.2 案例

新建tomcat84

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker ps

 查看tomcat84网络信息

docker inspect tomcat84 | tail -n 20

可知,none模式,没有网关IP地址

进入tomcat84内部查看网络信息

docker exec -it tomcat84 bash
ip addr

可知,只有网卡lo 

3.4 container

3.4.1 说明

新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。

新创建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围等。

同样,两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。

3.4.2 案例

使用tomcat做案例不合适,因为公用同一个IP和同一个端口,导致端口冲突。

这里使用Alpine做演示。

Apine Linux 是一款独立的、非商业的通用 Linux 发行版,专为追求安全性、简单性和资源效率的

用户而设计。 可能很多人没听说过过个 Linux 发行版本,但是经常用 Docker 的朋友可能都用过,

因为他小,简单,安全而著称,所以作为基础镜像是非常好的一个选择,可谓是麻雀虽小但五脏俱

全,镜像非常小巧,不到6M的大小,所以特别适合容器打包。

  • 运行容器镜像

本地没有镜像会自动拉取

docker run -it --name alpine1 alpine /bin/sh
# 指定和 alpine1 容器共享网络
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
  • 验证

查看alpine1网络情况

docker ps

查看alpine2网络情况 

docker ps

  • 关闭alpine1,查看alpine2

关闭alpine1容器

 查看alpine2容器

可知关闭alpine1,alpine2只剩下回环地址

3.5 自定义网络

3.5.1 说明

实现通过服务名进行网络通信,而不只是通过IP进行网络通信。

3.5.2 案例
  • 查看目前网络列表
docker network ls

  •  新建自定义网络
docker network create fanhe_network
docker network ls

  • 创建容器指定加入自定义网络
docker run -d -p 8081:8080 --network fanhe_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network fanhe_network --name tomcat82 billygoo/tomcat8-jdk8
docker ps

  • 查看容器网络信息

查看tomcat81网络信息

docker exec -it tomcat81 bash
ip addr

查看tomcat82网络信息 

docker exec -it tomcat82 bash
ip addr

  • tomcat81与tomcat82通过IP地址互相验证网络连通性

tomcat81  ping  tomcat82

ping 172.21.0.3 -c 4

tomcat82  ping  tomcat81

ping 172.21.0.2 -c 4

  • tomcat81与tomcat82通过服务名互相验证网络连通性 

tomcat81  ping  tomcat82

ping tomcat82 -c 4

tomcat82  ping  tomcat81

ping tomcat81 -c 4

  • 结论 

自定义网络本身就维护好了主机名和IP的对应关系。

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

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

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之QRCode组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之QRCode组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、QRCode组件 用于显示单个二维码的组件。 子组件 无。 接口 QRCode(value: st…

C#中dll引用常见错误

当你在使用C#开发程序时,经常会遇到需要引用外部的dll文件来扩展程序的功能或者使用一些第三方库。然而,在引用这些dll文件的过程中,有时候会遇到一些问题,比如上面提到的错误信息:“未能加载文件或程序集“System.Run…

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能

前言 学习资料: TensorRT 源码示例 B站视频:TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码:cookbook → 07-Tool → trtexec 官方文档:trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…

基于微信小程序的校园水电费管理小程序的研究与实现

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

SpringBoot项目打包成jar包供第三方使用实践

文章目录 1.使用者手动配置 basePackages1.1 第三方jar项目1.2 使用者项目1.2.1 使用者配置1.2.2 项目测试 2.使用者通过注解的方式引入2.1 第三方jar项目2.2 使用者项目2.2.1 使用者配置2.2.2 项目测试 3.SpringBoot Starter 方式3.1 第三方jar项目3.2 使用者项目3.2.1 使用者…

linux、windows 安装 vue-cli

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global 实现的零配置原型开发。 一个运行时依赖 (vue/cli-service) 可升级; 基于 webpack 构建&#…

【Linux操作系统】:Linux开发工具编辑器vim

目录 Linux 软件包管理器 yum 什么是软件包 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux 开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 插入模式 插入模式切换为命令模式 移动光标 删除文字 复制 替换 撤销 跳至指…

【Redis】字符串原理--简单动态字符串SDS

一.SDS定义 free 属性值为0,标识SDS没有分配任何未使用空间。len 属性值为5,标识SDS保存了一个5字节长度的字符串。buf 属性是一个char类型数组,数组的前5个字节保存了,R e d i s 五个字符,最后一个保存空字符串 \0…

Cassandra 命令大全

文章目录 1. 连接与基本操作2. 数据库管理3. 表(Column Family)操作4. 集群管理5. 权限管理6. 其他高级功能7. 条件查询与聚合操作8. 索引管理9. 用户权限和角色管理10. 安全性相关设置11. 一致性级别控制12. 用户定义类型 (UDTs)13. 用户定义函数 (UDFs…

【C生万物】C语言数据类型、变量和运算符

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

亚信安慧AntDB推动技术创新与满足用户需求

随着互联网技术的迅猛发展,大数据时代的到来,数据库的需求不断增长。在这样的背景下,国产分布式数据库正逐渐崭露头角,AntDB作为其中的重要代表,也积极参与到了这场竞争中。作为国内的技术创新者,AntDB不仅…

Solidworks 与 MATLAB 联合仿真

本文主要讲解了“MATLAB与SolidWorks的联合仿真怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MATLAB与SolidWorks的联合仿真怎么实现”吧! 下载插件。 1、…

SpringBoot 登录检验JWT令牌 生成与校验

JWT官网 https://jwt.io/ 引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>设置过期时间 LocalDateTime localDateTime LocalDateTime.now().…

Python flask 模板详解

文章目录 1 概述1.1 模板简介1.2 templates 文件1.3 简单应用 2 模板语法2.1 for 循环2.2 if 判断 3 模板的继承3.1 格式要求3.2 实现示例3.3 复用父模板的内容&#xff1a;super 1 概述 1.1 模板简介 定义&#xff1a;定义好的 html 文件&#xff0c;用于快速开发 web 页面J…

计算机毕业设计 | SSM 校园线上订餐系统(附源码)

1&#xff0c; 概述 1.1 项目背景 传统的外卖方式就是打电话预定&#xff0c;然而&#xff0c;在这种方式中&#xff0c;顾客往往通过餐厅散发的传单来获取餐厅的相关信息&#xff0c;通过电话来传达自己的订单信息&#xff0c;餐厅方面通过电话接受订单后&#xff0c;一般通…

Vue 上门取件时间组件

本文使用vue2.0elementui 制作一个上门取件时间组件&#xff0c;类似顺丰&#xff0c;样式如下&#xff1a; 大概功能&#xff1a;点击期望上门时间&#xff0c;下面出现一个弹框可以选择时间&#xff1a; 首先我们定义一些需要的数据&#xff1a; data() {return {isDropdown…

算法学习——LeetCode力扣链表篇1

算法学习——LeetCode力扣链表篇1 203. 移除链表元素 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 示例 …

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

进程和线程的区别详解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 进程 进程在系统中是如何管理的 进一步认识PCB 线程 能否一直增加线程数目来提高效率 进程和线程…

SpringMVC精简知识点

SpringMVC 数据格式化基本数据类型和字符串自动转换特殊数据类型和字符串自动转换 验证及国际化应用实例注意事项和使用细节注解的结合使用数据类型转换校验核心类-DatBinder取消某个属性的绑定中文乱码解决处理json和HttpMessageConverter<T>作业布置SpringMVC文件上传自…