使用阿里云轻量应用服务器安装Docker进行SpringBoot项目的部署上线

news2024/11/24 0:39:13

零、写在前面

项目源码:QiuShicheng/Qiu-blog (github.com)

项目是跟着B站up主【三更草堂】做的,本人最终系统是修改了一些前端代码。

(注:源码中前端代码未修改,仍是up主提供的)

购买了一个轻量应用服务器2核2G,新用户包年108元。

安装WinSCP,用于服务器与本地文件的传输。

请一起参考四、参考链接去操作,最后出错,数据库连不上,redis报错,可以尝试删除容器和镜像,重新操作。

一、工作准备

1.数据库打包

第一步:在D盘新建SpringBootBlogMySQL文件夹

第二步:win+r,在弹出的命令行黑窗口输入如下,-p是数据库密码,mybolgSite.sql是输出后的文件名

mysqldump -u root -p228675 sg_blog > D:\SpringBootBlogMySQL\mybolgSite.sql

第三步:查看SpringBootBlogMySQL文件夹,就会发现有一个mybolgSite.sql,这个就是数据库备份文件,也就是我们要的打包文件

2.后端项目打包

第一步: 把Qiu-admin(子工程)的application.yml文件修改为如下

server:
  port: 8989
spring:
  datasource:
    url: jdbc:mysql://服务器ip(公):3306/sg_blog?characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

  servlet:
    # 文件上传
    multipart:
      # 单个上传文件的最大允许大小
      max-file-size: 20MB
      # HTTP请求中包含的所有文件的总大小的最大允许值
      max-request-size: 20MB

  redis:
    host: 服务器ip(公)
    port: 6379


mybatis-plus:
  configuration:
    # 日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-field: delFlag
      logic-delete-value: 1
      logic-not-delete-value: 0
      id-type: auto

# 打开七牛云,找到密钥管理,把相关信息填写到下面3行,会被Qiu-blog工程的OOSTest类获取
myoss:
  accessKey: _ibGP9wytjLCAZPqcFaWQNxbw7fMUvofSOvOFFR3
  secretKey: QSOAU-cv3sSDGNfVNPF6iXz-PsP5X9QTrjFI9zYw
  bucket: Qiu-blog

第二步: 把Qiu-blog(子工程)的application.yml文件修改为如下 

server:
  port: 7777

spring:
  # 数据库连接信息
  datasource:
    url: jdbc:mysql://服务器ip(公).180:3306/sg_blog?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

  servlet:
    # 文件上传
    multipart:
      # 单个上传文件的最大允许大小
      max-file-size: 20MB
      # HTTP请求中包含的所有文件的总大小的最大允许值
      max-request-size: 20MB

  # springboot 2.6版本之后需要配置ant_path_matcher才能生使swagger生成接口文档
  # 我们目前的springboot版本是2.5.0,不需要配置ant_path_matcher也可正常使用swagger
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

  redis:
    host: 服务器ip(公)
    port: 6379
mybatis-plus:
#  configuration:
#    # 日志
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 逻辑删除的字段
      logic-delete-field: delFlag
      # 代表已删除的值
      logic-delete-value: 1
      # 代表未删除的值
      logic-not-delete-value: 0
      # 主键自增策略,以mysql数据库为准
      id-type: auto

# 打开七牛云,找到密钥管理,把相关信息填写到下面3行,会被Qiu-blog工程的OOSTest类获取
myoss:
  accessKey: _ibGP9wytjLCAZPqcFaWQNxbw7fMUvofSOvOFFR3
  secretKey: QSOAU-cv3sSDGNfVNPF6iXz-PsP5X9QTrjFI9zYw
  bucket: huanf-blog

 第三步: 把SpringBootBlog(父工程)的pom.xml文件修改为如下,然后刷新

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.QiuBolg</groupId>
    <artifactId>QiuBolg</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <!-- Maven的聚合-->
    <modules>
        <module>Qiu-framework</module>
        <module>Qiu-admin</module>
        <module>Qiu-blog</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencyManagement>


        <dependencies>
            <!-- SpringBoot的依赖配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.5.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--fastjson依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.33</version>
            </dependency>
            <!--jwt依赖-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.9.0</version>
            </dependency>
            <!--mybatisPlus依赖-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.3</version>
            </dependency>

            <!--阿里云OSS-->
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>3.10.2</version>
            </dependency>


            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>3.0.5</version>
            </dependency>

            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
            </dependency>
        </dependencies>


    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <!--
                    执行本插件的方法为,在主目录下执行如下命令:
                    mvn package assembly:single

                    对于 IntelliJ IDEA,生成的 JAR 包位于每个模块下的文件夹 target
                    -->
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <!-- 此处 IntelliJ IDEA 可能会报红,这是正常现象  -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <manifest>
                            <!-- 配置程序运行入口所在的类 -->
                            <mainClass>com.Qiu.QiuBlogApplication</mainClass>
                        </manifest>
                        <manifest>
                            <!-- 配置程序运行入口所在的类 -->
                            <mainClass>com.Qiu.BlogAdminApplication</mainClass>
                        </manifest>
                    </archive>
                    <!-- 设置 JAR 包输出目录 -->
                    <outputDirectory>${project.build.directory}/#maven-assembly-plugin</outputDirectory>
                    <!-- 设置打包后的 JAR 包的目录结构为默认 -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

