docker部署前后端分离SpringBoot项目(保姆级教程)

作为一个运维,使用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"
wechat_2025-08-19_133907_124

登录进来之后,先进入user界面,创建一个管理员用户

wechat_2025-08-19_135100_635

创建成功之后,右上角log out退出登录,使用管理员用户登录,点击最右侧的virtual hosts按钮,点击add a new virtual host,创建一个名为scblogs的host(可以只填第一个空,下面的可以不填)

wechat_2025-08-19_135310_164

4、部署 Elasticsearch+IK 分词器

调整系统参数(否则 ES 可能启动失败)

sudo tee -a /etc/sysctl.conf <<EOF
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
输出为下面这个即为成功

wechat_2025-08-19_151004_446

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,会显示如下结果:

wechat_2025-08-21_130948_765

选择public.zip,可以直接导入:
wechat_2025-08-21_130647_203

wechat_2025-08-21_130800_037

出现14条配置信息,则为配置成功:

wechat_2025-08-21_131231_418

修改 Nacos 中的敏感配置(通过 Nacos 控制台操作)
进入【配置管理】→【配置列表】
把配置文件中的数据库地址都修改一下,然后发布,如图所示:
wechat_2025-08-21_141745_189
其中比较特殊的几项
default-rabbitmq.yaml:
wechat_2025-08-21_142052_645
default-redis.yaml:
wechat_2025-08-21_142158_172
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)

wechat_2025-08-21_142928_787

接下来就可以开始启动后端服务并注册到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
<!-- 阿里云Spring仓库 -->
<mirror>
  <id>aliyunspring</id>
  <mirrorOf>spring</mirrorOf>
  <name>阿里云Spring仓库</name>
  <url>https://maven.aliyun.com/repository/spring</url>
</mirror>
```

进入gataway-service(以这个服务为例,其他服务的操作相同,都是找到bootstrap.yml文件修改nacos地址),到resource目录下

wechat_2025-08-21_162031_844

打开bootstrap.yml文件修改nacos地址:server-addr: 192.168.43.3:8848,192.168.43.4:8858,192.168.43.5:8868 # nacos地址

wechat_2025-08-21_162133_516

把所有的服务都修改好之后回到项目根目录

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

如下则运行正常:
wechat_2025-08-21_163222_401

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界面的服务列表会出现对应的服务

wechat_2025-08-20_095949_127

正常部署完所有的服务的实例数和健康实例数都是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中的网关地址
wechat_2025-08-20_103331_781
然后再进入public,修改index.html,直接替换为以下内容

<!doctype html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" href="logo.png">
    <title>校园博客</title>
    
    <!-- 核心依赖CDN(版本兼容组合) -->
    <!--  引入 Vue 2 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>

    <!--  引入 Vuex -->
    <script src="https://cdn.jsdelivr.net/npm/vuex@3.6.2/dist/vuex.min.js"></script>

    <!--  引入 ElementUI 的 CSS 和 JS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.12.0/lib/theme-chalk/index.css">
    <script src="https://cdn.jsdelivr.net/npm/element-ui@2.12.0/lib/index.js"></script>

    <!--  引入 VueRouter -->
    <script src="https://cdn.jsdelivr.net/npm/vue-router@3.6.5/dist/vue-router.min.js"></script>

    <!--  引入 Axios -->
    <script src="https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/mavon-editor@2.9.1/dist/mavon-editor.min.js"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/mavon-editor@2.9.1/dist/css/index.css" /> 
<!-- 打包后的应用资源 -->
   <!--  <script defer src="js/chunk-vendors.eadedab8.js"></script>
    <script defer src="js/app.13262064.js"></script>
    <link href="css/app.bdbeb88b.css" rel="stylesheet"> --> 
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vueblog-3 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
  </body>
</html>

然后回到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
那么到这里一个完整的前后端分离项目就部署完成啦,如果你遇到任何问题,欢迎在评论区相互交流!!!

posted @ 2025-08-22 09:47  努力成为OM大师  阅读(492)  评论(0)    收藏  举报