qidao123.com技术社区-IT企服评测·应用市场
标题:
服务器上使用docker部署项目
[打印本页]
作者:
tsx81429
时间:
2025-3-28 11:09
标题:
服务器上使用docker部署项目
步骤说明
1、明确全部要安装的内容
我的mysql版本为8.0,redis版本为7.4.2(要将redis数据迁徙的版本号必须兼容,不然dump.rdb无法加载)、jdk17和nginx1.24.0
2、准备一台服务器(我用的是阿里云的服务器)
3、修改设置文件信息:nginx.conf,application.yml,vue.config.js以及代码中有涉及到静态资源的地方:
解释
:将localhost改为对应容器名指的是等等创建容器的时候需要将各个容器放在同一个网络下,容器之间的通讯可通过容器名访问(类似于域名剖析)
使用maven命令clean->package打包target文件夹,天生.jar文件
在前端项目根目录下使用npm run build命令打包dist文件夹
Dockerfile:
# 选择 JDK 17 官方镜像作为基础镜像
FROM openjdk:17-jdk-slim AS build
# 图形验证码需要额外安装库
RUN apt-get update && apt-get install -y \
libfontconfig1 \
libx11-dev \
libxext6 \
libxrender1 \
libxtst6 \
xfonts-base \
xfonts-75dpi
# 设置工作目录
WORKDIR /app
# 将项目的 jar 文件复制到容器中的 /app 目录(前面目录表示服务器目录,后面的目录表示容器中对应的目录)
COPY springboot_game-0.0.1-SNAPSHOT.jar /app/springboot_game-0.0.1-SNAPSHOT.jar
# 暴露应用运行的端口
EXPOSE 8080
# 设置环境变量
ENV SPRING_PROFILES_ACTIVE=prod
# 启动 Spring Boot 应用
ENTRYPOINT ["java", "-jar", "/app/springboot_game-0.0.1-SNAPSHOT.jar"]
复制代码
nginx.conf:
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
# Nginx请求体最大大小
# 413 Request Entity Too Large
# 默认是1M大小
client_max_body_size 40m;
server {
listen 8090;
server_name game; #对应项目的容器名
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/share/nginx/html; #对应nginx容器中html的具体存放位置(此位置为系统默认位置)
index index.html index.htm;
#解决history模式下刷新404的问题
try_files $uri $uri/ /index.html;
}
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://game:8080; #解析路径将localhost改成对应容器名
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
复制代码
application.yml:
spring:
port: 8080
address: 0.0.0.0 #表示允许所有ip访问
data:
redis:
host: redis #对应redis的容器名
database: 5 #redis所使用的数据库
password: 123456 #对应等等容器创建的时候你自己设置的密码
jpa:
hibernate:
ddl-auto: none
datasource:
url: jdbc:mysql://mysql:3306/game?characterEncoding=UTF-8 #3306前的mysql为mysql容器名
username: root
password: 123456 #对应等等容器创建的时候你自己设置的密码
driver-class-name: com.mysql.jdbc.Driver
application:
name: springboot_game
#邮箱配置
mail:
host: smtp.qq.com
username: xxxxxxxx@qq.com
password: xxxxxxxxxx
protocol: smtp
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
ssl:
enable: true
mybatis:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
my:
file_path: /home/vue/website #对应后端静态资源目录(在容器中的位置,可以自己定义位置)
复制代码
/public/config.json
game对应项目容器名)
{
"serverUrl": "http://game:8080"
}
复制代码
vue.config.js:
const { defineConfig } = require('@vue/cli-service')
const serverUrl = this.$config?.serverUrl || 'http://game:8080'; //game对应项目容器名
module.exports = defineConfig({
transpileDependencies: true,
devServer: {
port: 9090,
proxy: {
'/api': {
target: serverUrl, // 目标服务器地址
changeOrigin: true, // 是否改变源地址
pathRewrite: {
'^/api': '' // 重写路径,将/api替换为空
}
},
},
},
lintOnSave: false//关闭语法检查
})
复制代码
代码中使用到了后端静态资源的部门:
@RestController
public class MusicController {
// private static final String rootPath = "src/main/resources/static"; //原本的路径
private static String rootPath = "/home/vue/website"; // 对应application.yml里面的静态路径
@GetMapping("/music")
public ResponseEntity<Result> playMusic(){
//获取音乐文件夹中的所有.mp3文件
int size = 0;
File folder = new File(rootPath + "/music");
复制代码
4、检查版本号,迁徙数据
确认版本号之后将sql文件导出(假如redis也要数据迁徙的话需要dump.rdb文件,位置需要自己去找)
5、在服务器上安装好docker并且认识docker命令(阿里云镜像源:
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)
安装教程:https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.1.656e2f3dF0XH8e&scm=20140722.S_help@@文档@@51853._.ID_help@@文档@@51853-RL_docker安装-LOC_llm-OR_ser-PAR1_215044de17388115664018613e6320-V_4-RE_new5-P0_0-P1_0
6、将项目资源上传到服务器对应目录(使用Xftp8)
我的目录放在/home/vue下:
website文件夹
(放后端静态资源)、
Dockerfile、springboot_game-0.0.1-SNAPSHOT.jar
(对应自己的jar文件名)
在额外创建2个文件夹
nginx和redis文件夹
(用于docker的目录挂载:将容器中的对应目录映射到宿主机中的对应目录)
nginx文件夹里面
创建2个文件夹:
conf
(将nginx.conf文件放入),
html
(将dist里面的文件全部放入)
redis文件夹
里面放入
dump.rdb
文件和
redis.conf
文件(用于redis数据迁徙)
7、安装mysql和redis(注:redis要长期化需要设置redis.conf文件)
redis.conf:
################################ SNAPSHOTTING ################################
# 持久化保存策略配置
# 在900s内,如果至少有1个key进行了修改,就进行持久化操作
save 900 1
# 在300s内,如果至少有10个key进行了修改,就进行持久化操作
save 300 10
# 在60s内,如果至少有10000个key进行了修改,就进行持久化操作
save 60 10000
# 配置如果持久化出错,Redis是否禁止写入命令 yes:禁止写入命令,no:允许写入命令(存在数据丢失风险)
stop-writes-on-bgsave-error yes
# 配置是否压缩rdb文件。[开启(yes)的话,会消耗一定的cpu资源]
rdbcompression yes
# 保存rdb文件的时候,进行错误的检查校验
rdbchecksum yes
# 默认持久化保存后的文件名
dbfilename dump.rdb
# rdb文件保存的目录
dir /data
# 设置访问、登录的密码,设置requirepass 您的密码
requirepass wuxinye38
############################## APPEND ONLY MODE ###############################
# 是否开启aof持久化模式,默认值:no,不开启。redis的默认持久化策略是edb模式
appendonly yes
# 持久化文件名称
appendfilename "appendonly.aof"
# 持久化策略设置
# appendfsync always # 每次修改都进行持久化操作
appendfsync everysec # 每秒执行一次持久化操作
# appendfsync no # 不执行持久化操作,相当于未开启aof持久化策略
# 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes
no-appendfsync-on-rewrite yes
# AOF自动重写配置,默认值为100
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# Redis在以AOF方式恢复数据时,对最后一条可能出问题的指令的处理方式,默认值yes
aof-load-truncated yes
# 当重写AOF文件时,Redis能够在AOF文件中使用RDB前导码,以便更快地重写和恢复,启用此选项时,重写的AOF文件由两个不同的节组成:[RDB file][AOF tail],当加载AOF文件时,Redis通过以 “REDIS” 字符串开头的AOF文件识别出此文件是由RDB和AOF组合而成的,Redis会先加载RDB部分,然后再加载AOF部分,默认值yes
aof-use-rdb-preamble yes
################################### CLIENTS ####################################
# 设置客户端最大连接数,该配置一般无需修改,使用默认值即可
# maxclients 10000
############################## MEMORY MANAGEMENT ################################
# redis最大内存容量
maxmemory 1gb
# 内存策略
maxmemory-policy volatile-lru
复制代码
注意
:安装多个容器需要创建一个网络用语容器间通讯(名字自定):docker network create mynet
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=game -p 3306:3306 -d --network mynet mysql:8.0
docker run --name redis -d -e REDIS_PASSWORD=123456 --privileged=true -p 6379:6379 -v /home/vue/redis:/data -v /home/vue/redis/redis.conf:/usr/local/etc/redis/redis.conf --network mynet redis:7.4.2
复制代码
通过docker ps命令检查容器是否启动成功
mysql启动成功跋文得在主机上毗连上并且运行sql文件
注意
:假如mysql使用老版本的navicat,使用navicat毗连会报错,需要进入容器内部的mysql修改暗码:
docker exec -it mysql bash
mysql -u root -p
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'
复制代码
修改成功后输入两次exit退出mysql之后在退出容器内部
8、编译Dockerfile文件,启动项目
进入到存放Dockerfile文件的目录下,运行命令docker build -t game .
启动项目,运行命令docker run -d --name game -p 8080:8080 -v /home/vue/website:/home/vue/website --network mynet game
9、安装并启动nginx
docker run -d -p 8090:8090 --name nginx -v /home/vue/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/vue/nginx/html:/usr/share/nginx/html --network mynet nginx:1.24.0
10、通过ip:端口号访问项目网站
使用docker ps查看全部容器是否启动成功
假如有容器启动失败使用docker logs 容器名查看错误日记
访问网站,部署成功
每次重启服务器的时候通过docker start 容器名启动项目,通过docker stop 容器名关闭容器
下篇链接:
服务器使用docker-compose一键部署项目
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4