Docker之Docker网络

news2024/11/19 1:29:36

Docker网络

    • 1. 理解Docker0
      • 1.1 测试
      • 1.2 原理
      • 1.3 小结
    • 2. -link
    • 3. 自定义网络
      • 3.1 网络模式
      • 3.2 测试
      • 3.3 自定义网络
    • 4. 网络连通
    • 5. 实战:部署Redis集群
    • 6. 总结

1. 理解Docker0


  • 清空所有环境
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)

1.1 测试


  • 三个网络
    在这里插入图片描述

  • 问题:docker 是如何处理容器网络访问的?

    # 测试 进行一个tomcat
    docker run -d -P --name tomcat01 tomcat
    # 查看网络
    docker exec -it tomcat01 ip addr
    
  • 此时出现报错。这是版本不一致的缺失命令

    OCI runtime exec failed: exec failed: unable to start container process: exec: "ip": executable file not found in $PATH: unknown
    
  • 进入容器,更新所需的命令
    shell docker exec -it tomcat01 /bin/bash apt update && apt install -y iproute2
    在这里插入图片描述

  • 更新完成之后退出容器,再次输入docker exec -it tomcat01 ip addr 查看网络情况

  • 发现容器启动的时候会得到一个 eth0@if7 的 ip 地址,这是 docke r分配的
    在这里插入图片描述

  • 思考:Linux 能不能 ping 通容器内部? --可以
    在这里插入图片描述

  • 容器内部可以 ping 通外界吗?–可以

    # 进入容器之后需要执行以下命令
    
    apt-get update
    apt install iputils-ping
    apt install net-tools
    

    在这里插入图片描述

1.2 原理


  1. 我们没启动一个 docker 容器,docker 就会给 docker 容器分配一个 IP,我们只要安装了 docker,就会有一个网卡 docker0 桥接模式,使用的技术是 veth-pair 技术

    • 再次测试 ip addr ,发现多了一个ip
      在这里插入图片描述
  2. 在启动一个容器测试,发现又多了一对网卡
    在这里插入图片描述

    • 再次进入容器 tomcat2 内部更新命令资源,退出重新查看ip
    • 可以发现和上面的是能对应上的,所以说是一对网卡!
      在这里插入图片描述
  • 我们发现这个容器带的网卡,都是一对对的
  • veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
  • 正因为有这个特性,利用 veth-pair 充当一个桥梁,连接各种虚拟网络设备的
  • OpenStac,Docker 容器之间的连接,OVS的连接,都是使用 veth-pair 技术
  1. 我们来测试一下 tomcat01 和 tomcat02 是否可以 ping 通
    # 进入容器更新命令资源
    docker exec -it tomcat02 /bin/bahs
    apt install iputils-ping
    
    # 更新完成后退出容器,输入ping命令
    docker exec -it tomcat02 ping 172.17.0.2
    
    在这里插入图片描述

结论:容器和容器之间是可以 ping 通的,并且是通过 docker0 而非直接连通

在这里插入图片描述

  • 所有的容器不指定网络的情况下,都是 docker0 路由的,docker 会给我们的容器分配一个默认的可用 ip

1.3 小结


  • Docker 使用的是 Linux 的桥接,宿主机是一个 Docker 容器的网桥 docker0
    在这里插入图片描述

  • Docker 中所有网络接口都是虚拟的(不需要考虑硬件因素),虚拟的转发效率高(内网传递文件)

  • 只要容器删除,对应的一对网桥就没了

  • 高可用!

思考一个场景:我们编写了一个微服务,database url=ip:项目不重启,但是数据ip换了,我们希望可以处理这个问题。故通过名字来进行访问容器。

2. -link


$ docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

# 运行一个tomcat03 --link tomcat02
$ docker run -d -P --name tomcat03 --link tomcat02 tomcat
e63b5bd877a4ece0c56101064bb2f653c5e01f83baef067d9c7cd0db87e63208

