先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
- 业务场景为4个容器
mysql、eureka、product、config
- 安装mysql
#启动mysql容器
docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=agan \
-d mysql:5.7
#进入mysql容器
docker exec -it mysql /bin/bash
#docker镜像没有ifconfig、ping指令
apt-get update
apt install net-tools # ifconfig
apt install iputils-ping # ping
- 创建eureka容器
docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0
- 部署config镜像和容器(加入config有问题,暂时未找到原因)
dockerfile:
#1.基础镜像:FROM指令:基础镜像名:tag,例如java:8
FROM java:8
#2.维护者:格式:MAINTAINER
MAINTAINER jackly
#3.镜像的操作指令
ADD拷贝一个文件到容器中,格式:ADD
ADD config-server-0.0.1-SNAPSHOT.jar /app/service/config/data/app.jar
#5.配置容器启动后,执行什么命令
ENTRYPOINT [“java”,“-jar”,“/app/service/config/data/app.jar”]
构建镜像
#其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号
#注意:其中 .号,代表当前目录下的dockerfile文件
docker build -t registry-jackly/config-server:1.0.0 .
创建容器
#查看本地镜像
docker images
#启动镜像 link eureka:jacklyureka==>link 容器名称:别名(将配置中心服务注册到eureka)
docker run -d -p 9030:9030 --name config \
–link eureka:jacklyureka \
registry-jackly/config-server:1.0.0
#查看config信息
http://172.31.65.26:9030/e-book-product/deauflt
进入config容器
查看eureka注册信息
- 部署product镜像和容器
dockerfile:
#1.基础镜像:FROM指令:基础镜像名:tag,例如java:8
FROM java:8
#2.维护者:格式:MAINTAINER
MAINTAINER jackly
#3.镜像的操作指令
ADD拷贝一个文件到容器中,格式:ADD
ADD e-book-product-core-0.0.1-SNAPSHOT.jar /app/service/product/data/app.jar
#5.配置容器启动后,执行什么命令
ENTRYPOINT [“java”,“-jar”,“/app/service/product/data/app.jar”]
构建镜像
#其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号
#注意:其中 .号,代表当前目录下的dockerfile文件
docker build -t registry-jackly/product-server:1.0.0 .
创建容器
#查看本地镜像
docker images
#启动镜像 注:link就是容器直接的连接,你不用IP的情况下可以通过link来实现容器名之间的通信;它的语法是 link 容器名:别名
docker run -d -p 8083:8083 --name product \
–link mysql:jacklymysql \
–link eureka:jacklyeureka \
registry-jackly/product-server:1.0.0
#验证效果
http://172.31.65.26:8761/
http://172.31.65.26:8083/product/findAllProduct
link原理
#原理就是在prodct容器中的hosts加了2条记录。
docker exec -it product /bin/bash
cat /etc/hosts
1、docker容器的数据如何共享给宿主机
- 宿主机查看eureka日志
1)使用docker run volume方式实现
#构建镜像
docker build -t registry-jackly/eureka-server:2.0.0 .
#创建容器
#就是把docker的数据保存到宿主机的磁盘中,通常说的就是挂载点,或者叫做卷。
#语法: -v 宿主机目录:容器目录
docker run -d -p 8761:8761 --name=eureka \
–privileged=true \
-v /app/service/eureka/logs:/opt/data \
registry-jackly/eureka-server:2.0.0
2)使用dokcerfile方式实现
#1.基础镜像:FROM指令:基础镜像名:tag,例如java:8
FROM java:8
#2.维护者:格式:MAINTAINER
MAINTAINER jackly
#3.加入挂载点
VOLUME /opt/data
#4.镜像的操作指令
ADD拷贝一个文件到容器中,格式:ADD
ADD eureka-server-0.0.1-SNAPSHOT.jar /app/service/eureka/data/app.jar
#5.告诉docker容器暴露端口,在容器启动的时候,需要通过-p 做端口映射
EXPOSE 8761
#6.配置容器启动后,执行什么命令
ENTRYPOINT [“java”,“-jar”,“/app/service/eureka/data/app.jar”]
#重新构建eureka
docker build -t registry-jackly/eureka-server:3.0.0 .
#创建容器
docker run -d -p 8761:8761 --name=eureka \
–privileged=true \
registry-jackly/eureka-server:3.0.0
注意点:dockerfile volume 无法指定宿主机的目录,都是自动生成,而且是随机的;默认在/var/lib/docker/volumes/。
(为什么是随机生成?因为dockerfile无法确定每台宿主机是否都存在目录)
#如何找到宿主机的挂载目录?
docker inspect eureka
#信息段
“Mounts”: [
{
“Type”: “volume”,
“Name”: “cf527694ebafb92426a52f1916b26832b4c8977093083450a96fbccb3d866669”,
“Source”: “/var/lib/docker/volumes/cf527694ebafb92426a52f1916b26832b4c8977093083450a96fbccb3d866669/_data”,
“Destination”: “/opt/data”,
“Driver”: “local”,
“Mode”: “”,
“RW”: true,
“Propagation”: “”
}
- 总结
docker run 是能指定宿主机的目录。
dockerfile volume 无法指定宿主机的目录,都是自动生成,而且是随机的;默认在/var/lib/docker/volumes/。
2、宿主机如何直接维护docker容器的数据
在没有使用-v挂载点时,创建的容器,在容器删除后,根据镜像重新生成容器后,数据也随之流失。如果使用了挂载点,删除容器后,在根据镜像生成容器,数据还会保留。
docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=agan \
–privileged=true \
-v /app/data/mysql:/var/lib/mysql \
-d mysql:5.7
搭建一个镜像仓库管理系统需要3个步骤,分别是:生成一个认证文件,rsa的认证文件;创建一个仓库容器;创建一个仓库web管理系统
- 生成一个认证文件,rsa的认证文件
#建立/app/registry-jackly/conf,在/app/registry-jackly目录下执行 以下命令:
openssl req -new -newkey rsa:4096 -days 365 -subj “/CN=localhost” -nodes -x509 -keyout conf/auth.key -out conf/auth.cert
- 创建一个仓库容器
#创建配置文件/app/registry-jackly/conf/registry-jackly.yml
version: 0.1
#镜像存储地方
storage:
filesystem:
rootdirectory: /var/lib/registry
#镜像的删除权限,enabled: true代表开启删除权限
delete:
enabled: true
log:
level: info
#开启仓库的网络,端口号为5000
http:
addr: 0.0.0.0:5000
#创建仓库命令
docker run \
-v /app/registry-jackly/conf/registry-jackly.yml:/etc/docker/registry/config.yml:ro \
-v /app/registry-jackly/conf/auth.cert:/etc/docker/registry/auth.cert:ro \
-p 5000:5000 --name registry-docker -d \
–privileged=true \
registry
- 创建一个仓库web管理系统
#创建一个配置文件:/app/registry-jackly/conf/registry-web.yml
registry:
指定registry的地址(注意:registry-docker为仓库的容器名字)
url: http://registry-docker:5000/v2
#仓库的名称(注意:registry-docker为仓库的容器名字)
name: registry-docker:5000
#是否为只读模式,设置true时,不允许删除镜像
readonly: false
#权限验证
auth:
#是否开启验证
enabled: true
#验证证书的key
key: /conf/auth.key
#证书颁发者的名称
issuer: docker
#创建仓库web管理系统命令(注意:–link registry-docker很重要,没有的话,无法连接仓库。)
docker run \
-v /app/registry-jackly/conf/registry-web.yml:/conf/config.yml:ro \
-v /app/registry-jackly/conf/auth.key:/conf/auth.key \
-v /app/registry-jackly/db:/data \
-d -p 8080:8080 --link registry-docker --name registry-web \
–privileged=true \
hyper/docker-registry-web
- 效果验证
#登录仓库管理系统
http://172.31.65.26:8080/login/auth
用户名=admin
密码 =admin
#构建镜像
#其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号
#注意:其中 .号,代表当前目录下的dockerfile文件
docker build -t registry-docker:5000/eureka-server:3.0.0 .
#修改hosts(vi /etc/hosts)
127.0.0.1 registry-docker
#给搭建好的仓库加个镜像
docker push registry-docker:5000/eureka-server:3.0.0
#权限设置
默认admin用户是没有删除权限,需要重新创建用户,并且给予权限。
在先前构建项目时,先通过maven打包出jar,在手动上传到虚拟机上,并编写dockerfile文件,在使用docker build命令构建镜像,比较繁琐。实际上可以通过maven来直接构建springcloud镜像,maven构建springcloud镜像推送给仓库,需要2步骤:开启docker远程API;编写maven的docker插件。
- 开启docker远程API
#在配置文件中,加入:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
vi /usr/lib/systemd/system/docker.service
#重启docker
systemctl daemon-reload
systemctl restart docker
#验证docker远程api是否生效
netstat -anp|grep 2375
curl 127.0.0.1:2375/info
- 编写maven的docker插件
#本地配置hosts(c:\windows\system32\drivers\etc)
172.31.65.26 registry-docker
#docker maven插件
org.springframework.boot
spring-boot-maven-plugin
com.spotify
docker-maven-plugin
1.1.1
registry-docker:5000
http://registry-docker:2375
registry-docker:5000/ p r o j e c t . a r t i f a c t I d : {project.artifactId}: project.artifactId:{project.version}
java:8
[“java”, “-jar”, “/${project.build.finalName}.jar”]
${project.version}
latest
true
true
/
${project.build.directory}
${project.build.finalName}.jar
#执行命令
clean package -DskipTests docker:build
- 验证效果
- 什么是compose为什么要使用compose
因为运行一个docker镜像,通常是需要docker run 命令,在运行镜像的时候还需要一定的参数 ;例如 容器的名称 映射的卷,绑定端口等等,非常麻烦。那如果有个一个文件来记录保存这些命令该多好? 所以compose就是用于存储这些命令,而且呢是比docker run还要简单存储。那compose是什么呢? 它既是一个yaml格式的文件,例如docker-compose.yml文件。
#安装最新compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.21.2/docker-compose-uname -s
-uname -m
> /usr/local/bin/docker-compose
#添加可执行权限
chmod +x /usr/local/bin/docker-compose
#测试安装结果
docker-compose --version
- 自动构建spring cloud注册中心eureka
创建一个网络
创建命令:docker network create dockernet
查看命令:docker network ls
compose内容:
#docker compse 的配置文件包含3大部分:version services networks
version: ‘3’
services:
服务名称
eureka:
容器名称
container_name: eureka
镜像名称
image: registry-docker:5000/eureka-server:0.0.1-SNAPSHOT
暴露的端口号
ports:
- “8761:8761”
设置卷挂载的路径 /opt/data代表的是日志存储路径
volumes:
- /app/service/eureka/logs:/opt/data
设置权限 :拥有root权限
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
运行命令
docker-compose -f docker-compose-eureka.yml up -d
演示效果
http://172.31.65.26:8761/
- 自动构建spring cloud 配置中心config
compose内容
version: ‘3’
services:
config-server:
container_name: config-server
image: registry-docker:5000/config-server:0.0.1-SNAPSHOT
ports:
- “9030:9030”
networks:
- default
networks:
default:
external:
name: dockernet
运行命令
docker-compose -f docker-compose-config.yml up -d
演示效果
http://172.31.65.26:9030/e-book-product/default
- 自动构建spring cloud 调用链zipkin
compose内容
version: ‘3’
services:
zipkin-server:
container_name: zipkin-server
image: registry-docker:5000/zipkin-server:0.0.1-SNAPSHOT
ports:
- “9411:9411”
networks:
- default
networks:
default:
external:
name: dockernet
运行命令
docker-compose -f docker-compose-zipkin.yml up -d
演示效果
http://172.31.65.26:9411
- 自动构建spring cloud 日志系统ELK
compose内容
version: ‘3’
services:
elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
command: elasticsearch
ports:
-
“9200:9200”
-
“9300:9300”
privileged: true
networks:
- default
logstash:
container_name: logstash
image: docker.elastic.co/logstash/logstash:6.1.1
command: logstash -f /etc/logstash/conf.d/logstash.conf
volumes:
挂载logstash配置文件
-
/app/service/logstash/config:/etc/logstash/conf.d
-
/app/service/logstash/build/:/opt/build/
ports:
- “6000:5000”
privileged: true
networks:
- default
kibana:
container_name: kibana
image: docker.elastic.co/kibana/kibana:6.1.1
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
ports:
- “5601:5601”
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
logstash.conf存放在/app/service/config下
For detail structure of this file
Set: https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
input {
For detail config for log4j as input,
See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
tcp {
mode => “server”
host => “logstash” #logstash容器名称
port => 9250
}
}
filter {
#Only matched data are send to output.
}
output {
For detail config for elasticsearch as output,
See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
elasticsearch {
action => “index” #The operation on ES
hosts => “elasticsearch:9200” #ElasticSearch host, can be array. elasticsearch容器名称
index => “applog” #The index to write data to.
}
}
运行命令
docker-compose -f docker-compose-elk.yml up -d
如果elasticsearch 报这个错误
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决方案:sudo sysctl -w vm.max_map_count=262144
演示效果
#创建一个索引
curl -XPUT http://172.31.65.26:9200/applog
#进入elk页面
http://172.31.65.26:5601/app/kibana
- 自动构建product 服务
第一步:自动构建 mysql 微服务
Docker Compose 配置文件,包含3大部分 version、services、networks
version: ‘3’
services:
服务名称
mysql:
容器名称
container_name: mysql
镜像名称
image: mysql:5.7
暴露端口
ports:
- “3306:3306”
设置卷挂载路径
volumes:
- /app/data/mysql:/var/lib/mysql
环境变量
environment:
MYSQL_USER: root
MYSQL_PASSWORD: agan
MYSQL_ROOT_PASSWORD: agan
设置权限 :拥有root权限
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
#启动mysql容器
docker-compose -f docker-compose-mysql.yml up -d
第二步:自动构建 product 微服务
#docker-compose-product.yml
version: ‘3’
services:
product:
container_name: e-book-product
image: registry-docker:5000/e-book-product-core:0.0.1-SNAPSHOT
ports:
- “8083:8083”
设置权限 :拥有root权限
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
#启动容器
docker-compose -f docker-compose-product.yml up -d
第三步:演示效果
#看注册中心
http://172.31.65.26:8761/
#产品查询接口
http://172.31.65.26:8083/product/findAllProduct
#看日志
http://172.31.65.26:5601/app/kibana
#调用链
http://172.31.65.26:9411/
- 自动构建自动构建 user order trade consumer 微服务
第一步:构建相关服务
#docker-compose-service.yml
version: ‘3’
services:
product:
container_name: e-book-product
image: registry-docker:5000/e-book-product-core:0.0.1-SNAPSHOT
ports:
- “8083:8083”
networks:
- default
user:
container_name: e-book-user
image: registry-docker:5000/e-book-user-core:0.0.1-SNAPSHOT
ports:
- “8084:8084”
networks:
- default
order:
container_name: e-book-order
image: registry-docker:5000/e-book-order-core:0.0.1-SNAPSHOT
ports:
- “8085:8085”
networks:
- default
trade:
container_name: e-book-trade
image: registry-docker:5000/e-book-trade-core:0.0.1-SNAPSHOT
ports:
- “8086:8086”
networks:
- default
consumer:
container_name: e-book-consumer-order
image: registry-docker:5000/e-book-consumer-order:0.0.1-SNAPSHOT
ports:
- “8090:8090”
networks:
- default
networks:
default:
external:
name: dockernet
#启动容器命令
docker-compose -f docker-compose-service.yml up -d
第二步:演示效果
#看注册中心
http://172.31.65.26:8761/
#产品查询接口
http://172.31.65.26:8083/product/findAllProduct
#创建订单
http://172.31.65.26:8090/createOrder
#看日志
http://172.31.65.26:5601/app/kibana
#调用链
最后
Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ntainer_name: e-book-product
image: registry-docker:5000/e-book-product-core:0.0.1-SNAPSHOT
ports:
- “8083:8083”
networks:
- default
user:
container_name: e-book-user
image: registry-docker:5000/e-book-user-core:0.0.1-SNAPSHOT
ports:
- “8084:8084”
networks:
- default
order:
container_name: e-book-order
image: registry-docker:5000/e-book-order-core:0.0.1-SNAPSHOT
ports:
- “8085:8085”
networks:
- default
trade:
container_name: e-book-trade
image: registry-docker:5000/e-book-trade-core:0.0.1-SNAPSHOT
ports:
- “8086:8086”
networks:
- default
consumer:
container_name: e-book-consumer-order
image: registry-docker:5000/e-book-consumer-order:0.0.1-SNAPSHOT
ports:
- “8090:8090”
networks:
- default
networks:
default:
external:
name: dockernet
#启动容器命令
docker-compose -f docker-compose-service.yml up -d
第二步:演示效果
#看注册中心
http://172.31.65.26:8761/
#产品查询接口
http://172.31.65.26:8083/product/findAllProduct
#创建订单
http://172.31.65.26:8090/createOrder
#看日志
http://172.31.65.26:5601/app/kibana
#调用链
最后
Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-AoUPvkBj-1713457804906)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-grcXYfEQ-1713457804907)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!