OpenEuler系统SpringBoot+vue项目详细方案

本文章Linux发行版为openEuler 22.03 (LTS-SP2), 多数命令与centos一致, 使用centos的小伙伴也可以参考
不知道自己的服务器是什么发行版的小伙伴可以执行如下命令查看:

cat /etc/os-release

执行结果

在这里插入图片描述

docker是什么?

给第一次接触docker的小伙伴简单解释一下docker, 使用过docker的小伙伴可以跳过 :

Docker是一个开源的容器化平台,它允许开发者和运维人员将应用程序及其依赖打包成标准化的、可移植的容器。这些容器可以在任何支持Docker的环境中运行,提供了一种轻量级、高效的应用程序部署解决方案。

核心概念解析

  • 容器(Container)
    容器是Docker的基本运行单元,它是一个轻量级、独立、可执行的软件包,包含:
    • 应用程序代码
    • 运行时环境
    • 系统工具
    • 系统库
    • 配置文件
    • 容器与虚拟机不同,它共享主机操作系统的内核,不需要单独的客户操作系统,因此更加轻量高效。
  • 镜像(Image)
    镜像是容器的静态模板,包含:
    • 文件系统快照
    • 应用程序及其依赖
    • 启动命令和其他元数据

Docker的主要优势

  • 环境一致性
    • "开发环境"与"生产环境"完全一致
    • 解决"在我机器上能运行"的问题
    • 示例:开发人员可以在本地运行与生产环境相同的MySQL版本
  • 快速部署和扩展
    • 容器启动速度极快(秒级)
    • 便于水平扩展和负载均衡
    • 示例:电商网站在促销期间快速扩展Web服务实例
  • 资源利用率高
    • 比虚拟机更轻量
    • 在相同硬件上可运行更多服务
    • 示例:一台物理服务器可运行数十个容器
  • 隔离性和安全性
    • 每个容器有独立的文件系统和网络空间
    • 资源限制和配额控制
    • 示例:不同的微服务可以在同一主机上隔离运行

应用场景

  • 微服务架构
    • 每个微服务运行在独立容器中
    • 便于独立开发、部署和扩展
  • 持续集成/持续部署(CI/CD)
    • 构建、测试、部署的标准化环境
    • 简化流水线配置
  • 混合云环境
    • 相同的容器可以在本地和云平台运行
    • 避免供应商锁定
  • 开发环境标准化
    • 新成员快速搭建一致的开发环境
    • 避免环境配置差异导致的问题

一、安装docker并配置

1. 安装docker【推荐使用方法二】

方法一: 使用 openEuler 官方源安装docker比较简单, 但是openEuler 官方源docker版本老旧
方法二: 使用华为云镜像源安装最新版 Docker, 因为Docker 20.10.0 版本后自带docker-compose插件无需单独安装

方法一: 使用 openEuler 官方源安装docker

1. 安装依赖
sudo yum install -y tar bzip2 make automake gcc gcc-c++ pkgconfig libtool libseccomp-devel libcap-devel libcgroup device-mapper

在这里插入图片描述

2. 安装 Docker
sudo yum install -y docker

在这里插入图片描述

3. 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

执行结果

在这里插入图片描述

4. 查看docker是否成功运行
sudo systemctl status docker

结果如下图

在这里插入图片描述

方法二: 使用华为云镜像源安装最新版 Docker(推荐使用该方法 !)

1.更新系统并安装依赖
sudo dnf update -y

执行完成如下图所示

在这里插入图片描述

2.添加 Docker CE 仓库
sudo dnf config-manager --add-repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 替换为 CentOS 8 的仓库
sudo sed -i 's+\$releasever+8+' /etc/yum.repos.d/docker-ce.repo  

执行结果如下所示

在这里插入图片描述

3.安装 Docker CE
sudo dnf install -y docker-ce docker-ce-cli containerd.io

执行完成如下图所示

在这里插入图片描述

4.启动 Docker 设置开机自启及验证安装
# 启动docker
sudo systemctl start docker
# 设置开机自启动
sudo systemctl enable docker
# 查看docker版本
sudo docker --version
# 查看docker运行状态
systemctl status docker

执行完成如下图所示

在这里插入图片描述

至此docker安装完成 !

2. 配置docker

1. 配置镜像加速器

由于docker镜像在国外, 国内下载docker镜像经常会出现下载失败的情况, 所以最好配置docker镜像. 如下是我一直用的docker镜像配置, 直接复制即可!

