docker部署三更博客

前置工作

  1. 服务器选取

    这里我选择的是:CPU - 2核、内存 - 2GB、带宽:3Mbps,费用首年95元,公网IP为 43.143.200.250

  2. 了解模块端口

  • 前端模块: 前台 8093 后台 8094
  • 后端模块: 前台 7777 后台 8989
  • mysql数据库端口3306 库名qz_blog 密码****
  • redis端口6379 密码****

后端项目打包

  1. 在父目录下将原来SpringBoot版本修改为2.6.11

在这里插入图片描述

  1. 父模块pom文件下添加(framework下添加这段也可以)
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version> <!-- 使用你所需的版本 -->
            </plugin>
            <!-- 此插件必须放在父 POM 中  -->
            <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>
                            <!-- 配置程序运行入口所在的类 此时选择自己对应的启动类-->
                            <!-- 自己的启动类path-->
                            <mainClass>com.qzhou.QzhouBlogApplication</mainClass>
                        </manifest>
                        <manifest>
                            <!-- 配置程序运行入口所在的类 此时选择自己对应的启动类 -->
                            <mainClass>com.qzhou.QzhouAdminApplication</mainClass>
                        </manifest>
                    </archive>
                    <!-- 设置 JAR 包输出目录 -->
                    <outputDirectory>${project.build.directory}/#maven-assembly-plugin</outputDirectory>
                    <!-- 设置打包后的 JAR 包的目录结构为默认 -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
  1. 子模块qzhou-blog 和qzhou-admin中添加
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <finalName>${project.artifactId}</finalName>
</build>
  1. 因为SpringBoot2.6.x 和Swagger2 存在兼容性问题,此时有两种选择:

    ​ 4.1.注释掉Swagger,和他的启动注释(Shift+Ctrl+R),注意下面这个 }) 别漏了
    在这里插入图片描述
    在这里插入图片描述

​ 4.2在使用了Swagger功能的模块yml文件中添加依赖

spring:
  #解决SpringBoot2.6.x与swagger2的版本冲突问题
  mvc:
    pathmatch:
      matching-strategy: ANT_PATH_MATCHER
  1. 解决循环依赖问题
spring:
 #解决循环依赖
  main:
    allow-circular-references: true
  1. 测试

    6.1.保证本地 redis已启动,本地msyql中有对应的数据库,连接的地址都是 localhost 下的服务

注:启动redis:直接在redis文件目录下点击redis-server.exe即可,若是redis 5.x版本或是点击服务启动后cmd窗口一闪而过,需要点击redis-cil.exe启动redis 客户端 输入命令 shutdown 后,redis服务端才可正常启动

在这里插入图片描述

​ 6.2.此时在利用右边maven父模块中点击 clean 然后 install 打包,之后去本地的target目录下 cmd ,然后以下执行命令测试一下程序正确性

# 在对应的文件下执行下面命令能运行Java程序
java -jar qzhou-blog.jar
java -jar qzhou-admin.jar

在这里插入图片描述

  1. 以上测试程序正确的话,将 localhost 全部替换为自己的服务器公网IP(我的是43.143.200.250),然后在设置一下服务器上的MySQL 和Redis 密码,然后在打包成 jar 文件 (打包完成后我的前台后后台的jar包大小相等)

注:

  • Idea 全局替换的快捷键是 Shift+Ctrl+R ;
  • 此时可以先设置密码然后再去修改服务器上配置文件,注意密码保持一样即可

前端项目打包

  1. 把sg-blog-vue(前端前台)项目的config目录下的index.js文件,port属性值设置为8093

    在这里插入图片描述

  2. 把sg-vue-admin(前端后台)项目下的vue.config.js文件的port值设置为8094

  1. 修改四个文件下的 VUE_APP_BASE_API 为自己对应的服务器IP+与后端对接的端口 8989

    在这里插入图片描述

  2. 把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
  1. 把sg-vue-admin\src\main.js文件,注释掉下面的内容

在这里插入图片描述

  1. 全局搜索(可用Idea打开)将剩下的localhost 替换为自己的IP(43.143.200.250)

  2. 打开控制台执行下面命令即可生成dist 文件

前端前台 qzhou-blog
npm run build

前端后台 qzhou-admin
npm run build:prod

