Docker部署前后端分离项目

news2025/1/3 1:20:08

✅作者简介:大家好,我是Cisyam,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Cisyam-Shark的博客
💞当前专栏: 项目部署
✨特色专栏: MySQL学习
🥭本文内容:Docker部署前后端分离项目
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: 知识库,欢迎大家访问

Docker环境安装

Centos安装Docker

1.1 卸载(可选)

如果之前安装过旧版本的Docker,可以使用下面命令卸载:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

1.2 安装Docker

  1. 如果使用的是虚拟机,首先需要虚拟机联网 安装yum工具
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken
  1. 更新本地镜像源并设置Docker镜像源
# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast
  1. 输入命令,安装Docker
yum install -y docker-ce

**docker-ce为社区免费版本。稍等片刻,docker即可安装成功。 **

1.3 启动Docker

  1. 启动docker前,一定要关闭防火墙 (这里如果使用的是云服务器可以不用设置)
# 关闭
systemctl stop firewalld

# 禁止开机启动防火墙
systemctl disable firewalld

#查看是否关闭防火墙
systemctl status firewalld

  1. 通过命令启动docker
# 启动docker服务
systemctl start docker

# 停止docker服务
systemctl stop docker 

# 重启docker服务
systemctl restart docker  

其他服务安装

:::info
部署若依前后端分离版 需要安装MySQL、Redis、Nginx
:::

Dcoker安装MySQL

拉取镜像

docker pull mysql:8.0

查看是否拉取成功

docker images

如下便是拉取成功
image.png

创建文件夹(配置、数据等)

mkdir -p /work/docker/mysql/conf
mkdir -p /work/docker/mysql/data
mkdir -p /work/docker/mysql/log

创建配置文件

创建文件:/work/docker/mysql/conf/my.cnf
命令: touch /work/docker/mysql/conf/my.cnf

内容如下:

[client]
default-character-set=utf8mb4
 
[mysql]
default-character-set=utf8mb4
 
[mysqld]
#服务端口号 默认3306
port=3306
 
datadir = /work/docker/mysql/data
 
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
 
# 最大连接数
max_connections=200
 
# 连接失败的最大次数。防止有人从该主机试图攻击数据库系统
max_connect_errors=20
 
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

启动容器

docker run -p 3306:3306  \
--name mysql8 \
--privileged=true \
-v /work/docker/mysql/log:/var/log/mysql \
-v /work/docker/mysql/data:/var/lib/mysql \
-v /work/docker/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0

:::info
–privileged=true
设置MySQL 的root用户权限, 否则外部不能使用root用户登陆。
-e MYSQL_ROOT_PASSWORD=123456
设置MySQL数据库root用户的密码
:::

查看启动后的容器

docker ps

image.png

设置密码等

:::info
实际原来的root仍然有效,只不过只能localhost机器能用(在MySQL服务器上的mysql命令直连时可以使用)Navicat不能用。
:::

1.进入容器内部
docker exec -it mysql8 /bin/bash
2.连接mysql
mysql -u root -p

image.png
输入前边设置的密码:root,然后回车。

3.修改访问主机以及密码

设置为所有主机可访问

ALTER USER 'root'@'%' IDENTIFIED BY '新密码';

Mysql8.0 默认采用 caching-sha2-password 加密,有可能旧的客户端不支持,可改为 mysql_native_password;

CREATE USER 'root'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY '222333';
4.刷新权限
FLUSH PRIVILEGES;

完工!!!

Docker安装Redis

1. 拉取redis镜像
# 不指定版本号,默认拉取最新版的redis 
docker pull redis
# 指定的版本号 docker pull redis:5.0.14
# 查看镜像是否拉取成功docker images

2. 运行redis
# 带密码认证的redis,登录时需要输入验证码  appendonly(redis是否持久化)
docker run --name redis -p 6379:6379 -d --restart=always redis redis-server --appendonly yes --requirepass cisyam

# 不带密码认证的redis
docker run --name redis -p 6379:6379 -d --restart=always redis redis-server --appendonly yes

Docker安装Nginx

# 拉取nginx
docker pull nginx:1.18

# 挂载文件 本地路径
mkdir	-p /home/nginx/conf
mkdir	-p /home/nginx/log
mkdir	-p /home/nginx/html
# 挂载
# 生成容器
docker run --name nginx -p 80:80 -d nginx:1.18
docker run --name nginx -p 100:80 -d nginx:1.18

# 将容器nginx.conf文件复制到宿主机
# 将容器conf.d文件夹下内容复制到宿主机
# 将容器中的html文件夹复制到宿主机

docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
docker cp nginx:/usr/share/nginx/html /home/nginx/
#卸载
docker rm -f nginx
#真实安装
docker run \
-p 80:80 \
--name nginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:1.18
——————————————————————————————
docker run \
-p 100:80 \
--name nginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:1.18