# 进入docker目录
cd /etc/docker
# 创建daemon.json文件, 此文件用来写docker镜像配置
touch daemon.json
# 编辑文件, 粘贴如下配置文件, 并保存
vi daemon.json

将如下配置粘贴到daemon.json文件中

{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://dockerhub.azk8s.cn",
    "https://mirror.ccs.tencentyun.com",
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.1panel.live",
    "https://atomhub.openatom.cn/",
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "data-root": "/home/docker_data",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

2. 重启docker(为了使镜像源生效)

sudo systemctl restart docker

3. 测试docker运行情况

# 拉取镜像
docker pull hello-world:latest
# 运行hello-world镜像
docker run hello-world

如图所示及为成功 !

在这里插入图片描述

到此docker安装结束 !

二、docker拉取并查看镜像

1. 拉取镜像

命令如下

# xxx代表镜像名例如redis, yyy代表版本例如4.0.14
docker pull xxx:yyy

如图所示

在这里插入图片描述

2. 查看镜像

docker images

如图所示

在这里插入图片描述

三、安装 Docker Compose【注意:使用方法二安装docker此步骤可忽略!!!】

注意: 如果单纯使用docker部署不需要安装Docker Compose, 本文以Docker Compose部署服务故而安装Docker Compose

  1. 下载最新版 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 设置执行权限
sudo chmod +x /usr/local/bin/docker-compose
  1. 验证安装
docker-compose --version

所有步骤如图所示

在这里插入图片描述
至此, Docker Compose安装完成 !

注意: 本文后续部署使用方法一安装的旧版本docker部署, 部署与新版本一致, 但是旧版本部署有网络问题, 新版本不存在这个问题, 如用新版本部署后文的问题请忽略!

四、使用Docker Compose部署服务

1. 配置docker-compose.yml文件

(1) 创建docker-compose.yml文件, 创建的位置最好在你项目同目录的位置创建, 如下图所示, 我本地项目在spingboot文件夹中, 我的yml文件就创建在springboot同目录下
在这里插入图片描述

(2) 配置docker-compose.yml文件, 按照如上拉取的镜像来配置yml文件

注: 本文docker-compose.yml文件位置为: /data/life_project

services:
  redis:
    image: redis:4.0.14 #镜像名
    container_name: redis-container # 容器名
    ports:
      - "6379:6379" # docker容器映射服务器的端口(docker容器端口:服务器端口)
    volumes:
      - /data/life_project/redis:/data # docker容器映射服务器的文件夹(数据持久化)
    command: redis-server --requirepass "123456" # 设置redis密码
    # 如下配置基本一致不再赘述, 如有疑问可以留言也可以直接百度
  nginx:
    image: nginx
    container_name: nginx-container
    ports:
      - "8667:8667"
    volumes:
      - /data/life_project/nginx/html:/usr/share/nginx/html
      - /data/life_project/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
  nacos:
    image: nacos/nacos-server:latest
    container_name: nacos-container
    restart: always
    ports:
      - "8848:8848"
      - "9848:9848"
    environment:
      MODE: standalone          # 单机模式
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: 192.168.5.133
      MYSQL_SERVICE_DB_NAME: nacos_config  # 指定Nacos专用库
      MYSQL_SERVICE_USER: root            # 专用账号
      MYSQL_SERVICE_PASSWORD: 123456
      MYSQL_SERVICE_DB_PARAM: "useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"
    volumes:
      - /data/life_project/nacos/data:/home/nacos/data  # 数据持久化
      - /data/life_project/nacos/logs:/home/nacos/logs  # 日志持久化
      - /data/life_project/nacos/conf:/home/nacos/conf  # 自定义配置
  minio:
    image: minio/minio:RELEASE.2023-10-25T06-33-25Z
    container_name: minio-container
    command: server /data --console-address ":9001"  # 控制台端口9001
    environment:
      MINIO_ROOT_USER: minioadmin      # 管理账号
      MINIO_ROOT_PASSWORD: minioadmin  # 管理密码
    ports:
      - "9000:9000"  # API端口
      - "9001:9001"  # 控制台端口
    volumes:
      - /data/life_project/minio/minio-data:/data  # 数据持久化
    restart: unless-stopped

如上配置的yml文件只是项目所用到的工具, 具体的项目jar包和前端包配置请继续往往下看 !

2.部署vue前端项目

注:

  1. 使用nginx反向代理前端包
  2. 本文的部署目录为: /data/life_project/
  1. 按照docker-compose.yml文件所配置的nginx
    如图所示, 在部署目录创建:
    (1) nginx/conf/nginx.conf文件(映射docker容器中的nginx.conf)
    (2) nginx/html(映射docker容器中的html文件夹, 前端文件资源都放到此文件夹中)
    在这里插入图片描述
    配置nginx.conf和html文件夹中文件, 此处自行配置, 不在赘述

  2. docker启动nginx

# 旧版本docker执行如下命令,启动nginx
docker-compose up -d nginx
# 新版本docker执行如下命令,启动nginx
docker compose up -d nginx
  1. 开放端口

此步骤比较重要如果未能开放端口外部服务器请求会被防火墙拦截 导致访问不到该服务

# 开放8667端口
firewall-cmd --zone=public --add-port=8667/tcp --permanent
# 重启防火墙
firewall-cmd --reload

在这里插入图片描述
4. 验证启动成功

可以使用curl命令来测试, 也可以直接浏览器输入地址加端口看是否能出现页面, 此处使用命令测试

curl http://192.168.9.224:8667/

如下图即为成功(其他局域网服务器验证方法同理)
在这里插入图片描述

3.docker部署nacos

1.按照docker-compose.yml文件中配置nacos

在这里插入图片描述

2.nacos数据库准备

去数据库创建nacos_config数据库, 然后容器启动成功后找到 mysql-schema.sql文件: 文件目录位置如下nacos/conf/ , 去数据库执行sql!

按理来说nacos会自动创建数据库表, 但是博主安装的时候并未自动创建 !

nacos建表, 如图所示

在这里插入图片描述

3.docker启动nacos

本文配置的nacos默认是启动鉴权以及持久化数据到数据库的, 鉴权如何开启请移步我的另一篇文章, 链接如下

点击查看: nacos鉴权问题

# 启动命令,注意新版本docker使用docker compose up -d nacos
docker-compose up -d nacos
# 使用docker ps命令查看nacos是否启动成功
docker ps

启动后发现nacos状态一直处于重启中

在这里插入图片描述

查看nacos启动日志

# 116代表container_id(docker ps命令会返回), 不需要全拼用前几个符号就可以了
docker logs 116

看到如下报错(这是我遇到的错误, 如果没遇到可以跳过)

在这里插入图片描述

此时nacos配置文件是默认的, 我们并没有设置nacos配置文件, 该问题就是因为配置文件的问题, 我们需要在application.properties文件nacos进行一下设置

到nacos/conf目录下, 找到application.properties文件, 文件内容可以参考官方或者网上搜一下, 如果太懒, 下面我也给出来可以直接复制再改一下即可

application.properties

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://填自己的数据库ip地址:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=填自己的数据库账号
db.password.0=填自己的数据库密码
## DB connection pool settings
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
spring.security.enabled=true
nacos.core.auth.enabled=true
# nacos账号(想改可以改, 我这边默认用naocs)
nacos.core.auth.username=nacos
# nacos密码(想改可以改, 我这边默认用naocs)
nacos.core.auth.password=nacos
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:nacos}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:nacos}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true

