docker compose 多项目部署流程
完整Docker部署全流程教程(Windows本地 → Ubuntu服务器)这份教程整合了从Docker安装到最终在Ubuntu服务器运行的全流程,涵盖MySQL(含初始化SQL)、Redis、SpringBoot容器的构建、互通、打包迁移,同时标注了你之前踩过的所有坑,确保一步到位。
一、前置说明
适用场景:Windows本地开发调试Docker容器,迁移到Ubuntu服务器稳定运行
核心目标:实现MySQL(含初始化SQL)、Redis、SpringBoot容器互通,迁移后无需重复配置
工具准备:
Windows:Docker Desktop、PowerShell(管理员模式)、Maven(打包SpringBoot)
Ubuntu服务器:已安装SSH、开放22/8080/3306/6379端口
网络:Windows能访问Ubuntu服务器(公网/内网)
二、阶段1:Windows本地环境准备(解决镜像源坑)1. 安装Docker Desktop
下载地址:https://www.docker.com/products/docker-de ...
docker compose 多项目部署流程
✅ 纯命令行完整部署流程(无图形化/无Portainer)适用环境:Ubuntu服务器、无防火墙/安全组权限、80端口可用、本地原生Nginx、多SpringBoot项目(前后端分离)、域名访问、纯Docker命令行操作核心原则:全程 root 用户执行、所有命令复制即用、每步带【成功校验】、多项目彻底隔离无冲突、最终实现「域名+路径」访问所有项目
✅ 整体流程划分(5大核心流程,循序渐进,无任何冗余步骤)流程一:服务器基础环境初始化(安装Docker+Docker-Compose+本地Nginx,必装依赖)流程二:标准化目录结构搭建(多项目隔离、前后端分离,统一目录规范,避免混乱)流程三:Docker容器化部署(SpringBoot后端+MySQL+Redis,纯docker-compose命令,持久化配置,本机通信无端口暴露)流程四:本地Nginx反向代理核心配置(80端口唯一入口,多项目路由隔离、前后端请求转发,彻底解决跳转/跨域/访问问题)流程五:域名解析+最终访问校验+运维常用命令(生产级维护,一键启停/日志查看/更 ...
自动内存管理
《深入理解Java虚拟机》第三版第二章 自动内存管理 —— 知识笔记
一、JVM运行时数据区域划分JVM在执行Java程序时,会将内存划分为若干个运行时数据区。根据《Java虚拟机规范》,主要分为以下 5 + 1 个区域:
区域
线程共享/私有
功能说明
是否可能 OOM
程序计数器
私有
记录当前线程执行的字节码行号(本地方法时为 undefined)
❌ 不会OOM
Java虚拟机栈
私有
存储栈帧(局部变量表、操作数栈、动态链接、返回地址)
✅ StackOverflowError / OutOfMemoryError
本地方法栈
私有
为 Native 方法服务(如 C/C++)
✅ 同上
Java堆(Heap)
共享
几乎所有对象实例和数组分配于此;GC 主战场
✅ OutOfMemoryError: Java heap space
方法区(Method Area)
共享
存储类元信息、常量、静态变量、JIT 编译代码
✅ JDK8+ 为 Metaspace OOM
直接内存(Direct Memory)
非JVM ...
maxDepth
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
/** * 计算二叉树的最大深度 * 最大深度是从根节点到最远叶子节点的最长路径上的节点数 * * @param root 二叉树的根节点 * @return 二叉树的最大深度 */ public int maxDepth(TreeNode root) { if (root == null) { return 0; } else { // 递归计算左子树和右子树的最大深度 int leftHeight = maxDepth(root.left); int rightHeight = maxDepth(root.right); // 返回左右子树中较大的深度值加1(当前节点) return Math.max(leftHeig ...
springboot项目集成swagger的实现
这几日在项目中,老是看到看到许多swagger注解,许多只能了解各大概,抱着得过且过的态度用用就行了。直到自己在构建项目时,发现单纯的添加依赖会报空指针错误。
Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
一番百度后发现,Springfox假设MVC的路径匹配政策是ant-path-matcher,而 Spring Boot 2.6.x版本的默认匹配策略是 path-pattern-matcher,这就造成了上面的报错。
依赖<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version></dependency>
配置注解@C ...
通过Feign调用外网HTTP,设置请求头,熔断器
在许多项目中,往往需要和其他厂商的项目进行对接。这就不得不访问外部url接口。网上的各种方案层出不穷,但我不太喜欢额外添加maven依赖,所以使用已有的feign实现。
由于个人习惯,我的spring-boot版本是2.6.7。这导致了我添加openfeign依赖时总是报错,因为网络上的教程往往是使用了Hoxton.SR8版本的spring-cloud,它的绑定依赖openfeign是2.2.5.RELEASE。
版本兼容的问题往往最难为新手。
添加Maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId><version>3.1.1</version></dependency><dependency> <groupId>org.springframework.cloud</gr ...
Copy 'xxx' to effectively final temp variable 问题解决
今天在项目中修改接口的时候突然发现了类型问题,便用if函数对变量进行了类型的校验。
int a = 0;if (params.get("a") instanceof Integer) { a = (int) params.get("a");}else { a = Integer.parseInt(params.get("a").toString());}
没有多想,便进行了提交,编译后发现竟然报错了。筛查后发现,在这块代码下有一处匿名内部类调用了该变量。
int finalA = a;Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("thread a = " + finalA); }});
出错的原因是:内部类对象的生命周期会超过局部变量的生命周期。 ...
