首页  > 时光论坛

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"

登录进来之后,先进入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

aliyunspring

spring

阿里云Spring仓库

https://maven.aliyun.com/repository/spring

```

进入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

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