java
2023-06-28 12:09:05 0 举报
AI智能生成
持续更新
作者其他创作
大纲/内容
Tomcat
ArrayList
初始大小为16,扩容:加载因子为0.75 数组+链表+红黑树 当产生hash碰撞的时候链表长度增加,当链表长度达到8时,转换成红黑树 当碰撞小于等于6时转换成链表
HashMap
常用类
IO
多线程
Java基础
单例模式
工厂模式
原型模式
建造者模式
创建型模式
代理类以及被代理类实现同一个接口
静态代理
动态代理
代理模式
结构型模式
对象之间是多对一依赖的设计方案
观察者模式
行为型模式
设计模式的类型
Java设计模式
JVM通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成
JVM的启动
JVM的执行
生命周期
Loading
验证 verify
准备 prepare
解析 resolve
Linking
initialization
类加载过程
双亲委派机制
类加载
图
程序计数器PC寄存器 (Program Counter Register)
设置其大小:-Xss + 具体的大小
虚拟机找
运行时数据区
jvm
是什么
解耦
削峰
异步
能做什么
官网 https://activemq.apache.org/
下载
基本入门概述
./activemq start
./activemq start > /home/activemq/run_activemq.log
带日志的启动
启动
./activemq stop
结束
ps -et|grep activemq|grep -v grep
netstat -anp|grep 61616
lsof -i:61616
查看是否启动 三种
基本操作
实现JMS接口和规范的消息中间件,也就是MQ服务器
JMS provider
JMS producer
JMS consumer
属性:JMSDestination:消息目的地JMSDeliveryMode:消息持久化模式JMSExpiration:消息过期时间JMSPriority:消息的优先级JMSMessageID:消息的唯一标识符
消息头
span lang=\"EN-US\" style=\"font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:Consolas;mso-fareast-font-family:宋体;mso-bidi-font-family:Consolas;mso-font-kerning:1.0pt;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA\"
消息体
消息属性
JMS message
JMS特点
Java- JMS操作步骤
什么是javaee
LevelDB
KahaDB
JDBC
持久化
ActiveMQ
消息生产者(Producer)
存储消息 (Broker)
消息消费者(Consumer)
1 消息模型(Message Model)
nohup java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar &
1、使用nohup & 后台运行
2 消息生产者(Producer)
基本概念
cd /lib/systemd/systemvim rocketmq-dashboard.service
systemctl start rocketmq-dashboard.service
#启动项目
systemctl stop rocketmq-dashboard.service
#停止项目
systemctl restart rocketmq-dashboard.service
#重启项目
systemctl status rocketmq-dashboard.service
#查看项目状态
systemctl enable rocketmq-dashboard.service
设置项目自启动
2、服务化systemctl 配置自启动
dashboard
https://bright-boy.gitee.io/technical-notes
其他人的总结
https://bright-boy.gitee.io/technical-notes/#/rocketmq/index
broker.propertites 配置说明
RocketMQ
MQ
基于观察者模式的 文件存储+通知
1)一个领导者(Leader),多个跟随者(Follower)2)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。4)更新请求顺序进行,来自同一个Client的更新请求按其发送顺序一次执行。5)数据更新原子性,一次数据更新要么成功,要么失败。6)实时性,在一定时间范围内,Client能读到最新数据。
特点
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。
统一命名服务
1)一般要求一个集群,所有节点的配置信息是一致的2)对配置文件修改后,希望能够快速的同步到各个节点上
1)分布式环境下配置文件同步
1)可将配置文件写入Zookeeper上的一个Znode。
2)各个客户端服务器监听这个Znode。
3)一旦Znode中的数据被修改,Zookeeper将通知各个客户端服务器
2)配置管理可交给Zookeeper实现
统一配置管理
1)分布式环境中,实时掌握每个节点的状态
统一集群管理
服务器节点动态上下线
软负载均衡
应用场景
zookeeper
其他
聚簇索引
二级索引
B+树
InnoDB
索引优化
索引
事物的隔离级别
事物
MySql
String
List
Set
Hash
Zset
基本数据类型
RDB
AOF
从机第一次连上主机命令: SLAVEOF 127.0.0.1 6379
查看当前机器信息:info replication
一主两从
去中心化,即不止一个主机
主从复制
Redis
数据库
1、京东:Spring的循环依赖问题如何解决?
2、拼多多:Spring插件式扩展点开发如何做?
3、腾讯:DDD项目架构应该如何落地?
4、阿里:Nacos如何支撑阿里巴巴内部上百万服务实例的访问?
5、阿里:Nacos高并发异步注册架构知道如何设计的吗?
6、阿里:Sentinel高可用架构底层熔断降级如何实现的?
7、阿里:Sentinel底层滑动时间窗限流算法怎么实现的?
8、腾讯:如何用Redis高效实现12306的复杂售票业务?
9、微博:新浪微博突发事件如何做好Redis缓存的高可用?
10、微博:高并发场景缓存穿透&失效&雪崩如何解决?
11、京东:Redis缓存与数据库双写不一致如何解决?
12、京东:Redis底层ZSet跳表是如何设计与实现的?
13、腾讯:JVM的GC执行时机是任何时候都可以吗?安全点知道吗?
14、美团:CMS垃圾收集器的并发更新失败是怎么回事?如何优化?
15、阿里:高并发系统为何建议选择G1垃圾收集器?
16、拼多多:线上系统GC问题如何快速定位与分析?
17、阿里:阿里巴巴Arthas实现原理能大概说下吗?
18、百度:单机几十万并发的系统JVM如何优化?
19、阿里:解释下JVM垃圾收集底层的三色标记算法?
20、美团:Volatile底层的内存屏障是如何实现的?
21、springBean的生命周期
面试题
1、根据构造方法创建Bean实例2、设置属性值 调用set方法在初始化方法前执行的方法(后置处理器)3、调用初始化方法在初始化方法后执行的方法(后置处理器)4、获得Bean实例5、调用销毁方法
Bean的生命周期
1、在spring里 设置创建的Bean是多实例还是单实例对象
2、Bean默认是单实例的对象
1、在spring配置文件Bean 标签里有属性 (scope)用于设置单实例和多实例
3、设置Bean是多实例还是单实例
Bean的作用域
在需要使用对象的时候才去创建对象
是获取Bean对象的工厂
在配置文件加载时就创建对象
ApplicationContext 是其子接口
BeanFactory
可以返回不同类型的Bean
FactoryBean
普通bean:在配置文件中定义Bean类型就是返回类型
工厂Bean:在配置文件中定义Bean类型可以和返回类型不一致
spring有两种类型的Bean
Bean
通过实现 接口 在新的实现类中做功能的增强创建接口实现类的代理对象(新的实现类),增强类的方法
在有接口的情况下 使用jdk动态代理
jdk动态代理
创建当前类的子类的代理对象,增强类的方法
没有接口的情况想使用 CGlib动态代理
CGlib动态代理
类里面 可以被增强的 方法 就叫连接点
连接点
作用:知道对哪个类里面的哪个方法进行增强
execution([权限修饰符][返回类型][类全路径][方法名]([参数列表]))
语法结构
切入点表达式
实际被真正增强的方法,称为切入点
切入点
实际增强的 业务逻辑部分 称为通知(增强)
@Before
前置通知
出现异常不会执行
@AfterReturning
后置通知(返回通知)
环绕前通知 在 @Before 之前执行
环绕后通知 在 被增强的方法执行后 @After 之前执行
@Around
环绕通知
@AfterThrowing
异常通知
有无异常都会执行
@After
最终通知
通知有多种类型
通知(增强)
是一个动作
把通知应用到切入点的过程
切面
术语
AOP
原子性
一致性
隔离性
持久性
特性 ACID
编程式事务管理
底层使用AOP
基于注解方式
基于xml配置文件方式
声明式事务管理
事务管理操作方式
PlatformTranscationManager (接口)
事务管理API
如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
REQUIRED
当前的方法必须启动新的事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起
REQUIRED_NEW
如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中
SUPPORTS
当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
NOT_SUPPORTED
当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常
MANDATORY
当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常
NEVER
如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行
NESTED
事务的传播行为 propagation
脏读
不可重复读
幻读
在不考虑隔离性产生的问题
事务的隔离级别
声明式事务
事务操作
事务
Log4j2
日志框架
WebFlux
Spring5
Ahead-Of-Time,预先编译
AOT编译
Spring6
Spring
SpringMVC
从容的重启
重启
yum install nginx
安装
基本命令
一个master进程多个worker进程
内部结构
反向代理
负载均衡
动静分离
基本HTTP服务
高级HTTP服务
邮件服务
功能特性
yum install -y tree
tree [目录]
安装tree 观察目录更清晰
实用工具
Nginx
service firewalld status
service iptables status
systemctl status firewalld
查看状态
service firewalld stop
service iptables stop
systemctl stop firewalld
停止防火墙
service firewalld start
service iptables start
systemctl start firewalld
开启防火墙
service firewalld restart
service iptables restart
systemctl restart firewalld
重启防火墙
chkconfig iptables off
systemctl disable firewalld
永久关闭防火墙
firewall-cmd --query-port=8080/tcp
# 查询端口是否开放
firewall-cmd --permanent --add-port=80/tcp
# 开放80端口
firewall-cmd --permanent --remove-port=8080/tcp
# 移除端口
firewall-cmd --reload
#重启防火墙(修改配置后要重启防火墙)
防火墙
uname -a
查看版本
hostnamectl set-hostname [主机名称]
设置主机名称
update-alternatives --config java
切换jdk版本
常用命令
启动 .sh文件 报错 坏的解释器sed -i 's/\$//' [ 要执行的sh文件 ]
vim /etc/sysconfig/network-scripts/ifcfg-enp0s
配置静态ip
虚拟机网络
常见问题
Linux
查询公网IPcurl cip.cc
公网IP
IP
http工作原理
网络相关
docker rm 容器名
docker rmi 镜像名
镜像删除
docker run -d -p 3306:3306 -v /home/mysql:/sql --privileged=true mysql
创建命令
export 导出容器的内容留作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
docker export 40ef0ee01654 > halotest.tar
docker export 容器ID > 文件名.tar
cat halotest.tar | docker import - wyx/halo:1.0
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
案例
导入导出容器
apt-get update
apt-get install net-tools
容器内安装
docekr commit -m=\"提交的描述信息\" -a=\"作者\" 容器ID 要创建的目标镜像名:[标签名]
创建本地新镜像
镜像仓库
发布到阿里云
发布到docker hub
docker pull registry
一 下载私服镜像
docker run -d -p 5000:5000 -v /home/registry/:/tmp/registry --privileged=true registry
二 运行私有库 registry
三 创建本地新镜像
curl -XGET http://192.168.56.10:5000/v2/_catalog
四 查看本地私有库是否有镜像
docker tag [本地新镜像名]:[version] 192.168.56.10:5000/[镜像名]:[version]
将本地新镜像修改成符合私服规范的tag
vim /etc/docker/daemon.json
\"insecure-registries\": [\"192.168.56.10:500\"]
修改配置文件使之支持http
docker push 192.168.56.10:5000/[镜像名]:[version]
推送
五 将本地新镜像推送到私服
curl -XGET http://192.168.56.10:5000/v2/_catalog
六 再次验证私服是否有镜像
docker pull 192.168.56.10:5000/[镜像名]:[version]
七 验证是否能用
构建私服
commit
docker run -v /home/mysql:/sql --privileged=true mysql
找到 Mounts
docker inspect [容器ID]
查看挂载目录
直接挂载
直接挂载是 rw 权限
docker run -v /home/mysql:/sql:ro --privileged=true mysql
权限配置
先完成第一个容器的映射
docker run -it --privileged=true --volumes-from [父类] --name [容器名] [镜像名]
卷的继承于共享
容器卷
搜索镜像
拉取镜像
查看镜像
服务端口映射
启动镜像
停止镜像
移除镜像
总体步骤
SHOW VARIABLES LIKE 'character%';
插入数据时会出现中文乱码
坑
docker run -d -p 3306:3306 --privileged=true -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWARD=123456 --name mysql mysql:5.7
注意容器数据卷
在 /home/mysql/conf 目录下新建my.cnf
修改 my.cnf
实际工作
安装mysql
1、在挂载目录下创建redis.conf
requirepass 123
1、开启redis密码验证
注释掉 #bind 127.0.0.1
2、允许外地连接
daemonize no
3、yes 改为 no 解决docker 启动时 -d 命令的冲突问题
appendonly yes
4、数据持久化
2、修改文件中的配置
运行容器之前
安装redis
安装常见的容器
基础篇
主从复制原理
docker run -p 3307:3306 --name mysql-master \\-v /home/mydata/mysql-master/log:/var/log/mysql \\-v /home/mydata/mysql-master/data:/var/lib/mysql \\-v /home/mydata/mysql-master/conf:/etc/mysql \\-e MYSQL_ROOT_PASSWORD=root \\-d mysql:5.7
1.搭建主数据库
vim my.cnf
2.进入 /home/mydata/mysql-master/conf 目录下新建 my.cnf
docker restart mysql-master
3.重启master实例
4.进入master容器
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
配置可以连接master的用户
授权
5.master容器实例内创建数据同步用户
docker run -p 3308:3306 --name mysql-slave \\-v /home/mydata/mysql-slave/log:/var/log/mysql \\-v /home/mydata/mysql-slave/data:/var/lib/mysql \\-v /home/mydata/mysql-slave/conf:/etc/mysql \\-e MYSQL_ROOT_PASSWORD=root \\-d mysql:5.7
6.新建从服务器实例3308
7.进入 /home/mydata/mysql-slave/conf 目录下新建 my.cnf
docker restart mysql-slave
8.重启slave
show master status;
9.在主数据库中查看主从同步状态
docker exec -it mysql-slave /bin/bash
msyql -uroot -proot
10.进入mysql-slave 容器
参数说明
11.在从数据库中配置主从复制
show slave status \\G;
12.在从数据库中查看主从同步状态
start slave
13.在从数据库中开启主从同步
show slave status \\G;
14.查看从数据库状态是否已经同步
主机建库建表写入数据
从机查看数据
15.主从复制测试
主从搭建步骤
安装MySQL主从复制
1-2亿数据需要缓存,如何设计存储案例
分布式存储
答
简单直接
优点
容错不行扩容,故障停机 算法要改变
缺点
哈希取余分区
解决了 普通哈希取余 服务器宕机、扩容问题
0-2^32-1
算法构建一致性哈希环
服务器IP节点映射
Key落到服务器的落键规则
3大步骤
一致性哈希算法容错性
一致性哈希算法扩展性
节点少的时候,出现数据倾斜,导致其中某台服务数据量过大
一致性哈希算法的数据倾斜问题
小总结
一致性哈希算法分区
哈希槽实质是一个数组,数组 [ 0-2^14-1 ] 形成hash slot空间
解决一致性哈希算法的数据倾斜问题
在数据和节点之间加入一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系
槽解决的是粒度问题,把粒度变大,便于数据移动
哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。
解决均匀分配的问题
一个集群只能有16384个槽位,编号0-16383号
多少个hash槽
哈希槽计算
哈希槽分区
一般三种解决方案
3主3从redis集群扩缩容配置案例架构说明
systemctl start docker
关闭防火墙+启动docker后台服务
docker run -d --name redis-node-1 --net host --privileged=true -v /home/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enable yes --appendonly yes --port 6381docker run -d --name redis-node-2 --net host --privileged=true -v /home/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enable yes --appendonly yes --port 6382.....docker run -d --name redis-node-6 --net host --privileged=true -v /home/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enable yes --appendonly yes --port 6386
新建6个docker容器实例
docker exec -it redis-node-1 /bin/bash
进入容器
redis-cli --cluster create 192.168.56.10:6381 192.168.56.10:6382 192.168.56.10:6383 192.168.56.10:6384 192.168.56.10:6385 192.168.56.10:6386 --cluster-replicas 1
构建主从关系
进入容器 redis-node-1 并为6台机器构建集群关系
redis-cli -p 6381
链接进入6381 作为切入点,查看节点状态
cluster info
cluster nodes
链接进入6381 作为切入点,查看集群状态
3主3从redis集群配置
启动6台机器构成集群并通过exec进入容器
对6381新增key
redis-cli -p 6381 -c
防止路由失效加参数 -c 并新增两个key
redis-cli --cluster check 192.168.56.10:6381
查看集群信息
数据读写存储
docker stop redis-node-1
主6381和从机切换,先停止主机6381
docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
再次查看集群信息
node-1 变为slave
查看主从关系
启动redis-node-1
再次启动 node-4 node-4 变为slave
停掉node-4 (master)此时node-1 上位为master
还原
先还原之前的3主3从
查看集群状态
容错切换迁移
主从容错切换迁移案例
新增master之后,原集群的master 分别匀相等的哈希槽给新加入的master
新增服务时,哈希槽如何变化
docker run -d --name redis-node-7 --net host --privileged=true -v /home/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enable yes --appendonly yes --port 6387docker run -d --name redis-node-8 --net host --privileged=true -v /home/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enable yes --appendonly yes --port 6388
docker exec -it redis-node-7 /bin/bash
进入6387容器实例内部
redis-cli --cluster add-node 192.168.56.10:6387 192.168.56.10:6381
加入集群
将新增的6387节点(空槽号)作为master 节点加入原集群
检查集群情况第一次
redis-cli --cluster reshard IP地址:端口号
根据实际master台数 进行哈希槽位分配
redis-cli --cluster reshard 192.168.56.10:6381
重新分派槽号
优点,节省成本,全部重新分配节点成本太高了
新增的master节点的槽位是 原集群的各个master的槽位 平均匀给新master的
检查集群情况第二次
redis-cli --cluster add-node [slave节点ip:端口] [master节点ip:端口] --cluster-slave --cluster-master-id [master容器ID]
redis-cli --cluster add-node 192.168.56.10:6388 192.168.56.10:6387 --cluster-slave --cluster-master-id [master容器ID]
为主节点6387分配从节点6388
检查集群情况第三次
主从扩容案例
分配给单个master
平均分配给多个master
可以自定义分配
清除的master多出的哈希槽位如何分配
先删除slave
应当如何缩容,即先删除master,还是先删除slave
问
删除6387/6388节点
检查集群情况,获得6388节点ID
命令:redis-cli del-node ip:端口 从机6388节点ID
redis-cli del-node 192.168.56.10:6388 从机6388节点ID
删除6388从集群中删除6388
选择 哈希槽位数,先指定槽位接收节点,再指定槽位原节点
redis-cli --cluster reshard 192.168.56.10:6381
清空6387的哈希槽号,重新分配
命令:redis-cli del-node ip:端口 主机6387节点ID
redis-cli del-node 192.168.56.10:6388 主机6387节点ID
删除6387节点
主从缩容案例
redis集群配置
cluster模式-docker版哈希槽分区进行亿级数据存储
安装redis集群
1.Docker 复杂安装
DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本
https://docs.docker.com/engine/reference/builder/
官网
docker run 容器镜像
docker build 命令构建镜像
编写docker文件
步骤
1、每条保留字指令 必须为大写字母 且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、#表示注释
4、每条指令都会创建一个新的镜像层并对镜像镜像提交
DockerFile基础知识
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器作出修改
3、执行类似docker commit 的操作提交一个新的镜像层
4、docker再基于刚提交的镜像运行一个新容器
5、执行DockerFile中的下一条指令直到所有指令都执行完成
Docker执行DockerFile的大致流程
DockerFile构建过程解析
https://github.com/docker-library/tomcat
参考tomcat8的DockerFile入门
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM
FROM
镜像维护者的姓名,邮箱地址
MAINTAINER
容器构建时运行的命令
RUN yum -y install vim
shell格式
RUN [\"可执行文件\
exec格式
两种格式
RUN是在docker build 时运行
RUN
当前容器暴露的端口
EXPOSE
指定创建容器后,默认终端登陆进容器的 工作目录。就是进入容器的默认位置
WORKDIR
指定改镜像以什么样的用户去执行,不指定则为 root
USER
用来在构建镜像过程中设置环境变量
ENV
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
ADD
COPY src dest
COPY [\"src\
<src源路径>:源文件或者源目录
<dest目标路径>:容器内的指定路径,该路径不用事先建好
类似ADD,拷贝文件和目录到镜像中将从构建上下文目录中<源路径> 的文件/目录 复制到新的一层的镜像内的<目标路径>
COPY
容器数据卷,用于数据保存和持久化工作
VOLUME
CMD <命令>
CMD [\"可执行文件\
CMD [ \"参数1\
参数列表格式
指定容器启动后的要干的事情
DockerFile中可以有多个CMD指令,只有最后一个生效,CMD 会被docker run 之后的参数替换
官网最后
docker run -it -p 8080:8080 /bin/bash会替换 CMD catalina.sh 为 /bin/bash
演示
参考官网Tomcat的DockerFile演示讲解
注意
CMD 是在docker run时候运行
RUN 是在docker build 时运行
和RUN命令的区别
CMD
类似于CMD 但是 ENTRYPOINT 不会被docker run 后面的命令覆盖,而且这些命令行参数 会被当做参数送给ENTRYPOINT 指令指定的程序
命令格式说明
命令不会被覆盖
ENTRYPOINT
DockerFile常用保留字指令
Centos7镜像具备 vim + ifconfig+ jdk8
https://www.oracle.com/java/technologies/downloads/#java8
官网x86 Compressed Archive
mirrors.yangxingzhen.com/jdk/
mirror
JDK下载镜像地址
要求
编写DockerFile文件
编写
docker build -t 新镜像名字:TAG .
注意,TAG 后面有个空格 有个点
构建
docker run -it 新镜像名字:TAG
运行
再体会一下 UnionFS (联合文件系统)
自定义镜像mycentosjava8
仓库名、标签都是<none> 的镜像,俗称dangling image
Dockerfile 写一个
docker image ls -f dangling=true
命令结果
查看
docker image prune
删除
虚悬镜像
准备编写Dockerfile文件
docker build -t 新镜像名:TAG .
docker run -it 新镜像名:TAG
独立完成 自定义镜像myubuntu
2.DockerFile 解析
建Module
改pom
写yml
主启动
业务类
通过idea新建一个微服务模块
先将项目打包,上传到服务器
上传
编写Dockerfile
docker build -t 新镜像名字:TAG .
构建镜像
docker run -it 新镜像名字:TAG
运行容器
通过Dockerfile发布微服务部署到docker容器
3.docker 微服务实战
docker不启动,默认网络情况
会出现一个 docker0 的虚拟网桥
docker启动后,网络情况
docker network ls
docker network --help
查看docker网络
docker network rm [网络名称]
删除docker网络
查看docker网络源数据
常用基本命令
容器间的互联和通信以及端口映射
容器IP变动时 可以通过服务名直接网络通信而不受影响
能干嘛
bridge
host
none
container
总体介绍
docker inspect [容器名称] | tail -n 20
说明
docker 容器内部的ip是有可能会发生改变的 在每次重启后都可能发生变化
结论
容器实例内默认网络IP生产规则
docker run -d -p 8081:8080 --network bridge --name tomcat83 billygoo/tomcat8-jdk8
命令
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
警告
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
正确
禁用网络功能,只有lo(localhost) 就是127.0.0.1 表示本地回环
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
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
这样会出现冲突
案例1
Alpine操作系统是一个面向安全的轻型Linux发型版
docker run -it --name alpine1 alpine /bin/sh
docekr run -it --network container:alpine1 --name alpine2 alpine /bin/sh
运行结果,验证共用搭桥
停掉 alpine1,alpine2 也没有网络了
如果此时关闭alpine1,再看看alpine2
案例2
https://docs.docker.com/network/links/
过时的link
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
在服务器内部ping IP地址可以ping通
通过服务名 ping 不能ping通
before
自定义桥接网络,自定义网络默认使用的是桥接网络bridge
docker network create zzyy_network
新建自定义网络
docker run -d -p 8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8
新建容器加入上一步新建的自定义网络
互相ping测试
after
自定义网络
网络模式
Docker平台架构图解
4.Docker网络
Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排
https://docs.docker.com/compose/compose-file/compose-file-v3
https://docs.docker.com/compose/install/
官网下载
安装步骤
卸载
去哪下
docker-compose.yml
一文件
一个个应用容器实例,比如订单微服务、mysql容器、redis容器
服务(server)
由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml 文件中定义
工程(project)
两要素
Compose核心概念
编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务
最后,执行docker-compose up 命令来启动并运行整个应用程序,完成一键部署上线
Compose使用的三个步骤
Compose常用命令
以前的基础版
sql建表建库
一键生成说明
mvn package命令将微服务形成新的jar包 并上传到Linux服务器/mydocker目录下
docker build -t 新镜像名:TAG .
改造升级微服务工程docker_boot
新建mysql容器实例
进入mysql容器实例并新建库db2021+新建t_user
单独的mysql容器实例
单独的redis容器实例
微服务工程
上面三个容器依次顺序启动
不用compose
swagger测试
先后启动顺序固定,先mysql+redis 才能启动微服务
多个run命令
容器间的启停或宕机,可能导致IP地址对应的容器实例变化,映射出错,要么生产ip写死(不推荐),要么通过服务调用
上面成功了,有哪些问题
编写docker-compose.yml文件
修改微服务的application.yml 配置文件
docker-compose up
docker-compose up -d
运行docker-compose.yml
使用compose
Compose编排微服务
5.Docker-compose容器编排
Portainer是一款轻量级的应用,提供了图形化界面,用于方便的管理docker环境,包括单机,集群
https://www.portainer.io/
https://docs.portainer.io/v/ce-2.11/start/install/server/docker/linux
docker run -d -p 8000:8000 -p 9000:9000 --name portainer \\ --restart=always \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v portainer_data:/data \\ portainer/portainer-ce
docker run -d -p 8000:8000 -p 9000:9000 --name portainer \\ --restart=always \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v portainer_data:/data \\ portainer/portainer-ce
6.Docker轻量级可视化工具Portainer
docker stats
原生命令
CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表
一句话
CAdvisor
InfluxDB
Granfana
容器监控3剑客
7.Docker容器监控之 CAdvisor+InfluxDB+Granfana
8.总结
高级篇
docker update --restartspan class=always <CONTAINER ID>
docker update --restartspan class=no <CONTAINER ID>
容器自动重启 开启/关闭
常用设置
Docker
yum install git
安装git
其中 可以设置名称。密码
点击 settings --》SSH AND GPG KEYS
将生成的公钥 配置到github
ssh-keygen -t rsa -C \"youremail@abc.com\"
生成秘钥
https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/
tar -zxvf apache-maven-3.6.3-src.tar.gz
查看环境变量
echo $PATH
export MAVEN_HOME=/root/maven/apache-maven-3.6.3/apache-maven/src
export PATH=$PATH:$MAVEN_HOME/bin:.
cd /etc/profile.d/ 目录下新增 .sh 文件
配置环境变量
安装maven
yum search java|grep jdk
1.查看云端目前支持安装的JDK版本
yum install -y java-1.8.0-openjdk
2.选择JDK版本,并安装
java -version
3.检查是否安装成功
find / -name 'java'
4.查看JDK的安装目录
安装java
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificaterpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.keyyum install -y jenkins
systemctl status jenkins // 查看 jenkins 运行状态systemctl start jenkins // 启动 jenkins
/var/lib/jenkins/secrets/initialAdminPassword // jenkins 密码
https://updates.jenkins-ci.org/download/plugins/cloudbees-folder/ 下载一个插件
访问 IP:PORT/restart,越过配置插件的页面,直接访问
点击【系统管理】–【管理插件】–【高级】–【上传插件】,手动安装下载好的插件,即可
在登录配置界面时出现 No such plugin: cloudbees-folder 解决办法
安装Jenkins
centos
Jenkins
漏桶算法
SpringCloud
子主题
MySQL
^[^\\u4e00-\\u9fa5 ]+$
非空 非中文
正则
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)
安装xui:
https://github.com/XIU2/CloudflareSpeedTest/releases/latest
CF优选IP工具
https://github.com/ip-scanner/cloudflare
反代CF的IP
type *.txt>>all.txt
合并txt文件
第一阶段
https://github.com/openbullet/OpenBullet2/releases/latest
OpenBullet2:
/cdn-cgi/trace
CF节点信息:
http://airport.anseo.cn/
机场三字码查询:
BLOCK:HttpRequest url = $\"http://<input.DATA>/cdn-cgi/trace\" maxNumberOfRedirects = 2 customHeaders = {(\"Host\
loli脚本:
二阶段
.\\CloudflareST.exe -tll 40
优选ip
程序运行
x-ui
java
0 条评论
回复 删除
下一页