docker系列(8) - docker网络

2023-09-19 09:40:56

8. docker网络

8.1 四种网络模式

网络模式说明
bridge为每一个容器分配、设置IP等,并将容器连接到一个dockr0。 虚拟网桥,默认为该模式
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
none容器有独立的network namespace,但并没有设置网络。
container一个容器借用另一个容器的网络,即两个容器公用一个网络

8.2 常用命令

命令说明
docker network ls查看当前所有的网络
docker inspect t1|tail -n 20查看name为t1的容器的网络(只需要查看前20行就可以了)

命令操作:

docker network ls

在这里插入图片描述

docker network inspect bridge
  • 桥接模式的网络,会自动分配一个网关为172.17.0.1,然后指定网段范围为172.17.0.0/16
    在这里插入图片描述

对于xxx.xxx.xxx.xxx/16或者xxx.xxx.xxx.xxx/24。那么这个斜杠后面的数字代表什么意思呢?
实际上,IPv4地址是由32位二进制数组成的。以192.168.0.0/16为例,它的二进制表示是11000000.10101000.00000000.00000000。
/16表示前16位是网络地址,后16位是主机地址,即从11000000.10101000.00000000.00000000到11000000.10101000.11111111.11111111,
所表示的IP地址范围是从192.168.0.0到192.168.255.255,其中最后一个地址为广播地址,因此可用IP地址数量为65534。
如果是/24,它表示前24位是网络地址,后8位是主机地址。
例如,192.168.0.0/24表示的IP地址范围是从11000000.10101000.00000000.00000000到11000000.10101000.00000000.11111111,
所表示的IP地址为192.168.0.0到192.168.0.255,其中最后一个地址为广播地址,因此可用IP地址数量为254。

172.17.0.0/16代表的网络IP范围为172.17.0.0 - 172.17.255.255
最后一个172.17.255.255:是作为广播地址的,不能使用其作为容器IP。

docker inspect t1|tail -n 20

在这里插入图片描述

注意:docker容器启动时,默认是桥接(bridge)模式,此时每个容器内部都会分配一个不同的IP地址,并且这个地址随着启动的顺序不同,是会变化的。
这个给跨容器访问带来了问题。有可能之前连接的IP地址发生变化了。那么解决的方法就是可以使用name名称访问。

8.3 桥接网络模式

8.3.1 桥接网络模式说明

Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。
然后docker又创建了一个桥接网络,类似于路由器。
在路由器上定义了网关,以及内部IP网段地址,类似于路由器提供了很多个网口veth。
然后每个容器内部会有一个独立的虚拟网卡eth0连接到路由器的每个网口veth上,从而在虚拟机内部的所有容器处在同一个虚拟网段中,这样彼此之间就可以互相访问。

8.3.2 桥接网络模式案例

启动两个tomcat容器实例。

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

在这里插入图片描述

在宿主机中查看ip addr,可以看到网卡88:vethefec9eb@if8790: vethd13f1d2@if89
在这里插入图片描述

通过docker exec -it tomcat81 bash进入到容器tomcat81内部,查看网络
在这里插入图片描述

通过docker exec -it tomcat82 bash进入到容器tomcat82内部,查看网络
在这里插入图片描述

通过以上网络详情可以看到,以下匹配关系:
宿主机88: vethefec9eb@if87 ==> 容器tomcat81:87: eth0@if88:
宿主机90: vethd13f1d2@if89 ==> 容器tomcat82:89: eth0@if90:
宿主机的虚拟网卡docker0上存在veth和容器的eth0的一对一关系。

8.4 host网络模式

8.4.1 host网络模式说明

Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。
然后docker容器直接使用宿主机的网卡eth0。

8.4.2 host模式案例

#带端口映射的
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

在这里插入图片描述

host模式在启动时,由于我们设置了端口映射,会出现警告信息,表示当使用host网络模式时,指定的端口映射规则无效。
在上面的图片也可以看到没有端口映射发生,此时端口号以主机端口号为主,如果重复时,则递增。

#不带端口映射的
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8

在这里插入图片描述

当使用不带端口映射的host模式启动时,就不会有警告信息了。

#查看容器的网络配置信息
docker inspect tomcat83

host网络模式下,容器没有配置网关,ip等信息
在这里插入图片描述

容器内部访问网络时,发现与宿主机的网络配置一模一样,它其实就是使用的是宿主机的网络环境。
在这里插入图片描述

所有我们在访问tomcat时,直接使用宿主机的网络配置。

8.5 none网络模式

在none模式下,容器内部没有任何网络配置,只有一个lo(localhost),即禁用网络功能。

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

在这里插入图片描述

查看网络配置,none网络模式下,没有任何网关和IP信息。
在这里插入图片描述

容器内部查看,除了lo以外,没有任何网络配置。
在这里插入图片描述

因此,通常情况下不使用。

8.5 container网络模式

8.5.1 container网络模式说明

8.5.2 container网络模式案例

错误应用:tomcat
这是一个特殊的网络模式,如果启动两个tomcat容器,会出现报错信息。即tomcat应用不能使用该模式。

docker run -d -p 8085:8080                              --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8

在这里插入图片描述

发生错误的原因是tomcat85和tomcat86公用同一个IP同一个端口,导致端口冲突。

成功应用:Alpine Linux应用,非常轻量级的linux,只有6M大小。

