本文最后更新于 2026年6月20日 下午
关于项目的部署
前言
由于项目整体已经开发完
现在进入项目部署阶段
服务器与域名的购买
我这里是在阿里云购买的服务器(学生优惠可以白嫖)和域名
买到服务器和域名后自行备案和解析
服务器建议买Linux系统的我买的系统是CentOS 7.9 64位
在服务器安全组中给一些必要的端口放行
在系统中安装docker
在安装docker前先准备两个小软件
WinSCP, 用于和云服务器进行文件传输
WinSCP操作界面
putty, 用于与云服务器进行远程连接(终端)
putty 安装教程
putty操作界面
有了软件之后就去安装docker
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
docker version
|
出现 docker 版本号则为成功
常用的 docker 命令
查看 Docker 信息
1 2 3 4 5 6 7 8
| docker version
docker info
docker system df
|
镜像相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| docker images
docker pull nginx:latest
docker rmi nginx:latest
docker rmi -f 镜像ID
docker search mysql
docker build -t 镜像名:版本号 .
docker tag 本地镜像名:版本号 仓库地址/镜像名:版本号
docker push 仓库地址/镜像名:版本号
|
容器相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| docker ps
docker ps -a
docker start 容器名或容器ID
docker stop 容器名或容器ID
docker restart 容器名或容器ID
docker rm 容器名或容器ID
docker rm -f 容器名或容器ID
docker logs 容器名或容器ID
docker logs -f 容器名或容器ID
docker exec -it 容器名或容器ID /bin/bash
docker exec -it 容器名或容器ID /bin/sh
|
在 docker 中下载镜像
一般来说,不需要单独下载镜像
因为在运行 docker run 命令进行运行容器时
如果当前环境中没有对应的镜像则会自动先下载对应的镜像
你也可以去 Docker Hub 学习一些常用命令和下载镜像
Docker Hub
运行 docker 中的容器————前台后端部署
下面以部署我项目后端为例子
在开始前先要对后端项目进行打包
打包项目完成后会在对应路径下生成 jar 包,这是前期准备之一
然后在 docker 中创建网络 方便后续后端的容器能在同一个网络下运行
docker network create 网络名
运行 mysql 容器
有了网络之后运行 mysql 容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| docker run --restart always \ -e TZ=Asia/Shanghai \ --name yun_blog_sql \ -d \ --network blog_network \ -p 3306:3306 \ -v /home/mysql_date:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=your_password \ mysql:8.0 docker run --restart always \ -e TZ=Asia/Shanghai \ --name yun_blog_sql \ -d \ --network blog_network \ -p 3306:3306 \ -v /home/mysql_date:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=your_password \ mysql:8.0
|
然后去 WinSCP 查看对应的 /home/mysql_date 路径可以看到已经有对应的目录
这个就是用来存储和与容器里数据互通的文件目录
然后去数据库测试连接一下看通没通
在这之后你就可以把你自己的数据表导入数据库为后续做准备了
运行 redis 容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| docker run --restart always \ --name yun_blog_redis \ -d \ --network blog_network \ -p 6379:6379 \ -v /home/redis_date:/data \ redis redis-server --appendonly yes docker run --restart always \ --name yun_blog_redis \ -d \ --network blog_network \ -p 6379:6379 \ -v /home/redis_date:/data \ redis redis-server --appendonly yes
|
然后去 WinSCP 查看对应的 /home/redis_date 路径可以看到已经有对应的目录
这个就是用来存储和与容器里数据互通的文件目录
然后去 redis 测试连接一下看通没通
测试redis是否正常工作
回到 redis 看到能正常写入数据则连接成功
运行 java 容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| docker run --restart always \ -e TZ=Asia/Shanghai \ --name yun_blog_java \ -d \ --network blog_network \ -p 1314:1314 \ -v /home/yun_blog_java/mengze-blog:/yun_blog_java/mengze-blog \ openjdk:17-jdk java -jar /yun_blog_java/mengze-blog/mengze-blog-1.0-SNAPSHOT.jar \ "--spring.datasource.url=jdbc:mysql://yun_blog_sql:3306/yun_blog?characterEncoding=utf8&serverTimezone=Asia/Shanghai" \ "--spring.datasource.username=your_sql_username" \ "--spring.datasource.password=your_sql_password" \ "--spring.redis.host=yun_blog_redis" \ "--spring.mail.username=your_qq_email_username" \ "--spring.mail.password=your_qq_email_key" \ "--oss.accessKey=your_access_key" \ "--oss.secretKey=your_secret_key" \ "--oss.bucket=your_bucket_name" \ "--oss.domain=your_oss_visit_domain" \ "--aliyun.sms.access-key-id=your_access_key_id" \ "--aliyun.sms.access-key-secret=your_access_key_secret" \ "--blog.frontend.url=blog_frontend_url" \ "--weather.api.key-id=your_key_id" \ "--weather.api.project-id=your_project_id" \ "--weather.api.host=your_api_host" \ "--weather.api.private-key=your_weather_private_key" \ "--deepseek.api-key=your_deepseek_api_key"
docker run --restart always \ -e TZ=Asia/Shanghai \ --name yun_blog_java \ -d \ --network blog_network \ -p 1314:1314 \ -v /home/yun_blog_java/mengze-blog:/yun_blog_java/mengze-blog \ openjdk:17-jdk java -Xms256m -Xmx384m -jar /yun_blog_java/mengze-blog/mengze-blog-1.0-SNAPSHOT.jar \ "--spring.datasource.url=jdbc:mysql://yun_blog_sql:3306/yun_blog?characterEncoding=utf8&serverTimezone=Asia/Shanghai" \ "--spring.datasource.username=your_sql_username" \ "--spring.datasource.password=your_sql_password" \ "--spring.redis.host=yun_blog_redis" "--spring.mail.username=your_qq_email_username" \ "--spring.mail.password=your_qq_email_key" \ "--oss.accessKey=your_access_key" \ "--oss.secretKey=your_secret_key" \ "--oss.bucket=your_bucket_name" \ "--oss.domain=your_oss_visit_domain" \ "--aliyun.sms.access-key-id=your_access_key_id" \ "--aliyun.sms.access-key-secret=your_access_key_secret" \ "--blog.frontend.url=blog_frontend_url" \ "--weather.api.key-id=your_key_id" \ "--weather.api.project-id=your_project_id" \ "--weather.api.host=your_api_host" \ "--weather.api.private-key=your_weather_private_key" \ "--deepseek.api-key=your_deepseek_api_key"
|
完成这些之后去测试就可以看到spring可以跑
前面已经导入数据表,现在测试一下后端是否真正和数据库进行联动
如果测试报错,有可能是你的容器不在同一个网络中
或者你后端的一些数据库配置没设置好再打包
亦或者是你根本没有这个数据库
可以去问问ai如何解决
运行 nginx 容器(部署前后的前端)
在给前端项目打包前要注意配置好项目生产时的环境变量
要注意的是这里都加上了代理前缀
这样请求地址会是:http://yun-mi-manchi.top/api/article
然后经过 nginx 代理之后去除 /api 再发给后端 请求地址会是:http://yun-mi-manchi.top/article
后台生产环境
前台生产环境
我们要把前后台项目都部署在同一台 nginx 容器里
然后通过 nginx 转发不同的路径来实现前后台的跳转 如下:
http://admin.yun-mi-manchi ===== 跳转前台
http://admin.yun-mi-manchi/admin ===== 跳转后台
在运行容器之前先在云服务器对应路径中创建 default.conf 文件