再次用docker启动nacos

docker-compose start nacos

nacos正常启动 !

在这里插入图片描述

4.启动完成后又发现新问题

注: 以下内容是我本次部署遇到的问题, 小伙伴们没遇到话可以跳过

查看docker服务命令

docker ps

发现nacos一直在重启, 其实也就是nacos启动失败

查看nacos日志

# -f代表实时监控, --tail 100 代表看尾部100行数据, ca代表容器id前两个字符其实就是代表容器id
docker logs -f --tail 100  ca

错误日志如下, 按照报错提示, 发现是nacos连不上数据库

在这里插入图片描述
此时基本上有两种可能:

  1. nacos连接mysql的配置写错了, 去application.properties中查看nacos配置, 确认无误 !
  2. 网络不可达, 访问不到mysql服务器

这个有点坑, 通过ping命令发现两台服务器都是网络互通的, 此时我怀疑是不是nacos的配置有问题, 然而正好相反, 最后排查完确实是网络问题, 虽然两台服务器网络互通, 但是docker容器与mysql服务器网络不通, 具体排查过程不再详述, 直接给出解决办法

修改docker配置文件, 上文在修改docker镜像源的时候有修改过这个文件

# 编辑daemon.json
vi /etc/docker/daemon.json
# 添加如下配置
  "iptables": true,
  "ip-forward": true