部署若依

2.1 下载若依源码

若依前后端项目地址:https://gitee.com/y_project/RuoYi
将项目下载或者git clone到本地并解压
ruoyi-ui文件夹是前端项目,其余为后端项目

2.2 远程连接服务器

这里我使用的是FinalShell,具体连接操作步骤 这里不做叙述

2.3 若依前端部署

打开dos窗口,进入ruoyi-ui文件夹,并对前端代码进行打包,生成一个dist文件夹,这就是前端代码打包后的文件

npm install --unsafe-perm --registry=https://registry.npm.taobao.org
npm run build:prod

也可以进入ruoyi-ui -> bin目录中 双击鼠标运行build.bat文件
将dist文件夹通过FinalShell上传到/home/nginx/html中
进入/home/nginx/conf/conf.d目录中,新建cisyam-ui.conf,添加以下内容
image.png

server {
    listen       80;
    listen  [::]:80;
    server_name  110.42.223.238;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

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

  location /prod-api/{
	    proxy_set_header Host $http_host;
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header REMOTE-HOST $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    proxy_pass http://110.42.253.238:8686/;
	 }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

打开谷歌浏览器,输入ip地址访问
image.png

2.4 若依后端部署

  1. 导入若依数据库

  2. 修改项目中ruoyi-admin中的application.yml,application-druid.yml两个文件
    (1)在application.yml中,修改redis的信息,分别为host地址(你的服务器ip),port端口号(你的redis开放的端口号,一般为6379),password密码(你的redis的密码)。
    (2) 在application-druid.yml中,修改mysql的信息,url的中间填写访问mysql的 ip:端口号,例如:114.115.164.15:3306;username填你的mysql用户名;password填你的mysql密码。

  3. 尝试运行后端项目可以通过InteliJ IDEA或者eclipse软件来运行这个java后端项目,前提是你运行的本机上应该也具备一定的环境,jdk至少是1.8,以及本地8080端口(用于后端)已开启且未被占用。其他的例如mysql,redis可以直接通过服务器ip+端口号远程访问,不需要在本机上配置。
    出现下方图片所示LOGO表示启动成功,可以开始打包后端代码。如果未成功,检查报错,查看是否关于mysql,redis的(如果是,则可能是这两个没有在你的服务器上配置好或者刚才修改的信息出错了,例如账号,密码不对,或者远程连接未成功,导致本机无法远程访问等等),如果是关于8080端口,可能是由于你本机有程序以及占用了8080端口,这个基本上就不是什么问题,部署到服务器后只要服务器8080端口可用就行。接下来可以直接打包代码。

  4. 打包后端代码jar包
    熟练java项目开发的,可以直接通过InteliJ IDEA或者eclipse软件打jar包。不熟悉的有第二种方法,是若依提供的。进入下载的项目文件夹中的bin目录下,直接双击执行package.bat,它会直接在项目中生成target文件夹,里面包含以及打包好的jar包。我们要使用的是ruoyi-admin文件夹下的target里的jar包。运行package.bat需要marven环境>=3.0,操作顺序如下图:


image.png

  1. 将打包好的jar包通过FinalShell上传至/opt/project 目录(project目录需要自己手动创建)
  2. 编写DockerFile 文件
vim Dockerfile

DockerFile文件和jar包放在同一目录下

  1. 将项目挂载到docker镜像中 后面有个点. 千万不要忘记复制
docker build -t cisyam-admin.jar .
  1. 运行docker镜像
docker run -d -p 8686:8686 --name cisyam-admin.jar cisyam-admin.jar
  1. 成功部署效果图
    image.png

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

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

相关文章

K8s生产环境常见问题处理、答疑(连载、不定期更新)

文章目录 K8s 常见问题处理、答疑[1] calico一直处于未就绪状态[2] 删除dashboard 一直卡在delete[3] k8s-dashboard 修改tocken-ttl避免频繁输入tocken[4] kubectl 快捷指令[5] 解决UTC时间问题[6] kubectl命令自动补全[7] kubectl exec进入pod[8] 使用hostpath解决容器UTC时间…

LibreOffice 在win11(高版本win10)无响应的解决方案

问题描述 某次windows升级了以后,LibreOffice无法启动无响应、无报错 解决 安全模式启动 然后禁用显卡加速 然后:应用更改并重新启动 即可以正常模式启动LibreOffice

ARP协议(地址分析协议)

系列文章目录 数通王国历险记(4) 目录 前言 一,什么是地址解析协议(ARP) 二,封装和解封装 三,为什么需要地址解析协议(ARP) 四,ARP的验证实验 4.1&#x…

MySQL 学习笔记 4:视图

MySQL 学习笔记 4:视图 图源:ubiq.co 简单的说,视图就是“固化的SQL查询”。 这里看一个简单示例,我们有一个表,保存学生信息: mysql> select * from student limit 10; ---------------------------…

利用电价运行策略研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

外观模式:简化复杂系统的访问接口

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问复杂系统中的一组接口。本文将深入探讨外观模式的原理、结构和使用方法,并通过详细的 Java 示例代码来说明。 1. 外观模式的定义 外观模式是一种通过提供一个简化的接口&…

LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

springboot项目报错如下: 这个错误是由于在你的Java代码中使用了Logback日志库,但是同时又存在与Logback竞争的其他日志库(例如slf4j-simple)导致的冲突。 要解决这个问题,你可以尝试以下几个步骤: 1. 检…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网?网关地址是谁定的,是配置路由的人随意定的吗?(配置人员定的)如何正确设置网关地址(路…

WPF 如何引入图标文件

文章目录 前言:WPF 引入图标什么是ttf字体阿里云矢量库下载WPF引用为什么文件路径是#iconfont而不是iconfont。前面为什么要带个#号? 前言: 我最近在研究WPF,吃饭嘛,桌面端实在是不想用Winform,太丑了。WP…

WebDAV之π-Disk派盘+Notability

Notability 支持WebDAV方式连接π-Disk派盘。 Notability是一款功能强大的数字笔记应用,适用于iOS和macOS。它提供了优秀的手写体验,支持手写、录音和多种标记。用户可以记录想法、思路、绘图和草图,进行注释和标记,实现高效的学习和创作。同时,Notability具有文本输入、…

16 Java获取随机数

使用new Random创建一个随机数对象,然后调用里面的nextInt方法,方法中传入一个数字n,则随机数的范围为[0,n)。代码如下: package demo;import java.util.Random;public class Demo10 {public static void main(String…

xilinx zc706 以太网性能测试(iperf)

一:概述 以太网流量测试是一种评估网络性能和容量的测试方法。它通过模拟实际网络环境中的数据流量,以确定网络在高负载情况下的表现。 在以太网流量测试中,可以使用各种工具和技术来生成和控制数据流量。这些工具可以模拟不同类型的流量&a…

C#基础学习_集合中对象的动态排序

C#基础学习_集合中对象的动态排序 上一期我们了解了Icompare这种默认的排序方法,本次我们学习一下比较器ICompare的应用(可以替代Icompare这种默认的排序方法) 因为默认排序,只能有一种,使用起来可能会有局限性。 此时需要添加比较器: 根据需要,在需要实现动态排序的类…

生产管理“看得见“,这些车间工具必不可少!

工厂可视化是精益管理的重要组成部分,可视化的工厂管理可以从侧面提高员工精益生产的意识,那么工厂车间哪些方面可以做可视化管理呢? 目视化管理包括了三个内容: 1、管理规则的目视化:如通道线、安全警示、作业指导书…

掌握AI图像篡改检测工具,轻松识别图片造假

文章目录 一、前言1.1 背景与危害1.2会议探讨1.3 技术先行 二、亮点技术1:AI图像篡改检测技术2.1 传统方法Python实现步骤2.2 合合信息——PS纂改检测体验 三、亮点技术2:生成式图像鉴别3.1 生成式图像安全问题3.2 传统方法Python实现步骤3.2 合合信息—…

力扣 376. 摆动序列

题目来源:https://leetcode.cn/problems/wiggle-subsequence/description/ C题解1:使用flg标记第一个是增还是减,如果是平,则直接返回1;根据标记的flg,不断更新顶峰值和谷底值,直到最高或者最低…

LabVIEW使用数据引用减少内存

概览 NI LabVIEW 省略了 开发 软件时 需要 手动 管理 内存。LabVIEW 编译器 始终 会 分析 您 的 代码, 以 确定 如何 优 化 性能 并 减少 所需 的 内存 量。但是, 想要 更多 控制 内存 分配 的 高级 用户 可以 在 LabVIEW 2009 中创建 数据 引用。 内容…

记录一些杂七杂八的数据分析

1、数据库的独立性 --模式与内模式的映射 保证数据库物理结构的独立性 --模式与外模式的映射 保证数据库逻辑结构的独立性 2、常见的数据库 Oracle数据库,SQL Server数据库,MySQL数据库,PostgreSQL数据库。 3、数据分类 &…

day 52 子序列问题

不连续递增子序列的跟前0-i 个状态有关,连续递增的子序列只跟前一个状态有关 300. 最长递增子序列 dp[i]定义:以nums[i]结尾的最长递增子序长度递推公式:if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); num[i] 之前各个位置,如果…

[静态库和动态库][VS2022]

静态库和动态库 前言:一、静态库二、动态库三、静态库和动态库的使用 前言: 我们写代码,可以分模块去写,最后可以协作,能整合起来; 可以吧代码的实现和声明分离。 比如:我的这篇博客C语言猜拳小…