1.准备工作
使用maven打包springboot项目为.jar文件得到springboot-0.0.1-SNAPSHOT.jar
打包vue项目
npm install -g @vue/cli安装Vue CLI
在项目根目录下,运行npm run build命令来构建项目得到一个dist文件夹
将打包好的文件通过远程仓库中转至docker虚拟机
在虚拟机拉取镜像,并将docker12-2的内容复制(cp 命令)给我的部署项目my-project
2.部署前端到nginx docker中
将dist.zip解压放于my-project/frontend下,编写Dockerfile
FROM nginx:latestCOPY ./dist /usr/share/nginx/htmlCOPY ./nginx.conf /etc/nginx/conf.d/default.confEXPOSE 80
创建一个名为 nginx.conf 的配置文件
server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;try_files $uri $uri/ /index.html;}# 代理 API 请求location /api {proxy_pass http://192.168.88.3:8080; # 替换为你的 API 服务器地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
构建和运行 Docker 容器
docker build -t my-vite-app .(my-vite-app:自定义前端镜像名)
运行并查看镜像
docker run -d -p 8080:80 my-vite-app
在火狐浏览器中输入http://localhost:8080或http://192.168.88.3:8080跳至如下的登录界面
3.部署后端
将springboot-0.0.1-SNAPSHOT.jar放于my-project/backend下,编写Dockerfile
# 使用官方 OpenJDK 作为基础镜像FROM openjdk:20-jdk-sli# 设置工作目录WORKDIR /app# 复制项目的 JAR 文件到容器中COPY ./springboot-0.0.1-SNAPSHOT.jar app.jar# 暴露应用运行的端口EXPOSE 8080# 运行 Spring Boot 应用ENTRYPOINT ["java", "-jar", "app.jar"]
构建
docker build -t my-springboot-app .
# 创建网络docker network create my_network
注意:使用 Docker 网络连接
在 Docker 中运行多个容器时,建议使用 Docker 网络来确保它们可以相互通信。我已经创建了一个名为 my_network
的网络,确保我的 MySQL 、 my-springboot-app容器在同一个网络中运行,方便通信
运行
docker run -d -p 8090:8080 --network my_network my-springboot-app
4.部署mysql8
docker run --name mysql8 \-e MYSQL_ROOT_PASSWORD=mysql --network my_network \-e MYSQL_ROOT_HOST='%' \-p 3306:3306 \-v /root/xr/java/data:/var/lib/mysql \-d mysql:8.0.40 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_unicode_ci \--default-authentication-plugin=mysql_native_password
查看构建容器成功
输入http://192.168.88.3:8090验证后端部署成功,因为还没创数据,所以显示数据为空
使用mysql容器创建对应数据库
进入mysql容器
docker exec -it mysql8 bash
登录MySQL
mysql -u root -p
创建数据库为docker_demo
创建表名为member
create database docker_demo;use docker_demo;-- 创建成员表
DROP TABLE IF EXISTS `member`;
CREATE TABLE member (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',studentId VARCHAR(50) UNIQUE NOT NULL COMMENT '学号',name VARCHAR(100) NOT NULL COMMENT '姓名',password VARCHAR(255) NOT NULL COMMENT '密码') COMMENT='成员信息表';
INSERT INTO member (studentId, name, password) VALUES ('11111111', '111', '123456');
5.遇到的问题
浏览器输入http://192.168.88.3:8090,结果为{"code":"200","msg":"请求成功","data":null}
问题分析:使用curl -X GET http://192.168.88.3:8090/member/selectAll验证,得到
{"code":"500","msg":"请求失败","data":null} 意思是服务器请求失败。我使用docker logs命令查看部署过程,发现MyBatis 在尝试执行数据库操作时遇到了异常,我看了后端代码和部署步骤,发现后端数据库连接用的是本地MySQL
,而我部署用的是MySQL容器(也就是说我的本地并没有MySQL),导致我的springboot找不到数据库,自然没有数据,请求也不会成功。
解决方案:更新springboot代码,重新打包,重复部署操作。
解决步骤:
1.更新数据库连接 URL
在您的 Spring Boot 应用中,您需要将数据库连接 URL 更新为 MySQL 容器的名称,而不是使用 localhost
。在 Docker 中,容器的名称可以用作主机名。
2. 重新构建并运行后端应用
使用docker stop,docker rm ,docker rmi删除旧容器和旧镜像(内容太多,未截图)
重新构建运行
docker build -t my-springboot-app .
docker run -d -p 8090:8080 --network my_network my-springboot-app
浏览器输入http://192.168.88.3:8090/member/selectAll
表示后端与数据库部署成功
注意:本身步骤是没有错的,如果结果不如意,可以检查ip地址,我这里用的地址基本都是本地主机,如果你需要改其他主机,请相应地修改;另外注意后端数据库的密码与前端是否匹