第四步: 把Qiu-blog(子工程)的pom.xml文件修改为如下,然后刷新

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>QiuBolg</artifactId>
        <groupId>com.QiuBolg</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Qiu-blog</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.QiuBolg</groupId>
            <artifactId>Qiu-framework</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.5.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <finalName>${project.artifactId}</finalName>
    </build>
</project>

第五步:Qiu-admin(子工程)的pom.xml文件修改为如下,然后刷新

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>QiuBolg</artifactId>
        <groupId>com.QiuBolg</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Qiu-admin</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.QiuBolg</groupId>
            <artifactId>Qiu-framework</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.5.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <finalName>${project.artifactId}</finalName>
    </build>
</project>

第六步: 打开父工程所在的目录,导航栏输入cmd回车会弹出一个黑窗口

第七步: 在cmd输入如下,即可得到Qiu-admin(在Qiu-admin/target可找到jar包)、Qiu-blog(在Qiu-blog/target可找到jar包)工程的jar包。当然也得到了Qiu-framework工程的jar包(这个jar包用不上)

mvn package assembly:single

第八步: 测试jar包。只需要在Qiu-admin/target打开cmd输入如下,即可测试Qiu-admin或Qiu-blog工程的jar包,建议测试Qiu-admin工程的jar包,会比较方便

注意: 由于Qiu-blog在启动时必须要开redis,如果是测试Qiu-blog工程的jar包,那么你必须先开启redis

3.前端项目打包

第一步: 把sg-blog-vue(前台)项目的config目录下的index.js文件,port属性值从8080改为8093

第二步: 把sg-vue-admin(后台)项目的vue.config.js文件的port值从81改为8094

第三步: 把sg-blog-vue\src\vue.config.js文件,里面的localhost改为服务器ip。第33行左右。

第四步: 把sg-blog-vue\src\store\index.js文件,里面的localhost改为服务器ip。第13行左右。

第五步: 把sg-blog-vue的.env.development文件,里面的localhost改为服务器ip,注意端口是8989

# just a flag
ENV = 'development'

# base api
VUE_APP_BASE_API = 'http://服务器ip(公):8989'

第六步: 把sg-blog-vue的.env.production文件,里面的localhost改为服务器ip,注意端口是8989

# just a flag
ENV = 'production'

# base api
VUE_APP_BASE_API = 'http://服务器ip(公):8989'

第七步: 把sg-vue-admin的vue.config.js文件,里面的localhost改为服务器ip,注意端口是8989。第33行左右。

第八步: 把sg-vue-admin的.env.development文件,里面的localhost改为服务器ip,注意端口是8989。

# just a flag
ENV = 'development'

# base api
VUE_APP_BASE_API = 'http://服务器ip(公):8989'

第九步: 把sg-vue-admin的.env.production文件,里面的localhost改为服务器ip,注意端口是8989

# just a flag
ENV = 'production'

# base api
VUE_APP_BASE_API = 'http://8.137.35.5:8989'

第十步: 把sg-vue-admin\src\router\index.js文件修改为如下

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

/* Layout */
import Layout from '@/layout'

/**
 * Note: sub-menu only appear when route children.length >= 1
 * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
 *
 * hidden: true                   if set true, item will not show in the sidebar(default is false)
 * alwaysShow: true               if set true, will always show the root menu
 *                                if not set alwaysShow, when item has more than one children route,
 *                                it will becomes nested mode, otherwise not show the root menu
 * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb
 * name:'router-name'             the name is used by <keep-alive> (must set!!!)
 * meta : {
    roles: ['admin','editor']    control the page roles (you can set multiple roles)
    title: 'title'               the name show in sidebar and breadcrumb (recommend set)
    icon: 'svg-name'/'el-icon-x' the icon show in the sidebar
    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)
    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set
  }
 */