# 重启docker
systemctl restart docker

如图所示添加配置

在这里插入图片描述

再次启动nacos, 成功 !

登录nacos成功 !

在这里插入图片描述

3.docker部署springboot项目

1.配置docker-compose.ym文件

在yml文件中添加springboot项目配置,

  base-info:
    image: base-info #镜像名
    container_name: base-info #容器名
    ports:
      - "29924:29924" # 映射端口
    environment:
      - TZ=Asia/Shanghai # 把docker容器时间改为上海时间
    volumes:
      - /data/life_project/springboot/base-info/logs:/app/logs  # 映射日志目录
      - /data/life_project/springboot/base-info/config:/app/ # 映射jar包以及配置文件目录

注意:以后构建镜像会按照此配置来构建, 请重点关注yml的配置 !

2.配置Dockerfile文件

把jar包和bootstrap.yml文件拷贝过来, bootstrap.yml文件配置此文不详述

# 创建Dockerfile文件
touch Dockerfile

在这里插入图片描述

# 编辑Dockerfile文件
vi Dockerfile

把如下内容拷贝到Dockerfile文件中, 请按照您所启动的jar名称和端口修改如下文件

FROM openjdk:8u262 #设置基础镜像为jdk

# 设置工作目录
WORKDIR /app

# 创建日志目录并设置权限(推荐使用具体用户而非777)
RUN mkdir -p /app/logs && \
    chown -R 1000:1000 /app/logs && \
    chmod -R 755 /app/logs

# 复制JAR文件(使用明确的目标文件名)
COPY ./base-info-1.0-SNAPSHOT.jar  /app/base-info-1.0-SNAPSHOT.jar
COPY ./bootstrap.yml /app/bootstrap.yml
# 声明环境变量(统一管理配置)
ENV JAVA_OPTS="\
    -Dfile.encoding=utf-8 \
    -Dspring.cloud.compatibility-verifier.enabled=false \
    -Xms1024M \
    -Xmx2048M \
    -Xmn512M \
    -XX:MaxMetaspaceSize=512M \
    -XX:MetaspaceSize=512M"

# 声明暴露端口
EXPOSE 29924

# 使用数组格式的ENTRYPOINT
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app/base-info-1.0-SNAPSHOT.jar"]

3.构建springboot项目镜像

完成步骤二后, 开始构建镜像

# base-info为docker-compose.yml中已经规定好的image, 要对应起来
docker build -t base-info . # 注意后面有个 . 

构建结果如图所示

在这里插入图片描述

4.构建完成后启动项目

# 使用docker-compose命令启动项目
docker-compose up-d base-info

启动成功 !

在这里插入图片描述

其他服务部署参考base-info即可, 步骤全部一致 !

5.再次发现新问题

(1) 出现问题

部署完成后测试发现, 单个服务访问接口是没问题的, 但是本项目为微服务cloud项目, 需要网关服务来访问其他服务, 此时报错: No route to host (Host unreachable), 具体请看下图所示

在这里插入图片描述

本报错是发生于网关服务调用其他服务出现的错误, No route to host (Host unreachable), 172.19.0.9这个ip是docker中内网ip, 部署完成后docker会给每个服务都分配一个这种内网ip, 且内网ip处于同一个网段内, 如上是很明显的网络错误 ! 而且是docker的内部的网络错误

怀疑的原因: 以前我也部署过类似的项目, 其实并没有出现这种问题, 到这里基本上就没有问题了, 我猜测可能是docker版本的问题, 因为openEuler 22.03 (LTS-SP2), 官方docker镜像源版本是18, 我以前用的docker版本都是26, 而且26版本不需要单独安装docker-compose, 自带插件, 而且没有出现网络问题!

(2)解决办法

我尝试了很多种解决办法, 都没有解决, 最后迫不得已使用终极解决办法: 就是让docker和服务器使用同一个网络

修改配置如下, 在每个docker-compose.yml文件下的服务添加

network_mode: host

如下图所示

在这里插入图片描述

再次启动后, docker网络通信问题就解决了, 但是每个服务都用的是服务器的ip, 可以去nacos中验证, 如下图

在这里插入图片描述

其实并不推荐使用这种方式, 因为可能会导致与服务器存在冲突, 最好还是使用docker自己分配的网络, 如果大佬有什么好办法, 请指点 !

到此使用docker部署springboot项目就完成了 !

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