docker run -it -d --name alpine1 alpine /bin/sh
docker run -it -d --name alpine2 --network container:alpine1 alpine /bin/sh

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到alpine2和alpine1使用相同的网络设备,并且都是桥接模式。
注意:由于alpine2使用的是alpine1的网络设备,当容器alpine1停止后,alpine2将没有网络设备可以使用了。

8.6 自定义网络

问题:docker重启容器,容器内部的IP地址会发生变化。
解决方案:可以通过指定容器服务名来访问。

8.6.1 创建自定义网络

# 创建自定义网络
docker network create netshare

# 加入自定义网络
docker run -d -p 8081:8080 --network netshare --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network netshare --name tomcat82 billygoo/tomcat8-jdk8

加入相同的自定义网络中后,在tomcat81容器内部ping tomcat82 或者tomcat82容器内部ping tomcat81 都可以相互ping通对方。
在这里插入图片描述

这样解决了ip地址发生变更的问题。

更多推荐

【Java 基础篇】Java对象反序列化流详解

在Java编程中,对象序列化和反序列化是常见的操作,用于将对象转换为字节流以便于存储或传输,并从字节流中重新构建对象。本文将重点介绍对象反序列化流的用法和相关概念,帮助基础小白理解这一重要的主题。什么是对象反序列化?对象反序列化是将之前序列化的对象字节流还原为对象的过程。这个过程是序列化的逆过程,它可以让我们重新获得原

Vue3路由

文章目录Vue3路由1.载入vue-router库2.实例2.1Vue.js+vue-router实现单页应用2.2router-link创建链接2.3router-view显示与url对应组件2.4`<router-link>`相关属性Vue3路由1.载入vue-router库Vue.js路由需要载入vue-rout

内外统一的边缘原生云基础设施架构——火山引擎边缘云

近日,火山引擎边缘云边缘计算架构师郭少巍在LiveVideoStackCon2023上海站围绕火山引擎边缘云海量分布式节点和上百T带宽,结合边缘计算在云基础设施架构方面带来的挑战,分享了面对海量数据新的应用形态对低时延和分布式架构的需求,边缘计算将成为新一代边缘计算云基础设施以及未来边缘计算发展的未来展望。近十几年众多

浏览量5.54亿,“平替大军”击退“钱包刺客”?丨小红书消费趋势分析

当代年轻人的消费观念,从贷款买大牌的“精致穷”,逐渐演变为人间清醒式地购物...他们爱上麦当劳的“穷鬼套餐”,爱喝瑞辛9.9元畅饮,爱和小学生成为“饭搭子”吃小饭桌,爱买低价打折出售的剩菜盲盒,爱出门吃饭前先查看团购套餐,似乎所有省钱技巧都被他玩得轻车熟路。是大牌不香了吗?还是当代年轻人的消费趋势有了新的变化?本篇内容

《Python趣味工具》——自制emoji(4)计算机二级考试题

前面我们学习了如何制作emoji,相信你也是有很多想法了吧!今天我们就来看看几道计算机二级考试真题。1.绘制套圈使用turtle库的circle()函数和seth()函数绘制套圈。最小的圆圈半径为10像素,不同圆圈之间的半径差是40像素。ps:注意要和题目要求的圆形方向一致哦~可以在绘制前先将方向调整为90度。示例代码

Kubernetes介绍(一)

kubernetes官网:Kubernetes1、Kubernetes是什么Kubernetes也称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,k8s是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。Kubernetes可以实现以下功能:自动化容器的部署和复制

Swing程序设计详解(一)

【今日】“若你决定灿烂,山无遮,海无拦”目录初识Swing一Swing简述二Swing常用窗体2.1JFrame窗体2.2JDialog对话框2.3JOptionPane小型对话框(1)通知框(2)确认框(3)输入框(4)自定义对话框三常用布局管理器3.1绝对布局3.2流布局3.3边界布局3.4网格布局四常用面板4.1

如何实现不同MongoDB实例间的数据复制?

作为一种SchemaFree文档数据库,MongoDB因其灵活的数据模型,支撑业务快速迭代研发,广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中,会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整合、数据库拆分、容灾等业务场景,存在MongoDB迁移或同步的业务诉求。在M

【CV、数据分析、AI产品经理】2024届校招岗位汇总

CV计算机视觉岗位数量公司岗位名称岗位职责截止日期1网易雷火人工智能算法工程师(虚拟交互/图形学和动画方向)岗位描述1.负责面向虚拟角色/虚拟人的创建(捏脸)和驱动(表情合成、动作捕捉和重定向、动作合成、舞蹈合成、物理模拟)等系统的设计和实现2.深度参与上述能力在游戏和泛娱乐产品(短视频、直播、虚拟偶像、VTuber)

【产品经理】深入B端SaaS产品设计核心理念

这几年各企业的B端业务都在做SaaS平台,但对SaaS的了解还不是完全全面,对于一些产品的定位以及设计还在探索中本文讨论“为什么采用SaaS模式”、“SaaS产品有哪些”以及“如何做好SaaS产品设计”三个话题,核心是产品设计,主要从需求定义、方案设计和开发交付3方面,共计讨论10个问题点。一、Why为什么要用SaaS

小谈设计模式(3)—策略模式

小谈设计模式(3)—策略模式专栏介绍专栏地址专栏介绍策略模式主要角色环境(Context)抽象策略(Strategy)具体策略(ConcreteStrategy)角色总结核心思想封装算法定义抽象策略使用环境类思想总结Java代码实现——以一个游戏角色攻击方式的例子首先,我们定义一个抽象策略类AttackStrategy

热文推荐