docker容器网络

news2025/7/29 13:17:06

第七章容器网络

Docker网络    

veth pair:成对出现的一种虚拟网络设备,数据从一端进,从另一端出。用于解决网络命名空间之间隔离。

docker0:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同端口连接起来,并实现类似交换机那样的多对多的通信。

理解Docker0 

做这一步先把所有镜像和容器删干净

删除全部 镜像docker rmi $(docker images  -aq

删除全部容器 docker rm -f $(docker ps -aq

三个网络

查看容器的内部地址 ip addr

[root@localhost /]# docker exec -it tomcat01 ip addr

遇到问题,查看容器的内部地址出错

[root@localhost /]# docker exec -it tomcat01 ip addr

OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown

解决问题:

1、进入容器输入安装依赖

root@c9478f4e83dd:/usr/local/tomcat# apt update

root@c9478f4e83dd:/usr/local/tomcat# apt install -y iproute2

2、再次测试成功

[root@localhost /]# docker exec -it tomcat01 ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

       valid_lft forever preferred_lft forever

结果:Linux可以ping通docker容器内部

原理

原理一

1.我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!再次测试ip addr

原理二

2、#我们发现这个容器带来的网卡,都是一对对的

#evth-pair 就是一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连

#正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备的

#OpenStac,Docker容器之间的连接,OVS的连接,都是使用 evth-pair 技术

原理三

3.我们来测试下tomcat01和tomcat 02是否可以ping通!

[root@localhost /]# docker exec -it tomcat02 ping 172.18.0.2

#结论:容器和容器之间是可以互相通信的!

绘制一个网络模型图:

结论

1、tomcat1和tomcat02是公用的一个路由器,docker0.

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

3、Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件!)

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

使用--link连接

思考一个场景,我们编写了一个微服务,database url=ip;,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以用名字来访问容器?

测试使用 ping容器名出错

[root@localhost /]# docker exec -it tomcat03 ping tomcat02

OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown

解决报错问题

1、进入容器内

docker exec -it 容器自定义名称 /bin/bash

2、运行下面命令

apt-get update

3、出现 bash: ping: command not found 报错,运行下方命令

apt install iputils-ping     

再次测试使用 ping容器名

[root@localhost /]# docker exec -it tomcat03 ping tomcat02

PING tomcat02 (172.17.0.3) 56(84) bytes of data.

64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.201 ms

64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.114 ms

--- tomcat02 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3001ms

rtt min/avg/max/mdev = 0.114/0.149/0.201/0.031 ms

[root@localhost /]#

#问题解决

其实这个tomcat03就是在本地配置了tomcat02的配置?

#查看hosts配置,在这里发现!

[root@localhost /]# docker exec -it tomcat03 cat /etc/hosts

127.0.0.1       localhost

::1     localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.3      tomcat02 18f0c7055840

172.17.0.4      d705889c167d

本质

--link就是我们在hosts配置中增加了一个172.18.0.3 tomcat02 +容器ID

我们现在玩docker已经不建议使用--link了!

自定义网络

查看当前docker网络连接模式

网络模式

bridge : 桥接 docker(默认,自己创建也是用bridge模式)

none :不配置网络

host:    和宿主机共享网络

container:容器网络联通!(用的少!局限很大)

测试

#我们直接启动的命令  --net bridge,而这个就是我们的docker0

docker run -d -p --name tomcat01 tomcat

docker run -d -p --name tomcat01 --net bridge tomcat

#docker0特点,默认,域名不能访问,--link可以打通连接!

自定义一个网络

#--driver bridge

#--subnet 192.168.0.0/16

#--gateway 192.168.0.1

[root@localhost /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

bf5e591acb3d1e8fb29a7ecf9c9a60000787a8f8767697d7956999a0e1bbab5b

[root@localhost /]# docker network ls

NETWORK ID     NAME      DRIVER    SCOPE

4c8bbb6d0752   bridge    bridge    local

d4f2dcf734de   host      host      local

查看自定义网络配置

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

好处:

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

mysql    不同的集群使用不同的网络,保证集群是安全的

网络连通

测试打通 tomcat01 -mynet

[root@localhost ~]# docker network connect mynet tomcat01

#连通之后就是将tomcat01 放到了mynet 网络下

#一个容器两个ip地址

#阿里云服务:公网ip    私有ip

测试tomcat01可以ping通tomcat-net-01

[root@localhost ~]# docker exec -it tomcat01 ping tomcat-net-01

PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.

64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.264 ms

64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.113 ms

64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.135 ms

tomcat02依旧打不通

[root@localhost ~]# docker exec -it tomcat02 ping tomcat-net-01

ping: tomcat-net-01: Name or service not known

[root@localhost ~]#

结论

假设要跨网络操作别人,就需要使用docker network connect 连通!

实战:部署redis集群

创建网卡

[root@localhost ~]# docker network create redis --subnet 172.38.0.0/16

caa9a92b149bf64877b76c6e86d030fa6d902997ab2f8d0ba8789381a55c4438

[root@localhost ~]#

通过脚本创建六个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

启动六个容器

-- 容器1

docker run -p 6371:6379 -p 16371:16379 --name redis-1 \

-v /mydata/redis/node-1/data:/data \

-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \

-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server \

/etc/redis/redis.conf

-- 容器2

docker run -p 6372:6379 -p 16372:16379 --name redis-2 \

-v /mydata/redis/node-2/data:/data \

-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \

-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server \

/etc/redis/redis.conf

-- 容器3

docker run -p 6373:6379 -p 16373:16379 --name redis-3 \

-v /mydata/redis/node-3/data:/data \

-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \

-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server \

/etc/redis/redis.conf

-- 容器4

docker run -p 6374:6379 -p 16374:16379 --name redis-4 \

-v /mydata/redis/node-4/data:/data \

-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \

-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server \

/etc/redis/redis.conf

-- 容器5

docker run -p 6375:6379 -p 16375:16379 --name redis-5 \

-v /mydata/redis/node-5/data:/data \

-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \

-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server \

/etc/redis/redis.conf

-- 容器6

docker run -p 6376:6379 -p 16376:16379 --name redis-6 \

-v /mydata/redis/node-6/data:/data \

-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \

-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server \

/etc/redis/redis.conf

创建集群

redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.14:6379 172.38.15:6379 172.38.16:6379 --cluster-replicas 1

docker 搭建redis集群完成!

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

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

相关文章

Git常见命令与使用,从0到1学会使用Git

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 常见软件安装与运用 ❤️ 支持我&#xff1a;&#x1f44d;点赞…

linux NPS 服务端安装 +linux 客户端安装

本文参考博客&#xff1a; https://blog.csdn.net/m0_57776598/article/details/123674866 一、下载安装包 1、官方下载 官方下载地址&#xff1a;https://github.com/ehang-io/nps/releases 注意不要下错了&#xff0c;当前我下的版本为 v0.26.10 2、网盘下载 网盘下载&…

Python编程 字典的常用操作

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.字典 1.访问字典(掌握) 2.字典的增加与修改(掌握) 3.系列删除(掌握) …

Web3中文|元宇宙在商业中的最佳应用

来源 | techrepublic 编译 | DaliiNFTnews.com 麻省理工学院斯隆管理学院的信息技术高级讲师Paul McDonagh-Smith说&#xff0c;麻省理工学院的人工智能先驱Marvin Minsky创造了“手提箱式词语”一词——即一些词或术语本身没有任何意义&#xff0c;而需要人去挖掘、赋予和丰…

计算机英文论文写作需要注意哪些细节? - 易智编译EaseEditing

1&#xff09;尽量用动词少用名词化 那些大篇名词的文章真的很难读懂&#xff0c;而有强大动词的句子更容易理解。 我们注意到客户在论文中经常使用的名词有“agreement”, “disagreement”, “investigation”, “analysis”, “examination”, “comparison”, “increase…

【MySQL技术专题】「索引技术」体验前所未有的技术探险,看穿索引的本质和技术体系(1)

文章目录前提概要数据库类型内容架构索引和磁盘的关系数据读取时主要时间开销总结分析瓶颈点优化的方式数据量计算传统暴力&#xff08;顺序型读写&#xff09;X索引机制&#xff08;半随机性读写&#xff09;√索引升级之多级索引化&#xff08;全随机性读写&#xff09;使用索…

读书笔记《Spring Boot+Vue全栈开发实战》(下)

本书将带你全面了解Spring Boot基础与实践&#xff0c;带领读者一步步进入 Spring Boot 的世界。前言第九章 Spring Boot缓存第十章 Spring Boot安全管理第十一章 Spring Boot整合WebSocket第十二章 消息服务第十三章 企业开发第十四章 应用监控第十五章 项目构建与部署第十六章…

【python与数据分析】Pandas统计分析基础

目录 前言 一、pandas常用数据类型 综述 1.一维数组&#xff08;Series&#xff09;与常用操作 &#xff08;1&#xff09; 通过列表创建Series &#xff08;2&#xff09;创建Series时指定索引 &#xff08;3&#xff09;Series位置和标签的使用 &#xff08;4&#x…

m基于中继协助的认知无线电频谱切换机制的matlab仿真分析

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 认知无线电网络在进行频谱切换的时候&#xff0c;最为重要的问题是如何以最少的频谱切换次数实现频谱切换&#xff0c;同时保证较好的服务质量&#xff0c;这里&#xff0c;服务质量不仅…

植入“人工心脏”助患者重获“心”生

【同期】人工心脏移植患者 刘女士这要是在过去的时候也就放弃了&#xff0c;我再活20年&#xff0c;我还能看着我大孙子成家&#xff0c;这就是我最大的希望。【解说】11月22日&#xff0c;人工心脏移植患者和心脏移植患者在即将康复出院前&#xff0c;互相握手庆贺。据了解&am…

【UDS】ISO14229之0x3E服务

文章目录前言一、理论描述二、使用步骤1.请求2.响应总结->返回总目录<- 前言 简称&#xff1a; “TesterPresent”&#xff0c;测试工具保持连接服务 功能&#xff1a; 此服务用于告知电控单元测试工具仍在线。该服务需周期性发送&#xff0c;用于重置 S3server 计时器…

SQL语句练习

1. 创建学生表 S(命名格式“姓名拼音_三位学号_s”&#xff0c;如 LBJ_023_s)并插入数据 2. 创建课程表 C(命名格式“姓名拼音_三位学号_c”&#xff0c;如 LBJ_023_c) 并插入数据 3. 创建选课表 SC(命名格式“姓名拼音_三位学号_sc”&#xff0c;如 LBJ_023_sc) 并插入数据 …

寻找链表相交结点问题

寻找链表相交结点问题 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;寻找链表相交结点问题 CSDN&#xff1a;寻找链表相交结点问题 题目描述 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表…

Vue3路由守卫、vuex的使用、vuex模块化拆分、vite中自动导入模块文件

文章目录1. 路由守卫2. vuex的使用2.1 基本使用2.2 模块化拆分方式一方式二方式三3. 在vite中自动导入模块文件1. 路由守卫 vue3 中的导航守卫与 vue2 中的基本一致&#xff0c;不同的地方在于&#xff0c;vue3 中导航守卫取消了 next 参数&#xff0c;而是通过返回 false 来取…

【Silvaco example】GaN diode, Reverse-bias leakage current vs temperature

1、例子讲解 该示例演示了&#xff0c;GaN肖特基二极管中&#xff0c;因声子辅助隧穿&#xff08; phonon-assisted tunneling &#xff09;的反向偏置漏电流的温度依赖性建模。 例子参考以下论文&#xff1a; Pipinys P., and V. Lapeika, "Temperature dependence of …

Android入门第36天-以一个小动画说一下Android里的Handler的使用

简介 我们在前面的Android教程中已经提到过这么一件事&#xff1a;Android在启动后会有一个主线程。它不允许任何子线程去改变主UI线程里的内容。 这么做是为了妨止&#xff0c;万一有一个带有大事务的线程导致了渲染组件时间过长最终导致Android UI出现“闪退”、“崩溃”的…

突遇暴雨,怎样远程连接服务器

“我被封印在家里了&#xff0c;去不了单位&#xff0c;电脑关机了&#xff0c;用来远程开机远控&#xff0c;没想到遇到了大风暴雨&#xff0c;结果非常尴尬&#xff01;”最近收到好几个这样的粉丝留言。突遇暴雨&#xff0c;虽然准备了远程办公工具&#xff0c;但还没来得及…

引擎入门 | Unity UI简介–第1部分(10)

本期我们继续为大家进行Unity UI简介&#xff08;第一部分&#xff09;的后续教程 本篇内容 23.创建UI Manager 24.点击按钮时调用StartGame 文章末尾可免费获取教程源代码 本篇Unity UI简介&#xff08;第一部分&#xff09;篇幅较长&#xff0c;分为十篇&#xff0c;本篇…

vs调试技巧(详细)

调试技巧一.简介1.调试是什么2.调试的基本动作3.Debug和Rlease的介绍二.调试介绍1.调试环境准备2.快捷键的使用三.调试时看当前信息1.查看临时变量的值2.查看内存四.多多动手调试一.简介 1.调试是什么 调试本身是一个动作&#xff0c;是用来除去错误的动作 2.调试的基本动作 …

【前端】JavaScript-PC端网页特效

目录 一、元素偏移量offset系列 1.1offset概述 1.2offset与style区别 二、元素可视区client系列 立即执行函数 三、元素滚动scroll系列 三大系列总结 mouseenter和mouseover的区别 一、元素偏移量offset系列 1.1offset概述 offset系列相关属性可以动态的得到该元素的位置…