# 运行一个tomcat03 --link tomcat02 可以ping通
$ docker exec -it tomcat03 ping tomcat02

# 用tomcat02 ping tomcat03 ping不通

# 如果报错OCI错误,是因为容器没有安装ping命令,依次执行以下命令
apt-get update
apt install iputils-ping
apt install net-tools

在这里插入图片描述

探究

  • 查看网络详细信息。可以发现 link 链接的信息

    docker inspect tomcat03
    

    在这里插入图片描述

  • 查看本地网桥

    docker network inspect 网络id 网段
    

    在这里插入图片描述

  • 显示了三个容器的 ip 地址
    在这里插入图片描述

  • 查看 tomcat03 里面的/etc/hosts 发现又 tomcat02 的配置
    在这里插入图片描述

  • --link 本质就是在hosts 配置中添加映射

  • 现在使用 Docker 已经不建议使用--link

  • 自定义网络,不适用docker0

  • docker0 问题:不支持容器名连接访问

3. 自定义网络


  • 查看所有的 docker 网络
    在这里插入图片描述

3.1 网络模式


  • bridge:桥接 docker (默认,自己创建也是用 bridge 模式)
  • none:不配置网络,一般不用
  • host:和宿主机共享网络
  • container:容器网络联通(用的少!局限很大)

3.2 测试


  • 先清空所有的环境

    docker rm -f $(docker ps -aq)
    
  • 这时就恢复成只有五个网卡的状态

    在这里插入图片描述

3.3 自定义网络


# 我们直接启动的命令 --net bridge, 而这个就是我们的docker0
# bridge 就是docker0
$ docker run -d -P --name tomcat01 tomcat
等价于 => docker run -d -P --name tomcat01 --net bridge tomcat
# docker0,特点:默认,域名不能访问。--link可以打通连接,但是很麻烦!
# 我们可以 自定义一个网络
$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

在这里插入图片描述

$ docker network inspect mynet;

在这里插入图片描述

  • 启动两个 tomcat ,再次查看网络情况
docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat

docker network inspect mynet

在这里插入图片描述

  • 可以看到现在的两个容器,网卡是我们自定义的 ip 地址
    在这里插入图片描述

  • 在自定义的网络下,服务可以互相 ping 通,仅仅使用名字,无需 --link
    在这里插入图片描述

  • 我们自定的网络 docker 帮我们维护好了对应的关系,推荐我们平时这样使用网络!

好处

  • redis 不同的集群使用不同的网络,保证集群是安全和健康的
  • mysql 不同的集群使用不同的网络,保证集群是安全和健康的

4. 网络连通


  • docker0 和 mynet(自定义网络) 是无法直接连接的,并且也不能直接打通。若需要连通的话,要 connect 连接 docker0 的容器和 mynet 的网络

  • 但是在实际的工作中,比如我们部署了mysql 使用了一个网段。部署了tomcat 使用了另一个网段,两个网段之间肯定是不能互相连通的,但是tomcat和mysql又需要相互连通,我们就要使用网络连通。原理图如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 连通之后,发现 docker0 下的容器 tomcat1,直接被连到了 mynet 的网络下

  • 这就是一个容器两个 ip 地址!

  • 好比阿里云服务器,有一个公网 ip 和一个私网 ip

    docker run -d -P --name tomcat-net-01 tomcat
    docker run -d -P --name tomcat-net-02 tomcat
    docker network connect mynet tomcat1
    docker network inspect mynet
    

    在这里插入图片描述

  • docker0 下的 tomcat-net-01 连通加入后,此时,它已经可以和 mynet 下的 tomat01 ping 通了

  • 而 docker0 下的 tomcat-net-02 仍然是不通的

结论:假设要跨网络操作别人,就需要使用 docker net work connect 连通!

5. 实战:部署Redis集群


# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个redis配置
for port in $(seq 1 6);\
do \ 
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

在这里插入图片描述