配置default.conf
然后配置 default.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
server { listen 80; server_name yun-mi-manchi.top;
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { root /usr/share/nginx/html/blog; expires 30d; add_header Cache-Control "public, immutable"; log_not_found off; }
location / { alias /usr/share/nginx/html/blog/; try_files $uri $uri/ /index.html; }
location ^~ /api/ { proxy_pass http://你自己服务器的公网ip:1314/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
location /ws/blog { proxy_pass http://你自己服务器的公网ip:1314/ws/blog; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
client_max_body_size 50M; }
server { listen 80; server_name admin.yun-mi-manchi.top;
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { root /usr/share/nginx/html/admin; expires 30d; add_header Cache-Control "public, immutable"; log_not_found off; }
location / { alias /usr/share/nginx/html/admin/; try_files $uri $uri/ /index.html; }
location ^~ /api/ { proxy_pass http://你自己服务器的公网ip:7616/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
location /ws/admin { proxy_pass http://你自己服务器的公网ip:7616/ws/admin; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
client_max_body_size 50M; }
|
然后运行下面命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| docker run --restart always \ --name yun_blog_vue \ -d \ -p 80:80 \ -v /home/yun_blog_vue/blog/dist:/usr/share/nginx/html/blog \ -v /home/yun_blog_vue/admin/dist:/usr/share/nginx/html/admin \ -v /home/yun_blog_vue/nginx/conf.d:/etc/nginx/conf.d \ nginx docker run --restart always \ --name yun_blog_vue \ -d \ -p 80:80 \ -v /home/yun_blog_vue/blog/dist:/usr/share/nginx/html/blog \ -v /home/yun_blog_vue/admin/dist:/usr/share/nginx/html/admin \ -v /home/yun_blog_vue/nginx/conf.d:/etc/nginx/conf.d \ nginx
|
在浏览器浏览通了就是成功
后台后端部署
步骤和命令都差不多
注意开放的端口号是不同的
还有文件的目录不同(建议把不同项目放在不同目录下好区分)
还要注意你运行的 jar 包名和路径是否正确
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| docker run --restart always \ -e TZ=Asia/Shanghai \ --name yun_blog_admin_java \ -d \ --network blog_network \ -p 7616:7616 \ -v /home/yun_blog_java/mengze-admin:/yun_blog_java/mengze-admin \ openjdk:17-jdk java -Xms256m -Xmx384m -jar /yun_blog_java/mengze-admin/mengze-admin-1.0-SNAPSHOT.jar \ "--spring.datasource.url=jdbc:mysql://yun_blog_sql:3306/yun_blog?characterEncoding=utf8&serverTimezone=Asia/Shanghai" \ "--spring.datasource.username=your_sql_username" \ "--spring.datasource.password=your_sql_password" \ "--spring.redis.host=yun_blog_redis" \ "--spring.mail.username=your_qq_email_username" \ "--spring.mail.password=your_qq_email_key" \ "--oss.accessKey=your_access_key" \ "--oss.secretKey=your_secret_key" \ "--oss.bucket=your_bucket_name" \ "--oss.domain=your_oss_visit_domain" \ "--aliyun.sms.access-key-id=your_access_key_id" \ "--aliyun.sms.access-key-secret=your_access_key_secret" \ "--blog.frontend.url=blog_frontend_url" \ "--weather.api.key-id=your_key_id" \ "--weather.api.project-id=your_project_id" \ "--weather.api.host=your_api_host" \ "--weather.api.private-key=your_weather_private_key" \ "--deepseek.api-key=your_deepseek_api_key"
|
需要注意的是
上面这两个后端部署的例子是极度不安全的
因为把密钥这些敏感信息全部暴露出去了
别人只要能登上你的服务器
运行 docker ps
就可以看到所有配置和敏感信息
关于这个
后续有解决方法
PS:该系列只做为作者学习开发项目做的笔记用
不一定符合读者来学习,仅供参考
预告
后续会记录博客的开发过程
每次学习会做一份笔记来进行发表
“一花一世界,一叶一菩提”
版权所有 © 2026 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/