服务器下

  1. 开放防火墙

    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd --zone=public --add-port=7777/tcp --permanent
    firewall-cmd --zone=public --add-port=8989/tcp --permanent
    firewall-cmd --zone=public --add-port=6379/tcp --permanent
    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --zone=public --add-port=8093/tcp --permanent
    firewall-cmd --zone=public --add-port=8094/tcp --permanent
    
    #重启防火墙
    systemctl restart firewalld.service
    
    #查看端口是否开放命令
    firewall-cmd --zone=public --query-port=8093/tcp
    
  2. 配置安全组规则,开放安全组(腾讯云为例)
    在这里插入图片描述

在这里插入图片描述

Docker容器中

  1. docker 安装和配置和阿里云镜像加速
黑马2023飞书文档:
https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d?chunked=false
  1. 拉取所需镜像
docker pull java:8
docker pull mysql:8.0.19
docker pull redis:6.0.8
docker pull nginx:1.18.0
  1. 编写Dockerfile文件,把 jar 包构建成镜像

    3.1.首先创建目录存放jar 包 ,如在root下创建 blog ,把后端生成的jar 包传进来

    3.2.编写Dockerfile文件,这里我们两个jar包分别打成两个镜像,因为一个目录下只能有一个Dockerfile文件,所以当构建完第一个镜像之后修改对应的Dockerfile文件

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


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

    docker build -t qzhou-blog:1.0 .
    
    命令说明:
    - docker build : 就是构建一个docker镜像
    - -t  qzhou-blog:1.0 :-t参数是指定镜像的名称(repository和tag)
    - . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:
    
    # 此时用不到但是可能用到的命令
    # 直接指定Dockerfile目录命令
    docker build -t docker-demo:1.0 /root/demo
    #删除指定镜像 加 -f 表示强制删除
    docker rmi -f  qzhou-blog:1.0
    

    4.1.检查一下,此时应该生成了jar 包对应的两个镜像文件

    # 查看镜像列表:
    docker images
    
  2. 使用Docker-compose容器编排,创建容器

    5.1.编写docker-compose.yml文件,使用docker-compose容器编排管理容器运行

# 最终版 Docker Compose 文件

version: "3"  

services:
  qzhou-blog:
    image: qzhou-blog:1.0
    container_name: qzhou-blog
    ports:
      - "7777:7777"
    volumes:
      - /root/blog/qzhou-blog:/data/qzhou-blog
    networks: 
      - blog_network
    depends_on: 
      - redis
      - mysql
      - nginx

  qzhou-admin:
    image: qzhou-admin:1.0
    container_name: qzhou-admin
    ports:
      - "8989:8989"
    volumes:
      - /root/blog/qzhou-admin:/data/qzhou-admin
    networks:
      - blog_network
    depends_on:
      - redis
      - mysql
      - nginx
     
  redis:
    image: redis:6.0.8
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - /root/blog/redis/redis.conf:/etc/redis/redis.conf
      - /root/blog/redis/data:/data
    networks: 
      - blog_network
    command: redis-server /etc/redis/redis.conf
 
  mysql:
    image: mysql:8.0.19
    container_name: mysql
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: zhouq
    ports:
      - "3306:3306"
    volumes:
      - /root/blog/mysql/db:/var/lib/mysql
      - /root/blog/mysql/conf/my.cnf:/etc/my.cnf
      - /root/blog/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - blog_network
    command: --default-authentication-plugin=mysql_native_password

  nginx:
    image: nginx:1.18.0
    container_name: nginx
    ports:
      - "80:80"
      - "8093:8093"
      - "8094:8094"
    volumes:
      - /root/blog/nginx/html:/usr/share/nginx/html
      - /root/blog/nginx/logs:/var/log/nginx
      - /root/blog/nginx/conf:/etc/nginx
    networks:
      - blog_network
#创建自定义网络   
networks: 
   blog_network: 