/**
 * constantRoutes
 * a base page that does not have permission requirements
 * all roles can be accessed
 */
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },
  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: '首页', icon: 'dashboard' }
    }]
  },
  {
    path: '/write',
    component: Layout,
    children: [{
      path: '/',
      name: 'Write',
      component: () => import('@/views/content/article/write/index'),
      hidden: true
    }]
  },
  {
    path: '/system/user',
    component: Layout,
    children: [{
      path: '/',
      name: 'User',
      component: () => import('@/views/system/user'),
      hidden: true
    }]
  },
  {
    path: '/system/role',
    component: Layout,
    children: [{
      path: '/',
      name: 'role',
      component: () => import('@/views/system/role'),
      hidden: true
    }]
  },
  {
    path: '/system/menu',
    component: Layout,
    children: [{
      path: '/',
      name: 'menu',
      component: () => import('@/views/system/menu'),
      hidden: true
    }]
  },
  {
    path: '/system/role',
    component: Layout,
    children: [{
      path: '/',
      name: 'role',
      component: () => import('@/views/system/role'),
      hidden: true
    }]
  },
  {
    path: '/content/article',
    component: Layout,
    children: [{
      path: '/',
      name: 'article',
      component: () => import('@/views/content/article/index'),
      hidden: true
    }]
  },
  {
    path: '/content/category',
    component: Layout,
    children: [{
      path: '/',
      name: 'category',
      component: () => import('@/views/content/category/index'),
      hidden: true
    }]
  },
  {
    path: '/content/link',
    component: Layout,
    children: [{
      path: '/',
      name: 'link',
      component: () => import('@/views/content/link/index'),
      hidden: true
    }]
  },
  {
    path: '/content/tag',
    component: Layout,
    children: [{
      path: '/',
      name: 'tag',
      component: () => import('@/views/content/tag/index'),
      hidden: true
    }]
  }
]

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRoutes
})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

export default router

第十一步: 把sg-vue-admin\src\main.js文件,注释掉下面的内容

第十二步: 在sg-blog-vue项目的终端执行如下

npm run build

第十三步: 在sg-vue-admin项目的终端执行如下

npm run build:prod

第十四步: 检查打包目录是否生成

二、服务器部署

1.开放防火墙

安装的系统环境为CentOS7。首先添加规则,开发端口。

2.Docker安装

yum -y install gcc
yum -y install gcc-c++
yum install -y yum-utils
yum install vim

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl start docker # 启动docker
docker version

 3.拉取镜像

docker pull openjdk:8
docker pull mysql:8.0.19 # 建议和本地mysql的版本一样
docker pull redis:6.0.8
docker pull nginx:1.18.0

docker images # 查看有哪些镜像

4.构建镜像

第一步: 在目录下新建mydataQiu-admin.jar和Qiu-blog.jar包传到这个mydata目录里面 

第二步: 在mydata目录新建Dockerfile文件,写入如下

cd
cd mydata
touch Dockerfile
vim Dockerfile

# 基础镜像使用jdk1.8
FROM openjdk:8
# 作者
MAINTAINER xha
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD Qiu-blog.jar qiu_blog.jar
# 运行jar包
RUN bash -c 'touch /qiu_blog.jar'
ENTRYPOINT ["java","-jar","/qiu_blog.jar"]
#暴露7777端口作为微服务
EXPOSE 7777

第三步: 在mydata目录执行如下,作用是构建Qiu-blog.jar包的镜像,构建出来的镜像名为sangeng_blog 

docker build -t sangeng_blog:1.0 .

第四步: 把mydata目录下的Dockerfile文件修改为如下

# 基础镜像使用jdk1.8
FROM openjdk:8
# 作者
MAINTAINER xha
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD Qiu-admin.jar qiu_admin.jar
# 运行jar包
RUN bash -c 'touch /qiu_admin.jar'
ENTRYPOINT ["java","-jar","/qiu_admin.jar"]
#暴露8989端口作为微服务
EXPOSE 8989

第五步: 在mydata目录执行如下,作用是构建Qiu-admin.jar包的镜像,构建出来的镜像名为sangeng_admin

docker build -t sangeng_admin:1.0 .

 第六步: 检查是否构建出sangeng_blog和sangeng_admin镜像

