一、Docker 容器化改造
1.1 Docker 容器化改造实施框架
1.1.1 传统部署流程拆解
后端环境准备:包括克隆源码、安装 MySQL 和 Redis、修改配置文件(`application.yml` 中的数据库连接信息)、导入 SQL 数据。
前后端打包部署:前端需进行 NPM 打包并配置 Nginx;后端需准备 JDK 环境,使用 Maven 打包成 Jar 包并运行。
1.1.2 容器化网络与连接策略
网络互通基础:容器化改造的核心在于确保 Nginx、Java 后端、Redis、MySQL 四个组件处于同一 Docker 网络(网桥)中,以实现 IP 互通。
端口映射与暴露:通过 `docker run` 命令的 `-p` 参数将容器内部端口(如 8080、6379、3306)映射到宿主机,确保外部访问及容器间通信畅通。

1.2 若依项目容器化部署实践
1.2.1 构建环境隔离与版本一致性
环境隔离策略:为避免宿主机环境干扰,建议使用 Docker 容器作为独立的构建环境(如 Maven 镜像),而非直接在宿主机进行打包操作。
JDK 版本强一致性:强调 Maven 打包环境与项目运行环境(`pom.xml` 中指定的 JDK 版本)必须严格一致。若版本不匹配(如 Maven 环境为 JDK17 而项目要求 JDK1.8),将导致编译失败或运行时异常。
构建流程演示:演示了通过挂载源码目录到 Maven 容器内部进行编译,利用挂载卷机制将生成的 Jar 包输出到宿主机指定目录。
1.2.2 数据库初始化机制
自动执行 SQL 脚本机制:MySQL 容器在启动时,若挂载了 `/docker-entrypoint-initdb.d` 目录,会自动执行该目录下的 `.sql` 和 `.sh` 脚本,无需手动导入数据。
字符集配置要求:部署 Redis 容器时,必须配置 UTF-8 字符集支持,否则会导致验证码显示乱码或无法生成。
1.2.3 服务间通信配置
网络连接方式:建议将若依后端服务与 MySQL/Redis 服务置于同一自定义网络(如 `ruoyi-net`)中,利用 Docker 内置的 DNS 解析机制,通过容器名(如 `mysql.server`)进行服务发现,避免硬编码 IP 地址带来的维护成本。
二、Docker Compose 原理与应用
2.1 声明式管理理念
定义与优势:Docker Compose 是一种多容器集中化管理工具,采用"声明式"配置(YAML 文件)描述所有容器的镜像、网络、卷、环境变量等,实现从构建到运行的全生命周期管理。
与命令式对比:区别于逐条执行 `docker run` 命令的"陈述式"管理,声明式管理通过配置文件定义期望状态,由工具自动执行,更适合复杂项目的维护与更新。
2.2 Harbor 私有仓库部署
企业级私有仓库需求:出于安全与知识产权保护考虑,企业自研项目的镜像不应推送到公共仓库,需搭建内网私有仓库(Harbor)。
架构复杂性:Harbor 本身由约 9 个核心组件(如 Nginx、MySQL、Redis 等)构成,均以容器形式运行,天然适合使用 Docker Compose 进行统一编排与管理。
2.2.1 环境准备与配置初始化
工具与源码准备:上传Docker Compose 命令行工具及 Harbor 源码包,赋予执行权限并解压至指定目录。
配置文件修改:编辑 `harbor.yml` 文件,将 `hostname` 修改为本机 IP 地址,并取消 HTTPS 相关配置的注释,同时修改默认管理员密码。
组件预加载:执行 `prepare` 脚本进行环境校验,下载基础镜像并生成各组件(如数据库、日志服务等)的配置文件。
2.2.2 服务启动与验证
声明式启动:执行 `install.sh` 脚本,系统自动读取 `docker-compose.yml` 文件,下载镜像并启动 9 个核心组件容器。
状态检查:使用 `docker-compose ps` 命令查看所有服务的运行状态,确认容器均处于健康(healthy)状态。
访问验证:通过浏览器访问 Harbor 管理界面(默认 80 端口),使用配置的账号密码登录,成功进入仓库管理页面。
2.3 Docker Compose 核心语法与配置解析
2.3.1 YAML 文件格式规范
键值对与缩进:YAML 文件采用键值对(Key-Value)结构,相同层级必须使用相同数量的空格缩进,严禁使用制表符(Tab)。
特殊符号规则:冒号(:)和短横杠(-)等特殊符号后必须添加一个空格,且支持使用井号(#)添加注释。
多资源分割:若文件中包含多个独立的资源对象(如两个不同的服务),需使用三个短横杠(---)进行分割。
2.3.2 核心配置字段详解
服务定义与镜像:`services` 下定义各容器服务,`image` 指定镜像来源,`container_name` 定义容器名称。
生命周期策略:`restart` 字段定义重启策略(always/no/on-failure),`depends_on` 解决服务间的启动依赖顺序。
网络与存储:`networks` 指定自定义网络,`volumes` 定义数据卷挂载,`ports` 定义端口映射。
2.3 Docker Compose 常用管理命令
基于 YAML 文件进行多容器管理的常用指令,实现一键启停:
2.3.1 服务状态与生命周期管理
状态查看:使用**`docker-compose ps`** 查看当前目录下所有服务的状态,比原生 `docker ps` 更具针对性。
一键启停:`docker-compose up -d` 启动所有服务(后台运行),`docker-compose down` 停止并删除所有容器及网络。
2.3.2 配置修改与重载
密码修改方案:Harbor 密码修改支持两种方式,一是在 Web 控制台修改,二是修改 `harbor.yml` 后重新执行 `prepare` 和 `install` 脚本。
配置生效流程:若修改了 YAML 配置文件,需执行 `docker-compose down` 清理环境,再执行 `docker-compose up -d` 重新构建启动。
三、Docker Compose 部分实例
3.1Docker Compose 编排与 Harbor 仓库管理
3.1.1 Docker Compose 核心机制
声明式编排原理:Docker Compose 通过 `docker-compose.yaml` 或 `docker-compose.yml` 文件,将 `docker run` 命令行参数转换为清单式配置,实现多容器服务的批量管理与生命周期控制。
文件路径依赖:执行 `docker-compose` 命令时,若未显式指定配置文件路径,系统默认在当前目录下查找上述两个固定名称的文件,若路径错误将导致命令执行失败。
3.1.2 Harbor 私有仓库安全配置
令牌超时机制:Harbor 采用 Token 机制进行用户鉴权,默认令牌有效期为 30 分钟,超时后自动登出,需重新登录以维持操作权限。
客户端配置与登录:客户端需在 `/etc/docker/daemon.json` 中添加 `insecure-registries` 字段指向 Harbor 地址,并执行 `systemctl reload docker` 使配置生效,随后通过 `docker login` 命令完成认证。
3.2 镜像推送与高可用架构
3.2.1 镜像推送全流程
标签与推送操作:推送前需使用 `docker tag` 重命名镜像,格式为 `仓库地址/项目名/镜像名:标签`,随后执行 `docker push` 完成上传。
数据持久化验证:通过删除并重启 Harbor 容器组,验证了数据卷挂载(Volume)的持久性,确认镜像数据在容器销毁后依然保留。
3.2.2 Harbor 高可用与同步
多仓库同步机制:Harbor 内置了仓库同步功能,支持通过配置规则(如 Cron 表达式)将本地仓库的镜像自动推送到远端仓库,实现数据的异地备份与高可用。
非信任证书处理:在配置同步目标时,若使用自签名证书或非信任证书,需取消勾选 SSL 验证选项,否则可能导致连接失败。
3.3 若依项目容器化实战
3.3.1 多服务编排逻辑
服务依赖与网络:通过 `links` 参数建立容器间的网络连接(如 Nginx 连接 Java 服务),并使用 `depends_on` 定义启动顺序依赖关系(如 Java 依赖 MySQL 和 Redis)。
端口与挂载映射:定义了宿主机与容器间的端口映射(如 `8888:80`),以及配置文件、日志目录的数据卷挂载,确保配置与数据持久化。
3.3.2. 自定义镜像构建
动态构建策略:Java 后端服务未直接使用现成镜像,而是在 `docker-compose.yaml` 中通过 `build` 指令指定 `Dockerfile` 路径,实现镜像的本地动态构建。
数据库初始化:MySQL 容器启动时,通过挂载 SQL 脚本目录,自动执行初始化脚本以创建数据库和导入基础数据。
补充:
bash
一、DNS 解析配置与优先级机制
1. 配置文件的三种路径
系统级配置文件:Linux 系统中可通过 `/etc/resolv.conf` 配置 DNS 服务器地址(如 114.114.114.114 或 8.8.8.8)。
网卡配置文件:可通过 Network Manager 或直接在网卡配置文件中指定 DNS 参数,该配置通常具有较高的优先级。
本地 Hosts 文件:Linux 的 `/etc/hosts` 和 Windows 的 `C:\Windows\System32\drivers\etc\hosts` 文件均可用于本地域名解析,Windows 修改时需注意管理员权限问题。
2. 解析顺序与优先级逻辑
缓存优先原则:系统在进行 DNS 解析时,会优先查询本地 DNS 缓存,若命中则直接返回结果,无需读取磁盘文件。
就近原则排序:在无缓存的情况下,解析顺序遵循"就近原则"。Hosts 文件(定向解析)最快,其次是网卡配置(流量必经之路),最后是 `/etc/resolv.conf`(客户端配置)。
3. Hosts 文件的加速应用
加速访问原理:当公网 DNS 解析缓慢或不可达时,可通过查询工具获取目标域名 IP,将其写入 Hosts 文件,利用本地定向解析绕过公网 DNS 查询瓶颈。
CDN 工作机制:大型网站(如百度)利用 CDN 技术,在全国各省会城市部署节点服务器,用户访问时通过"就近原则"获取解析,而非直接访问源站,从而提升访问速度。
总结:
bash
DNS 可以在哪些地方配置 : /etc/resolv.conf /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/hosts
1、/etc/resolv.conf
nameserver 114.114.114.114
2、/etc/sysconfig/network-scripts/ifcfg-ens33
dns="114.114.114.114"
3、/etc/hosts #定向解析
192.168.110.129 www.dog.com
hosts文件 > 网卡配置 > /etc/resolv.conf DNS客户端配置文件
服务端解析DNS的优先级 ,主要是从快--》慢的逻辑排列解析顺序的(就近原则)
分解:
使用docker 做容器化改造(可以写成项目) ruoyi后端
使用dockerfile 把ruoyi后端完成(能连接mysql 与redis 容器)
传统意义上,完整的ruoyi 实现步骤
1、git clone 源码
2、部署mysql 和redis
3、修改2个文件
ruoyi/ruoyi-admin/src/main/resources/application-druid.yml mysql
# mysql_ip
# mysql_password
ruoyi/ruoyi-admin/src/main/resources/application.yml redis
# redis_ip
4、导入2个sql 数据到mysql(先准备ry-vue的数据库)
5、部署nginx,打包前端源码 npm , 准备后端jdk环境,mvn 打后端jar包 (关键问题jdk17 18版本要一致)
6、java后端最后运行
7、调试连接(传统连接)
nginx 调配置文件、java 调连接后端的地址端口、数据库、数据库(确保防火墙关闭)
ng:192.168.110.129:80 ---> java 192.168.110.130:8080 ---> redis 192.168.110.131:6379
---> mysql 192.168.110.132:3306
###docker版
调通: ip:port 正确即可 (docker 网络)
docker run -itd --name nginx -p 80:80 nginx:1.25.3
docker run -itd --name java -p 8080:8080 ruoyi-admin:1.0
docker run -itd --name mysql -p 3306:3306 mysql:8.0
docker run -itd --name redis -p 6379:6379 redis:6.7
⭐⭐⭐项目数据流向分解:
###########3大框架:
前端 --- 后端 --- 后端数据库(各类角色)
每个角色是什么,干嘛的,大概怎么做的
###############服务层面
客户端---》nginx ha高可用 + keepalived ---》 java ---》 mysql(MGR)
---》 redis
###############TCP/IP层面 L4 IP:PORT 层面
客户端--》访问VIP nginx 自己的网卡ip --》java ---》mysql mysql_ip "?"
---》连接Redis IP地址
##################核心连接点:
1、Nginx 配置文件中:
http {
⭐upstream backend {
server1
server2
}
server { 请求的URL
⭐location / { 具体匹配的URL的请求路径,
⭐ proxy_pass http://backend:8080;
}
}
}
2、后端:
java 接受请求
⭐ url: jdbc:mysql://192.168.110.131:3306/ry-vuexxxxxx
⭐ username: root
⭐ password: 123456
3、后端数据库
mysql 接受请求
⭐连接数据库内部(需要3个部分)
① 账号
② 密码
③ sock通讯文件
##########兼容性/依赖环境
nginx --》gcc gcc-c++ make nodejs/npm + keepalived
java --》jdk(指定版本)、maven
mysql --》MGR 集群
redis --》安装服务环境
剩:配置文件
思维框架:
接到需求,不要想具体的操作细节,① 先把框架理出来、② 考虑好用什么技术、③ 实施和调试、④ 验证
docker 运行mysql 容器时,如果把.sh脚本文件或者.sql 文件挂载到docker-entrypoint-initdb.d 目录中时
mysql 容器会自动执行.sh脚本文件,或者自动执行.sql文件
命令行
ruoyi连贯性项目的时候
docker 有一个工具,可以批量、集中化管理多个容器
docker-compose
① 是什么?
多容器集中化管理的工具
② 干嘛的?
管理多个容器的配置,从镜像制作/镜像下载开始 ,一直到容器运行、容器配置更新、容器关闭
③ 怎么做的?
使用申明式的方法进行管理
什么是"申明式"??
简单来说,就是把多个容器从镜像准备到启动运行的所有配置参数,全部写在配置文件中,然后使用docker-compose工具
进行统一的管理 (docker-compose.yaml 或者 docker-compose.yml)
陈述式管理?类似于使用命令实现功能
harbor 私有镜像仓库
① 是:本地/内网的镜像仓库
② 干嘛的:存储、管理公司内部镜像
③ 怎么做的?
harbor 是由大约9个组件构建 (nginx 、mysql、redis、postgresql、proxy)
每个组件,都是以容器的方式运行的
怎么管理9个组件的呢? 使用 docker-compose 集中化管理
Harbor12345
.yml .yaml 文件的格式
首先:yaml是一种申明式的配置文件清单 (资源清单)
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
xiaohai
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345
yaml格式:
1、在yaml文件中,参数都是以 key - values 对应关系来写的
2、yml文件,相同层级是以与顶格的空格数量来表示的
harbor 做出来了
#给镜像打一个tag标签
docker tag SOURCE_IMAGE[:TAG] 192.168.110.129/ruoyi/IMAGE[:TAG]
#再把镜像推送到仓库中
docker push 192.168.110.129/ruoyi/IMAGE[:TAG]
1、修改配置文件,让我们的docker server可以识别到harbor镜像仓库的位置
/etc/docker/daemon.json
#添加镜像仓库位置,让守护进程可以识别
"insecure-registries": ["192.168.110.129"]
2、登录镜像仓库(命令行)
docker login -uadmin -pHarbor12345 http://192.168.110.129
3、推送镜像到仓库中
#给镜像打一个tag标签
docker tag SOURCE_IMAGE[:TAG] 192.168.110.129/ruoyi/IMAGE[:TAG]
#再把镜像推送到仓库中
docker push 192.168.110.129/ruoyi/IMAGE[:TAG]
docker pull 192.168.110.129/ruoyi/nginx:v0
#####docker 版的ruoyi 的时候
1、git clone 源码
2、部署mysql 和redis
3、修改2个文件
ruoyi/ruoyi-admin/src/main/resources/application-druid.yml mysql
# mysql_ip
# mysql_password
ruoyi/ruoyi-admin/src/main/resources/application.yml redis
# redis_ip
4、导入2个sql 数据到mysql(先准备ry-vue的数据库)
5、部署nginx,打包前端源码 npm , 准备后端jdk环境,mvn 打后端jar包 (关键问题jdk17 18版本要一致)
6、java后端最后运行
7、调试连接(传统连接)
nginx 调配置文件、java 调连接后端的地址端口、数据库、数据库(确保防火墙关闭)
ng:192.168.110.129:80 ---> java 192.168.110.130:8080 ---> redis 192.168.110.131:6379
---> mysql 192.168.110.132:3306
###docker版
调通: ip:port 正确即可 (docker 网络)
docker run -itd --name nginx -p 80:80 nginx:1.25.3
docker run -itd --name java -p 8080:8080 ruoyi-admin:1.0
docker run -itd --name mysql -p 3306:3306 mysql:8.0
docker run -itd --name redis -p 6379:6379 redis:6.7
1、harbor 做出来--》要能推送镜像
2、使用docker-compose 实现ruoyi服务的管理 (内存4G+)
写一份docker-compose管理ruoyi项目的框架 (怎么做的?逻辑是什么)
接到需求,不要想具体的操作细节,① 先把框架理出来、② 考虑好用什么技术、③ 实施和调试、④ 验证
docker-compose ruoyi服务器管理框架
1、
、Nginx 配置文件中:
http {
⭐upstream backend {
server1
server2
}
server { 请求的URL
⭐location / { 具体匹配的URL的请求路径,
⭐ proxy_pass http://backend:8080;
}
}
}
2、后端:
java 接受请求
⭐ url: jdbc:mysql://192.168.110.131:3306/ry-vuexxxxxx
⭐ username: root
⭐ password: 123456
3、后端数据库
mysql 接受请求
⭐连接数据库内部(需要3个部分)
① 账号
② 密码
③ sock通讯文件
##########兼容性/依赖环境
nginx --》gcc gcc-c++ make nodejs/npm + keepalived
java --》jdk(指定版本)、maven
mysql --》MGR 集群
redis --》安装服务环境
剩:配置文件