docker部署前后端分离SpringBoot项目(保姆级教程)
- 时光论坛
- 2025-12-10 12:07:43
- 2439
作为一个运维,使用docker来部署前后端分离的项目是绕不过去的坎,今天我们就来学习一下如何来完整的部署一个前后端分离的项目
这里我们用来练习部署的SpringBoot项目是GitHub上的一个开源项目:校园博客 [scblogs]——————https://github.com/stick-i/scblogs?tab=readme-ov-file#校园博客-scblogs,虽然这个项目没有完整的结束,有些功能还没有做出来,但是项目中用到的各种服务非常完善,五脏俱全,非常适合我们来进行练习部署,在这里感谢大佬的项目分享
注意,直接在虚拟机上下载GitHub项目下载不了,可以先在本地下载项目的zip包,然后通过scp上传到虚拟机,再解压获得项目源码
在GitHub上我们能看到项目的目录,已经将各个后端服务和前端列举了出来
├─gateway-service:网关服务 容器启动映射端口8080:80
├─user-service:用户服务 容器启动映射端口40010:40010
├─blog-service:博客服务 容器启动映射端口40020:40020
├─blink-service:动态服务 容器启动映射端口40030:40030
├─comment-service:评论服务 容器启动映射端口40040:40040
├─resource-service:资源服务 容器启动映射端口40000:40000
└─vueblog:前端Vue服务
在开始部署之前,我们先来进行服务器的服务规划,这次练习我们在VMware搭建了三台服务器以供部署:
192.168.43.3:网关+用户+nacos服务
192.168.43.4:博客+评论+nacos服务
192.168.43.5:资源+动态+nacos服务
在部署服务之前,我们还需要先部署一下诸如MySQL的前置应用,这里我为了方便,把这些应用都部署在了192.168.43.3这台服务器,当然你也可以部署在其他服务器,或者搭建一个集群,这里我就以部署单服务器为示范了
1、部署MySQL
在192.168.43.3执行,创建数据卷并授权
mkdir -p /opt/mysql/{data,conf}
sudo chmod -R 777 /opt/mysql
启动MySQL容器
docker run -d \
--name mysql \
--restart always \
-p 3306:3306 \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
mysql:8.0.33 \
--default-authentication-plugin=mysql_native_password
初始化数据库
cd scblogs-main/document/mysql_config
执行SQL脚本(输入MySQL密码)
mysql -h 192.168.43.3 -u root -p < create_scblogs.sql
验证数据库是否创建成功(登录MySQL后执行)
mysql -h 192.168.43.3 -u root -p
show databases; # 应看到user、blog、comment、resource、blink五个数据库
exit
2、部署 Redis
创建Redis数据目录
mkdir -p /opt/redis/data
sudo chmod -R 777 /opt/redis
启动Redis容器
docker run -d \
--name redis \
--restart always \
-p 6379:6379 \
-v /opt/redis/data:/data \
redis:7.0.11 \
redis-server --appendonly yes
验证Redis
docker exec -it redis redis-cli
ping # 返回PONG即为正常
exit
3、部署 RabbitMQ
创建RabbitMQ数据目录
mkdir -p /opt/rabbitmq/data
sudo chmod -R 777 /opt/rabbitmq
启动RabbitMQ容器(带管理界面)
docker run -d \
--name rabbitmq \
--restart always \
-p 5672:5672 \
-p 15672:15672 \
-v /opt/rabbitmq/data:/var/lib/rabbitmq \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=guest \
rabbitmq:3.12.4-management
验证RabbitMQ(访问管理界面)
访问" http://192.168.43.3:15672 ,账号密码均为guest"
登录进来之后,先进入user界面,创建一个管理员用户
创建成功之后,右上角log out退出登录,使用管理员用户登录,点击最右侧的virtual hosts按钮,点击add a new virtual host,创建一个名为scblogs的host(可以只填第一个空,下面的可以不填)
4、部署 Elasticsearch+IK 分词器
调整系统参数(否则 ES 可能启动失败)
sudo tee -a /etc/sysctl.conf < vm.max_map_count=262144 EOF sudo sysctl -p # 生效配置 # 创建ES数据和插件目录 mkdir -p /opt/elasticsearch/{data,plugins} sudo chmod -R 777 /opt/elasticsearch # 启动ES容器 docker run -d \ --name elasticsearch \ --restart always \ -p 9200:9200 \ -p 9300:9300 \ -e discovery.type=single-node \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -v /opt/elasticsearch/data:/usr/share/elasticsearch/data \ -v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ elasticsearch:7.17.12 在本地下载ik分词器再上传到虚拟机 下载链接:https://release.infinilabs.com/analysis-ik/stable/ 找到对应的版本,我这里选择的elasticsearch版本是7.17.12,故选择下载https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.17.12.zip 下载完之后在终端通过scp把压缩包上传到虚拟机(压缩包放在D盘根目录下) D:\>scp ./elasticsearch-analysis-ik-7.17.12.zip root@192.168.43.3:/root/ 解压到独立目录 mkdir /root/ik-plugin unzip elasticsearch-analysis-ik-7.17.12.zip -d /root/ik-plugin/ 将/root/ik-plugin下的所有文件直接复制到容器的/plugins/ik/目录 docker cp /root/ik-plugin/. d9fb9e571b33:/usr/share/elasticsearch/plugins/ik/ 修复文件权限 docker exec -it elasticsearch /bin/bash chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/plugins/ik/ exit 重启容器 docker restart elasticsearch 验证Elasticsearch是否启动 curl 192.168.43.3:9200 输出为下面这个即为成功 5、部署 MinIO 创建MinIO数据目录 mkdir -p /opt/minio/data sudo chmod -R 777 /opt/minio 启动MinIO容器 docker run -d \ --name minio \ --restart always \ -p 9000:9000 \ -p 9001:9001 \ -v /opt/minio/data:/data \ -e MINIO_ROOT_USER=minioadmin \ -e MINIO_ROOT_PASSWORD=minioadmin \ minio/minio:RELEASE.2023-07-21T21-12-44Z \ server /data --console-address ":9001" 验证MinIO(访问控制台) 访问" http://192.168.43.3:9001 ,账号密码均为minioadmin" 6、部署nacos集群 在192.168.43.3的MySQL中创建nacos用户并授权 docker exec -it mysql /bin/bash mysql -u root -p CREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'nacos'@'%' IDENTIFIED BY 'nacos'; GRANT ALL PRIVILEGES ON nacos.* TO 'nacos'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON user.* TO 'nacos'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON blog.* TO 'nacos'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON blink.* TO 'nacos'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON comment.* TO 'nacos'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON resource.* TO 'nacos'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; 启动nacos,分别在三台服务器上执行 192.168.43.3: docker run \ --name nacos-server-1 -d \ --privileged=true \ --restart=always \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ -e MODE=cluster \ -e PREFER_HOST_MODE=ip \ -e NACOS_SERVER_IP=192.168.43.3 \ -e NACOS_SERVERS=192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_DATABASE_NUM=1 \ -e MYSQL_SERVICE_HOST=192.168.43.3 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e MYSQL_SERVICE_USER=nacos \ -e MYSQL_SERVICE_PASSWORD=nacos \ -e JVM_XMS=512m \ -e JVM_XMX=512m \ -e JVM_XMN=256m \ nacos/nacos-server:v2.1.2 192.168.43.4 docker run \ --name nacos-server-2 -d \ --privileged=true \ --restart=always \ -p 8858:8848 \ -p 9858:9848 \ -p 9859:9849 \ -e MODE=cluster \ -e PREFER_HOST_MODE=ip \ -e NACOS_SERVER_IP=192.168.43.4 \ -e NACOS_SERVERS=192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=192.168.43.3 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e MYSQL_SERVICE_USER=nacos \ -e MYSQL_SERVICE_PASSWORD=nacos \ -e JVM_XMS=512m \ -e JVM_XMX=512m \ -e JVM_XMN=256m \ nacos/nacos-server:v2.1.2 192.168.43.5: docker run \ --name nacos-server-3 -d \ --privileged=true \ --restart=always \ -p 8868:8848 \ -p 9868:9848 \ -p 9869:9849 \ -e MODE=cluster \ -e PREFER_HOST_MODE=ip \ -e NACOS_SERVER_IP=192.168.43.5 \ -e NACOS_SERVERS=192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=192.168.43.3 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e MYSQL_SERVICE_USER=nacos \ -e MYSQL_SERVICE_PASSWORD=nacos \ -e JVM_XMS=512m \ -e JVM_XMX=512m \ -e JVM_XMN=256m \ nacos/nacos-server:v2.1.2 使用navicat连接数据库,然后使用nacos数据库,执行以下命令,初始化数据库,会生成12张表 点击查看代码 /* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info */ /******************************************/ CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, `encrypted_data_key` text NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_aggr */ /******************************************/ CREATE TABLE `config_info_aggr` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) NOT NULL COMMENT 'group_id', `datum_id` varchar(255) NOT NULL COMMENT 'datum_id', `content` longtext NOT NULL COMMENT '内容', `gmt_modified` datetime NOT NULL COMMENT '修改时间', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_beta */ /******************************************/ CREATE TABLE `config_info_beta` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `encrypted_data_key` text NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_tag */ /******************************************/ CREATE TABLE `config_info_tag` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `tag_id` varchar(128) NOT NULL COMMENT 'tag_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT 'id', `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `nid` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(20) unsigned NOT NULL, `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(128) NOT NULL, `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `src_user` text, `src_ip` varchar(50) DEFAULT NULL, `op_type` char(10) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `encrypted_data_key` text NOT NULL COMMENT '秘钥', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `kp` varchar(128) NOT NULL COMMENT 'kp', `tenant_id` varchar(128) default '' COMMENT 'tenant_id', `tenant_name` varchar(128) default '' COMMENT 'tenant_name', `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; CREATE TABLE `users` ( `username` varchar(50) NOT NULL PRIMARY KEY, `password` varchar(500) NOT NULL, `enabled` boolean NOT NULL ); CREATE TABLE `roles` ( `username` varchar(50) NOT NULL, `role` varchar(50) NOT NULL, UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE ); CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL, `resource` varchar(255) NOT NULL, `action` varchar(8) NOT NULL, UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE ); INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); 然后就可以通过浏览器访问nacos了 访问“192.168.43.3:8848/nacos/”,初始账号密码都是nacos 选择导入配置,导入项目文件中的nacos配置文件 这里有个坑,我们导入时,会要求我们把DEFAULT_GROUP压缩为zip上传,但是直接把该文件夹压缩为zip上传会显示错误,我们需要在DEFAULT_GROUP文件夹外面再创建一个文件夹public,然后压缩public,再上传就能成功了 如果直接导入DEFAULT_GROUP.zip,会显示如下结果: 选择public.zip,可以直接导入: 出现14条配置信息,则为配置成功: 修改 Nacos 中的敏感配置(通过 Nacos 控制台操作) 进入【配置管理】→【配置列表】 把配置文件中的数据库地址都修改一下,然后发布,如图所示: 其中比较特殊的几项 default-rabbitmq.yaml: default-redis.yaml: resource-server.yaml(这里的邮箱授权码需要自己去邮箱查看申请): 点击查看代码 spring: datasource: druid: url: jdbc:mysql://192.168.43.3:3306/resource?serverTimezone=Asia/Shanghai username: nacos password: nacos driver-class-name: com.mysql.cj.jdbc.Driver mail: host: smtp.qq.com username: 1210275268@qq.com password: xiefogupohyfjeed # SMTP 授权码 port: 587 properties: mail: smtp: auth: true # 强制开启SMTP认证 starttls: enable: true # 启用TLS加密(587端口必须配置) required: true # 强制要求TLS加密连接 cloud: nacos: discovery: ip: 192.168.43.5 port: 40000 server-addr: 192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 group: DEFAULT_GROUP server: port: 40000 minio: url: http://192.168.43.3:9000 username: minioadmin password: minioadmin resource: path: avatar-bucket: avatar image-bucket: image image-url-base: http://image.scblogs.cn/ user-server.yaml: 点击查看代码 spring: # 数据库连接配置(保持不变) datasource: druid: url: jdbc:mysql://192.168.43.3:3306/user?serverTimezone=Asia/Shanghai username: nacos password: nacos driver-class-name: com.mysql.cj.jdbc.Driver # 新增:Nacos 服务注册配置(关键) cloud: nacos: discovery: # 强制注册为宿主机 IP(user-server 所在的 master 服务器 IP:192.168.43.3) ip: 192.168.43.3 # 注册的端口(需与容器映射的宿主机端口一致,假设为 40010) port: 40010 # Nacos 服务器地址(与网关、blog-server 配置一致) server-addr: 192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 # 服务分组(默认 DEFAULT_GROUP,保持与其他服务一致) group: DEFAULT_GROUP # 服务自身端口配置(容器内部端口,需与容器映射的内部端口一致) server: port: 40010 # 必须与 spring.cloud.nacos.discovery.port 保持一致 blog-content-server.yaml:ES 地址(http://192.168.43.3:9200) 接下来就可以开始启动后端服务并注册到nacos了 # 安装JDK和Maven sudo apt install openjdk-17-jdk maven -y # maven配置阿里云镜像,不配置国内镜像的话,maven构建会很慢 cd ~/.m2 vim settings.xml aliyunmaven central 阿里云公共仓库 https://maven.aliyun.com/repository/public ``` 进入gataway-service(以这个服务为例,其他服务的操作相同,都是找到bootstrap.yml文件修改nacos地址),到resource目录下 打开bootstrap.yml文件修改nacos地址:server-addr: 192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 # nacos地址 把所有的服务都修改好之后回到项目根目录 cd ~/scblogs-main # 打包项目 mvn clean package -Dmaven.test.skip=true # 构建镜像 docker build -t gateway-server:1.0 --build-arg JAR_FILE=target/gateway-service-1.0.0.jar . # 运行 docker run -d --name gateway-server -p 8080:80 gateway-server:1.0 # 可以通过日志查看是否运行正常 docker logs -f gateway-server 如下则运行正常: user服务和gataway完全相同,由于我们已经在192.168.43.3这台服务器上构建好了环境,就选择在这台服务器上构建所有镜像然后传输到其他服务器,避免重复进行环境构建操作 在打包好镜像之后,将镜像打包成tar包,然后传输到其他服务器,这里我们以blog服务为例 # 构建镜像 docker build -t blog-server:1.0 --build-arg JAR_FILE=target/blog-server-1.0.0.jar . # 打包 docker save blog-server:1.0 > blog-server:1.0.tar # 传输(这里需要修改ssh的配置文件才能往root用户传输文件,vim /etc/ssh/sshd_config,然后加入PermitRootLogin yes,sudo systemctl daemon-reload # 重新加载系统服务配置,sudo systemctl restart sshd # 再次重启 SSH 服务) scp ./blog-server:1.0.tar root@192.168.43.4:/root/ # 转到192.168.43.4服务器,解包 docker load < blog-server:1.0.tar # 启动容器 docker run -d --name blog-server -p 40020:40020 blog-server:1.0 服务正常启动之后,打开nacos查看,可以看到,nacos界面的服务列表会出现对应的服务 正常部署完所有的服务的实例数和健康实例数都是1,这里我的user-server服务是2是因为我在两台服务器上都部署了user服务,通过gataway来实现负载均衡 可以不用进行,正常到这里后端服务部署已经结束了,可以正常访问了 下面我们也会来进行如何将一个服务器部署在两台服务器上的操作 我们需要先修改nacos里的配置文件,使ip地址不通过硬编码的方式写入 spring: # 数据库连接配置(通用,两台服务器相同) datasource: druid: url: jdbc:mysql://192.168.43.3:3306/user?serverTimezone=Asia/Shanghai username: nacos password: nacos driver-class-name: com.mysql.cj.jdbc.Driver # Nacos 服务注册配置(通用部分) cloud: nacos: discovery: # 不硬编码IP,通过启动参数动态传入 # ip: 192.168.43.3 (删除此行,改为启动时指定) port: 40010 # 端口通用(两台服务器端口一致) server-addr: 192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 group: DEFAULT_GROUP # 服务自身端口(通用,与注册端口一致) server: port: 40010 然后回到192.168.43.3 停止容器并删除 docker stop user-server && docker rm user-server 重新启动 docker run -d \ -p 40010:40010 \ -e JAVA_OPTS="-Dspring.cloud.nacos.discovery.ip=192.168.43.3" \ --name user-server \ user-server:1.0 像上面的blog服务一样,将镜像传到192.168.43.4运行 docker run -d \ -p 40010:40010 \ -e JAVA_OPTS="-Dspring.cloud.nacos.discovery.ip=192.168.43.4" \ --name user-server \ user-server:1.0 等待服务初始化,然后你就可以在nacos中看到user-server的服务实例变为2了 后端启动完成,接下来我们来启动前端 进入vueblog目录 再进入src,修改axios.js中的网关地址 然后再进入public,修改index.html,直接替换为以下内容
We're sorry but vueblog-3 doesn't work properly without JavaScript enabled. Please enable it to continue.
然后回到vueblog目录
#安装依赖
npm install
#生成dist
npm run build
再回到项目根目录scblogs-main
vim Dockerfile
# 使用官方Nginx镜像
FROM nginx:alpine
# 删除默认Nginx配置
RUN rm /etc/nginx/conf.d/default.conf
# 将自定义Nginx配置复制到容器中
COPY nginx.conf /etc/nginx/conf.d/
# 将前端dist文件夹中的内容复制到Nginx的默认静态文件目录
COPY vueblog/dist/ /usr/share/nginx/html/
# 暴露80端口
EXPOSE 80
# 启动Nginx服务
CMD ["nginx", "-g", "daemon off;"]
vim nginx.conf
server {
listen 80;
server_name 192.168.43.3; # 可以替换为你的域名
# 前端静态资源
root /usr/share/nginx/html;
index index.html;
# 处理前端路由(单页应用需要)
location / {
try_files $uri $uri/ /index.html;
}
# 反向代理后端API
location /api/ {
proxy_pass http://192.168.43.3:8080/; # 替换为你的后端服务地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 构建镜像
docker build -t mynginx .
# 运行容器
docker run -d -p 80:80 --name nginx mynginx
通过浏览器访问,验证各功能是否正常运行
http://192.168.43.3
那么到这里一个完整的前后端分离项目就部署完成啦,如果你遇到任何问题,欢迎在评论区相互交流!!!