docker images

5.创建容器

第一步:看Docker-compose版本,如果你是按照我上面安装的docker,那么你肯定会有Docker-compose

docker compose version

第二步:在mydata目录新建docker-compose.yml文件,写入如下

cd
cd mydata
touch docker-compose.yml
vim docker-compose.yml

 (注:记得mysql密码改写成自己的)

#compose版本
version: "3"  
 

services:
  sangeng_blog:
#微服务镜像  
    image: sangeng_blog:1.0
    container_name: sangeng_blog
    ports:
      - "7777:7777"
#数据卷
    volumes:
      - /app/sangeng_blog:/data/sangeng_blog
    networks: 
      - blog_network
    depends_on: 
      - redis
      - mysql
      - nginx


  sangeng_admin:
#微服务镜像
    image: sangeng_admin:1.0
    container_name: sangeng_admin
    ports:
      - "8989:8989"
#数据卷
    volumes:
      - /app/sangeng_admin:/data/sangeng_admin
    networks:
      - blog_network
    depends_on:
      - redis
      - mysql
      - nginx
     
#redis服务
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/conf/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - blog_network
    command: redis-server /etc/redis/redis.conf
 
 #mysql服务
  mysql:
    image: mysql:8.0.19
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'sg_blog'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: '123456'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - blog_network
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

 #nginx服务
  nginx:
    image: nginx:1.18.0
    ports:
      - "80:80"
      - "8093:8093"
      - "8094:8094"
    volumes:
      - /app/nginx/html:/usr/share/nginx/html
      - /app/nginx/logs:/var/log/nginx
      - /app/nginx/conf:/etc/nginx
    networks:
      - blog_network
    

 
 #创建自定义网络
networks: 
   blog_network:

 输入如下,作用是检查docker-compose.yml文件有没有语法错误,如果输入之后没任何输出,就说明没有语法错误

cd
cd mydata
docker compose config -q

 运行docker-compose.yml文件,就可以创建并运行java容器、mysql容器、redis容器、nginx容器。-d表示后台运行

docker compose up -d
docker ps -a #查看正在运行的容器

6.导入数据库

第一步:把前面在 '部署博客项目-数据库打包' 那里拿到的 'mybolgSite.sql' 文件上传到服务器的 /app/mysql/db 目录

第二步:查看容器ID

docker ps -a #查看容器ID

第三步: 进入MySQL容器内部,执行导入sql文件的操作 

docker start mydata-mysql-1 # 启动mysql容器
docker exec -it 容器ID bash # 进入mysql容器内部

# 下面的是执行导入sql文件的操作,必须要进入了mysql容器内部才能执行如下命令,mysql的登录密码是228675
mysql -u root -p
228675
use sg_blog;
source /var/lib/mysql/mybolgSite.sql;
show tables; #这里能看到数据库表格

第四步: 退出MySQL容器内部

exit # 退出MySQL
exit # 退出MySQL容器

7.配置Redis

第一步:进入 /app/redis/redis.conf 目录下,新建redis.conf文件,写入如下,注意不需要把配置写完全,redis有自己的默认配置

cd /app/redis/redis.conf
touch redis.conf
vim redis.conf

bind 0.0.0.0
daemonize no
protected-mode no

第二步: 启动所有容器。nginx容器启动不了没关系,现在还没配置nginx

systemctl start docker # 启动docker
docker ps -a # 查看容器ID
docker restart 容器ID # 重新启动所有容器
docker ps # 查看实际启动的容器

8.配置Nginx

第一步:将前端项目打包好后的两个dist文件夹重命名发送到/app/nginx/html目录下

第二步:修改/app/nginx/conf/nginx.conf配置文件,文件内容如下:

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       8093;
        server_name  localhost;
              location / {
                     root   /usr/share/nginx/html/blog_dist;
                     index  index.html index.htm;
                     try_files $uri $uri/ /index.html;
                   }

        }

    server {
        listen       8094;
        server_name  localhost;

              location / {
                     root   /usr/share/nginx/html/admin_dist;
                     index  index.html index.htm;
                     try_files $uri $uri/ /index.html;
                   }

        }
}

第三步: 启动所有容器。注意,这次nginx容器是可以正常启动的,并且全部容器都是正常启动的

systemctl start docker # 启动docker
docker ps -a # 查看容器ID
docker restart 容器ID # 重新启动所有容器
docker ps # 查看实际启动的容器