5.2.检查当前目录下compose.yml文件是否有语法错误 ; 可以使用在线yml文档检验器查询语法是否正确(如 https://www.bejson.com/validators/yaml_editor/)

docker compose config -q

5.3.启动所有docker-compose服务并后台运行

# -d 后台运行
docker compose up -d
# 此时用不到但是可能用到的命令
#删除指定容器命令
docker rm nginx
#停止并删除现有的冲突容器:
docker stop nginx && docker rm nginx

查看容器信息

docker ps -a

在这里插入图片描述

  1. 配置nginx

    6.1.首先创建一个nginx容器,只是为了复制出配置

# 1.运行容器
docker run -p 80:80 --name nginx -d nginx:1.18.0

# 2.将容器内的配置文件拷贝到当前目录/blog中:
docker container cp nginx:/etc/nginx .
# 3.将文件nginx修改为conf
mv nginx conf
# 4.创建文件夹nginx
mkdir nginx
# 5.将conf目录拷贝到nginx目录
cp -r conf nginx/
# 6.删除conf目录
rm -rf conf
# 3.停止并删除容器
docker stop nginx && docker rm nginx 
  1. 配置MYSQL

    7.1.使用远程连接软件(如Navicat)连接容器内数据库

    7.2.创建数据qz_blog(与后端程序yml文件中配置的保持一致)

    7.3.导入Sql 文件

  2. 配置Redis

    8.1.获取redis对应版本的配置文件 : 因为docker拉取的redis镜像是没有redis.conf文件的。因此,就需要我们官网上找一个相对应版本的的redis.conf配置文件。redis配置文件官网 https://redis.io/docs/manual/config/

    在这里插入图片描述

    8.2.进入/root/blog/redis目录下创建一个redis.conf文件,然后将redis配置文件内容粘贴进去

    修改redis密码:

    在这里插入图片描述

​ 修改bind为0.0.0.0(任何机器都能够访问)

在这里插入图片描述

​ 为了避免和docker中的-d参数冲突,将后台启动设置为no(daemonize no)

在这里插入图片描述

​ 关闭保护模式(protected-mode no)

在这里插入图片描述

  1. 测试后端端口

    9.1.重启现在未启动的容器实例,STATUS !=exited 就行,下面这是启动了

    #这里默认是容器ID 如果上面docker-compose.yml 配置了 container_name: nginx 那就是
    docker restart nginx
    

    在这里插入图片描述

    9.2.查看程序运行日志

#查看指定容器qzhou-admin运行日志 加 -f 参数就是持续查询
    docker logs -f qzhou-admin 
  1. 前端dist文件放入容器内的nginx

​ 10.1.前端项目放入本地nginx测试

​ 10.2.将打包好后的两个dist文件夹重命名发送到 /root/blog/nginx/html 目录下

​ 10.3.修改conf目录下的nginx.conf配置文件 ,在http{} 下添加

  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;
                   }

        }

​ 10.4.重启nginx

docker restart nginx
  1. 成功截图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

后言

(后端)程序代码错误或后续升级重新部署流程:

  1. 停止并删除已有容器

    # 如qzhou-blog
    docker stop qzhou-blog && docker rm qzhou-blog
    # 查看容器
    docker ps -a
    
  2. 删除错误镜像

    docker rmi -f qzhou-blog
    
  3. 本地生成 jar 包并传入服务器指定目录下(与DockerFile一级目录)

  4. 生成新的镜像

    docker build -t qzhou-blog:1.0 .
    
  5. 构建容器

    docker compose up -d
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 通过Docker部署个人博客可以非常方便地搭建一个WordPress网站。首先,你需要安装Docker和配置镜像加速器。接下来,你可以按照以下步骤进行部署: 1. 安装Docker服务包和启动Docker服务。 ``` # yum install docker-ce -y # systemctl start docker # systemctl enable docker # systemctl status docker ``` 2. 下载WordPress和MariaDB镜像。 ``` # docker pull wordpress # docker pull mariadb ``` 3. 启动MariaDB数据库容器。 ``` # docker run --name mariadb -v /my/custom:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=111111 -d mariadb:latest ``` 4. 启动WordPress博客网站容器。 ``` # docker run --name wordpress --link mariadb:mysql -p 8080:80 -d wordpress ``` 这样,你就成功地部署了一个个人博客网站。可以通过访问 http://localhost:8080 来查看你的网站。请确保你已经安装了Docker Compose并按照上述步骤进行配置,因为我们使用的是Docker Compose来实现部署123 #### 引用[.reference_title] - *1* *3* [教你分钟用docker compose搭建一个自己的个人博客网站](https://blog.csdn.net/a779868946/article/details/106771220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [实验6:Docker容器部署个人博客网站以及个人云盘](https://blog.csdn.net/weixin_40806003/article/details/103810054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值