# 通过脚本运行六个redis
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
done
# 进入其中一个容器
docker exec -it redis-1 /bin/sh
# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
  • docker 搭建 redis 集群完成!

  • 在另一个会话中停止 redis-3 ,再次去查找数据。可以发现集群里面的主机宕机后,投票选举除了一个新的主机。
    在这里插入图片描述

  • 我们使用docker 之后,所有的技术都会慢慢变得简单起来!

6. 总结


  • veth pair是成对出现的一种虚拟网络设备接口,一端连着网络协议栈,一端彼此相连。

  • docker中默认使用docker0网络

  • docker0相当于一个路由器的作用,任何一个容器启动默认都是docker0网络。

  • docker0是容器和虚拟机之间通信的桥梁。

  • 推荐使用自定义网络,更好实现使用服务名的连通方式,避免ip改变的尴尬。

  • 网络之间不能直接连通,网络连通是将一个容器和一个网络之间的连通,实现跨网络操作。

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

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

相关文章

51.现有移动端开源框架及其特点—PocketFlow-1

51.1 简介 全球首个自动模型压缩框架一款面向移动端AI开发者的自动模型压缩框架,集成了当前主流的模型压缩与训练算法,结合自研超参数优化组件实现了全程自动化托管式的模型压缩与加速。 开发者无需了解具体算法细节,即可快速地将AI技术部署到移动端产品上,实现了自动托管式…

Java项目打包exe运行文件

Java项目打包exe运行文件 JavaSE打包成exe运行文件的方法有很多种&#xff0c;此处我们主要讲解我常用的一种exe4j&#xff0c;打包前我们需要先安装exe4j这个工具。 注意&#xff1a;exe4j仅支持最低JDK1.8最高JDK11&#xff0c;所以在安装之前一定要查看自己的JDK版本&#…

银行数字化转型导师坚鹏:数字化时代普惠金融模式和产品创新

数字化时代普惠金融模式和产品创新 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚普惠金融的机遇与挑战&#xff1f; 不知道普惠金融模式和产品如何创新&#xff1f; 不知道普惠金融产品创新的成功案例&#xff1f; 课程特色&#xff1a; 用实战案例…

使用Docker安装Zookpeer集群

1&#xff09;需要提前安装python和docker-compose 注&#xff1a;sudo权限看自己机器的权限 安装python-pip&#xff1a;sudo yum -y install epel-releasesudo yum -y install python-pip安装docker-compose&#xff1a;sudo pip install docker-compose 注意在安装过程中很…

FileZilla密钥登录

使用密码登录非常的方便&#xff0c;但是有的客户的云服务器上是限定只能通过密钥登录。我一般使用命令行的scp命令就可以正常上传&#xff0c;但是对于我一些同事来说&#xff0c;就很不方便。 生成密钥 这个不难&#xff0c;可以参考我之前的文章。 《Mac使用ssh连接远程服…

实验07:子集和问题

1.实验目的&#xff1a; 深刻理解回溯法的基本思想&#xff0c;掌握回溯法解决问题的一般步骤&#xff0c;学会使用回溯法解决实际问题.运用所熟悉的编程工具&#xff0c;借助回溯法的思想求解子集和数的问题。 2.实验内容&#xff1a; 给定 n n n 个正整数 { x 1 , x 2 ,…

springboot 接口防刷(根据IP与路径限制)

接口防刷 一、全局接口防刷&#xff08;通过拦截器方式&#xff09;1、原理 代码示例 二、个别接口防刷&#xff08;接口注解方式)1、代码示例 一、全局接口防刷&#xff08;通过拦截器方式&#xff09; 1、原理 代码示例 通过ip地址uri拼接用以作为访问者访问接口区分通过…

NX状态检测

输入 sudo -H pip install jetson-stats 如果提示没有pip&#xff0c;那么就输入 sudo apt-get install python-pip 之后输入 sudo jtop进行监测 用这个方法可以看到当前Jetpack的版本

记录 Vite 报错 process is not defined 报错问题