到此,完成了所有部署相关的操作。即可浏览器输入ip+8093查看个人前端系统。ip+8094查看个人后台系统。

三、效果展示

前台博客系统   http://8.137.35.5:8093/#/Home

四、参考链接

1. myblog (yuque.com) 

2. 超详细Docker部署SpringBoot+Vue项目(三更博客项目部署) - xhang′s blog (xhablog.online)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1003615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下WSL将ubuntu挪位置-系统盘清理

Windows下WSL将ubuntu挪位置-系统盘清理 Excerpt 文件夹&#xff0c;将 C 盘下对应路径的 .android 文件夹拷贝过来覆盖&#xff1b;最近 C 盘空间暴涨&#xff0c;用工具 WinDirStat。文件夹里的内容都是无用的垃圾&#xff0c;可以统统清除掉&#xff0c;找到对应的老路径修改…

​重生奇迹MU剑士技能升级攻略​

奇迹剑士技能升级技巧 游戏中剑士作为近战的代表职业&#xff0c;一直以来都是血牛职业&#xff0c;除了拥有强大的防御一级减伤能力之外&#xff0c;剑士还有着非常不错的输出能力。 如果其他职业与重生奇迹MU剑士近身战斗&#xff0c;那么完全讨不到半点便宜。虽然剑士表现…

CentOS8安装mysql-community-client错误解决

安装MySQL5.7.37的mysql-community-client-5.7.37-1.el7.x86_64.rpm时&#xff0c;提示如下&#xff1a; 提示的意思是缺少依赖软件包。 使用如下命令安装依赖包&#xff1a; yum install libncurse* 实际安装如下两个软件包。 成功后再次安装mysql-community-client-5.7.37…

2020-2022年低纬高原区典型种养殖区氮磷干湿沉降数据集

摘要 氮磷干湿沉降是指大气中氮磷通过沉降方式到达地面,进入陆地生态系统物质循环的过程,干湿沉降在环境氮磷污染输入中占据重要比例。我国是种养殖业大国,摸清源于种植业和养殖业氮磷干湿沉降负荷,对评估氮磷干湿沉降生态效应,指导环境污染治理,促进种养殖业绿色发展具有…

vim的使用介绍以及命令大全

懒羊羊感谢大家的关注和三连支持~ 目录 前言 一、vim的使用介绍 二、命令大全 1.命令模式 &#xff08;1&#xff09;复制&#xff08;配合粘贴命令p使用&#xff09; &#xff08;2&#xff09;剪切 &#xff08;3&#xff09;粘贴 &#xff08;4&#xff09;删除 …

企业可以自己建立大数据平台吗?有哪些好处?

随着企业的快速发展&#xff0c;企业累积了越来越多的数据&#xff0c;但管理巨量的大数据是一件非常难的事情&#xff0c;且很多数据没有充分发挥作用。因此不少企业在问&#xff0c;企业可以自己建立大数据平台吗&#xff1f;有哪些好处&#xff1f; 企业可以自己建立大数据…

不同场景下的JMETER设置

不同场景下的JMETER设置 1.基准测试 验证主要业务在单用户运行下的性能指标&#xff0c;为多用户并发并发和混合场景的性能分析提供基础参考。 基准测试JMETER线程组设置(在1秒内执行5个线程循环一次)&#xff1a; 2.并发测试 多用户在同一时间访问某一个模块或则应用的场景&…

为什么要选择期权?开通期权有何益处?

相较于期货&#xff0c;期权的交易方式更为灵活多样&#xff0c;对标的期货市场也有较高的要求。据了解&#xff0c;在国际成熟的期权市场上&#xff0c;流动性和价格波动性是判断期货品种是否适合开展期权交易的两大关键因素&#xff0c;下文介绍为什么要选择期权&#xff1f;…

什么气传导蓝牙耳机好?2023气传导耳机推荐

​随着科技的发展&#xff0c;耳机市场正迎来一场前所未有的变革。气传导耳机作为一种新兴的耳机类型&#xff0c;正逐渐受到消费者的关注和青睐。然而&#xff0c;面对层出不穷的气传导耳机&#xff0c;我们该如何选择&#xff1f;本文将帮助你挑选到最适合自己的气传导耳机&a…

【全国大学生IoT设计竞赛】安谋科技国赛三等奖分享:城市环境监测小车——城市守望者

