docker系列(8) - docker网络

news/2024/11/26 21:24:35/

文章目录

  • 8. docker网络
    • 8.1 四种网络模式
    • 8.2 常用命令
    • 8.3 桥接网络模式
      • 8.3.1 桥接网络模式说明
      • 8.3.2 桥接网络模式案例
    • 8.4 host网络模式
      • 8.4.1 host网络模式说明
      • 8.4.2 host模式案例
    • 8.5 none网络模式
    • 8.5 container网络模式
      • 8.5.1 container网络模式说明
      • 8.5.2 container网络模式案例
    • 8.6 自定义网络
      • 8.6.1 创建自定义网络

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
Container
Container
Container
docker0 bridge
eth0
veth
veth
eth0
veth
eth0
eth0

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
Container
host
宿主机eth0
Container
host
Container
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网络模式说明

Host
Container
docker0 bridge
eth0
veth
Container
eth0

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地址发生变更的问题。


http://www.ppmy.cn/news/1117179.html

相关文章

机器视觉常见的问题及解决

应该怎样选择相机? 选择相机却往往刻不容缓的的问题摆在机器视觉工程师面前,因此,选择相机了解以下几个方面问题: 通常您首先需要知道系统精度要求和相机分辨率,可以通过公式:X方向系统精度(X方…

基于matlab求两个数最大公约数函数gcd

一、gcd函数 在MATLAB中,可以使用内置函数gcd()来求两个数的最大公约数。 二、示例 以下是使用MATLAB求两个数最大公约数的示例代码: % 定义两个数 a 36; b 48; % 求最大公约数 gcd_result gcd(a, b); % 输出结果 fprintf(最大公约数为&#xff1…

二叉树链式结构基础

一、前中后序遍历 1、前序遍历:前序遍历是采用 根 - 左子树 - 右子树 的顺序遍历二叉树。 也就是把整棵树分为一个个子问题,每个结点都可以看作 根、左子树、右子树 三个部分 (左右子树可以为空,就是单节点,根为空就表示探索完成&…

容器中的nginx暴露一个端口部署多个功能的网站

随着容器的应用越来越多,将nginx部署在容器中也是常有之事。可能事先创建容器时只暴露了一个端口给浏览器连接,后面又想根据添加多个应用,根据URL的不同来访问不同的应用。比如在暴露了主机的83端口给nginx容器的80端口,原来只有一…

SpringCloud Alibaba 整合Sentinel的基本使用

文章目录 一、什么是Sentinel二、Sentinel 的主要特性1. 流量控制:2. 熔断降级:3. 实时监控:4. 规则配置:5. 集成方便: 三、Sentinel 分为哪几部分:1. 核心库(Java 客户端)2. 控制台&#xff08…

RISC-V架构学习——C语言内嵌汇编总结

1、C语言内嵌汇编的作用 (1)优化:对于特别重要代码进行优化,出于性能的考虑; (2)C语言需要借助汇编指令来实现特殊功能。比如:C语言中访问系统寄存器就需要借助CSR指令; …

泡泡玛特大火,潮玩行业如何利用软文推广出圈

随着经济的发展,各类潮玩创意落地、新产品层出不穷,也导致潮玩行业陷入了类目繁多,但是新品很难出圈的困境。泡泡玛特作为年轻人中十分受欢迎的品牌,紧跟消费浪潮,成为国内营销赛道上一个让人无法忽视的潮玩IP。那么潮…

aspose-words导出word方法

一、引用依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>19.5</version><classifier>jdk17</classifier></dependency>二、导出类 public class WordTable {//定…