由于导入别人开发好的插件&#xff0c;在开发的时候报了process is not defined的错误&#xff0c;记录一下解决方式&#xff0c;方便后续使用。 1.查看里面具体的报错信息是找不到process这个问题。 原因&#xff1a; process.env 已经被遗弃&#xff08;我个人查询百度&…

lwip - 链路层收发以太网数据帧

1、以太网帧结构 数据包在以太网物理介质上传播之前必须封装头部和尾部信息。封装后的数据包称为数据帧&#xff0c;数据帧的封装的信息决定了数据如何传输。   以太网中传输的帧有两种格式&#xff0c;IEEE 802.3 和 Ethernet II&#xff0c;选择哪种格式由TCP/IP协议簇中的…

光伏太阳能直流浪涌保护器应用方案

由于用于光伏装置的直流电涌保护设备必须设计为完全暴露在阳光下&#xff0c;因此它们极易受到雷电的影响。光伏阵列的容量与其暴露的表面积直接相关&#xff0c;因此闪电事件的潜在影响随着系统规模的增加而增加。在照明频繁发生的情况下&#xff0c;未受保护的光伏系统可能会…

pytorch中BatchNorm2d的实验验证

BatchNorm2d 对二维矩阵进行批量归一化&#xff0c;mean为当前batch的均值&#xff0c;std为当前batch的标准差&#xff0c;使用批量归一化能够将取值范围不同的数据映射到标准正态分布的区间中&#xff0c;减少数据之间的差距&#xff0c;方便模型快速收敛。批量归一化本质上…

Vivado增量编译:加速FPGA设计实现的利器

随着FPGA设计的复杂度不断提高&#xff0c;设计人员需要选择更为高效的设计流程来保证开发效率和减少开发成本。其中&#xff0c;Vivado增量编译是一种非常重要的设计流程。本文将介绍Vivado增量编译的基本概念、优点、使用方法以及注意事项。 通过阅读本文可以了解&#xff1…

大多数开发人员都不知道的JSON.stringify 秘密

作为前端开发工程师&#xff0c;你一定用过JSON.stringify&#xff0c;但你知道它的全部秘密吗&#xff1f; 基本上&#xff0c;JSON.stringify 将对象转换为 JSON 字符串。同时&#xff0c;JSON.stringify 有如下规则&#xff1a; JSON.stringify({name: Tom, age: 18}) {&q…

银行数字化转型导师坚鹏:数字人民币创新及金融场景应用

数字人民币创新及金融场景应用 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚数字人民币的发展历程&#xff1f; 不清楚数字人民币对我们有什么影响&#xff1f; 不知道数字人民币具体应用场景&#xff1f; 课程特色&#xff1a; 前沿性&#xff1a…

【c语言】带你快速理解函数的传值和传址

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

大数据 | 实验一:大数据系统基本实验 | 熟悉常用的HBase操作

文章目录 &#x1f4da;HBase安装&#x1f407;安装HBase&#x1f407;伪分布式模式配置&#x1f407;测试运行HBase&#x1f407;HBase java API编程环境配置 &#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f407;HBase Shell 编程命令实现以下指定…

【天梯赛补题】

175对我这种蒟蒻好难&#xff0c;&#xff0c;&#xff0c; L1-6剪切粘贴 题目详情 - L1-094 剪切粘贴 (pintia.cn) 天梯赛&#xff1a;L1-094 剪切粘贴_scarecrow133的博客-CSDN博客 本蒟蒻看到字符串就害怕&#xff0c;一看就没思路&#xff0c;果断跳过了…… 等佬佬讲…

表的查询内容

表的查询 这里是关键的select的使用对表不同的条件进行筛选&#xff0c;实现对于内容的书写 全列查询 使用*进行查询&#xff0c;表现的是整个表的内容。 指定列查询 name的id列信息查询 查询字段为表达式 这里的id加上10&#xff0c;形成了新的列表 这里的id1 id的结果聚合在…

echarts 象形柱图

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、象形柱图二、环形图…