本文参加极术社区和灵动微电子组织的【有奖征集】分享作品传播技术成果&#xff0c;更有奖品等你来领&#xff01;线上征集活动。 8月23到25日&#xff0c;我们参加了在南京大学举行的线下2023物联网创新设计大赛全国总决赛。由全国高等学校计算机教育研究会主办&#xff0c;湖…

Vscode 快速下载

https://vscode.cdn.azure.cn/stable/8b617bd08fd9e3fc94d14adb8d358b56e3f72314/VSCodeUserSetup-x64-1.82.0.exe https://vscode.cdn.azure.cn/------>镜像&#xff0c;将官网的下载地址复制过来&#xff0c;stable开始拼接到后面

华为云云耀云服务器L实例评测|使用宝塔面板管理服务器教学

目录 一、概述 1.1 华为云云耀云服务器L实例 1.2 BT&#xff08;宝塔&#xff09; 1.3 资源和成本规划 二、购买云耀云服务器L实例并进行相关配置 2.1 购买云耀云服务器L实例 2.2 设置服务器密码 2.3 配置安全组 2.4 设置Nginx安全级别 三、初始化宝塔面板 3.1 获取密…

网卡bond和信息查看 EDACDIMMCEError错误导致服务器重启

https://blog.csdn.net/weixin_45720992?spm1001.2101.3001.5343 EDACDIMMCEError错误导致服务器重启 现象&#xff1a; 最近几天一个华为RH2285服务器一直不定时自动重启&#xff0c;基本每天一两次&#xff0c;查看系统日志报下面的错误&#xff0c;每秒记录一条错误日志 …

单位固定资产应该怎么管理

对于单位固定资产的管理&#xff0c;更是需要我们以创新的方式&#xff0c;以科技的手段&#xff0c;以严谨的态度来对待。那么&#xff0c;单位固定资产应该如何进行有效的管理呢&#xff1f; 建立一个完善的资产管理系统  我们需要建立一个完善的资产管理系统。这个系统应…

图片怎么压缩大小?这样压缩图片很简单

在日常生活中&#xff0c;我们常常需要处理各种各样的图片文件&#xff0c;但有时候图片的大小可能会成为问题。比如在上传图片到网站或者将图片发送给朋友时&#xff0c;过大的图片可能会导致上传速度变慢或者占用过多内存。这时&#xff0c;我们就需要用到图片压缩了&#xf…

从“白人饭”到美味佳肴,拓世AI为你打造独一无二的饮食计划

最近“白人饭”作为一种饮食方式在社交媒体上火了&#xff0c;成为打工人新的“午餐之光”。所谓“白人饭”&#xff0c;就是花最少的功夫准备仅仅能维系基本器官正常运作的食物&#xff0c;主打生吃或者简单炒&#xff0c;比如一个丹麦网友晒出的同事的午饭就是几根小胡萝卜和…

【UE】刀光粒子效果——part2 材质函数部分

效果 步骤 1. 新建一个材质函数&#xff0c;这里命名为“MF_TextureCommon” 2. 新建一个材质&#xff0c;这里命名为“Mat_GuangBan1”&#xff0c;添加如下节点 3. 接下来将该材质的逻辑添加到材质函数上&#xff0c;复制材质“Mat_GuangBan1”中的如下节点&#xff0c;粘贴…

虚拟机挂起后再解挂后网络图标消失,没有网络/虚拟机ubuntu系统没有网络

现象描述&#xff1a; 本人虚拟机跑的是Ubuntu20.04的系统&#xff0c;每次当我挂起虚拟机后&#xff0c;再次打开虚拟机的时候网络图标就会消失&#xff0c;如下图 而实际有网的样子如下图 解决办法&#xff1a; 方法一&#xff1a;重启网络编辑器 sudo service network-ma…

FlowJo 10.4.0(流式细胞分析器工具)

FlowJo mac是一款流式细胞仪数据分析软件&#xff0c;广泛用于生物医学研究领域。它提供了强大的功能和直观的用户界面&#xff0c;使用户能够对流式细胞仪收集的数据进行高级分析和可视化。 FlowJo for mac具有以下主要特点&#xff1a; 数据导入和预处理&#xff1a;FlowJo支…

写代码中碰到的错误

bind绑定类内成员导致 "no matching function for call to ..." 当bind绑定类内成员时&#xff0c;需要指明绑定的成员所在类的位置。 上面未指明Remove函数在哪个类中从而导致错误。 此外 bind 的函数指针类型是const类型的&#xff0c;都需要添加 const 修饰。 S…