Docker部署前后端分离项目

镜像下载

在有网络的电脑下载镜像(Windows):依次在CMD命令台执行以下代码

docker pull node:20

docker pull openjdk:22-jdk

docker pull mysql:8.0

docker pull nginx:1.27

删除镜像代码:

docker rmi node:latest

查看镜像列表代码:

docker images

测试镜像代码:

docker run --rm openjdk:22-jdk java -version

 检查容器状态(包括已停止的):

docker ps -a

镜像导出

docker save -o node-20.tar node:20

docker save -o mysql-8.0.tar mysql:8.0

docker save -o openjdk-22-jdk.tar openjdk:22-jdk

docker save -o all-images.tar node:20 mysql:8.0 openjdk:22-jdk

镜像导入 

docker load -i node-20.tar

docker load -i mysql-8.0.tar

docker load -i openjdk-22-jdk.tar

项目部署 

后端:

FROM openjdk:22-jdk
WORKDIR /app
COPY platFormBack-0.0.1-SNAPSHOT.jar .
EXPOSE 8580
ENTRYPOINT ["java", "-jar", "platFormBack-0.0.1-SNAPSHOT.jar"]

前端:  

FROM nginx:1.27
RUN rm -rf /etc/nginx/conf.d/*
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY dist /usr/share/nginx/html
EXPOSE 9877
CMD ["nginx", "-g", "daemon off;"]
server {
    listen 9877;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.html index.htm;
    location / {
        try_files $uri $uri/ /index.html;
    }
}

docker-compose.yml: 

version: "3.8"

services:
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    container_name: frontend_container
    ports:
      - "9877:9877"
    restart: always

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: backend_container
    ports:
      - "8580:8580"
    restart: always
    
  mysql:
    image: mysql:8.0
    container_name: mysql_container
    ports:
      - "3307:3306"  # 宿主机3307 → 容器3306
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - mysql_data:/var/lib/mysql
      
volumes:
  mysql_data:

数据库

docker cp "D:/Docker部署测试/mysql-init/platform.sql" mysql_container:/init.sql
docker exec -it mysql_container bash

mysql -u root -p

create database platform;

source /init.sql;

项目容器启动

docker-compose up -d

强制使用最新镜像并覆盖 

docker-compose up -d --build

关闭运行代码: 

docker-compose down

进入容器查看 

docker exec -it frontend_container bash

cat /etc/nginx/conf.d/default.conf

nginx -t

 BUG修复

前端或后端一直访问不到:

原因:容器启动的镜像如果已存在未关闭,则一直启动的是旧的镜像。

后端请求mysql失败:

强制重新构建镜像 

docker-compose down
docker-compose up -d --build

优化点

后端配置好像能直接用:

mysql简化导入

为mysql也建立镜像

Dockerfile文件内容

# 基于官方 mysql:8.0 镜像
FROM mysql:8.0

# 设置环境变量(可选,保持与原配置一致)
ENV MYSQL_ROOT_PASSWORD=123456

# 将初始化 SQL 文件拷贝到容器内的 /docker-entrypoint-initdb.d 目录
COPY platform.sql /docker-entrypoint-initdb.d/

# MySQL 会在首次启动时自动执行该目录下的 SQL 文件

 若使用的navicat导出的sql文件,加入这两段代码即可

-- 创建数据库
CREATE DATABASE IF NOT EXISTS platform;

-- 切换到 platform 数据库
USE platform;

新的docker-compose.yml

version: "3.8"

services:
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    image: my-frontend:latest   # 自定义前端镜像名称和标签
    container_name: frontend_container
    ports:
      - "9877:9877"
    restart: always

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    image: my-backend:latest    # 自定义后端镜像名称和标签
    container_name: backend_container
    ports:
      - "8580:8580"
    restart: always
    
  mysql:
    build:
      context: ./mysql-init  # 指定构建上下文目录
      dockerfile: Dockerfile
    image: my-mysql:latest      # 自定义 MySQL 镜像名称和标签
    container_name: mysql_container
    ports:
      - "3307:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - mysql_data:/var/lib/mysql
      
volumes:
  mysql_data:

然后执行

docker-compose up -d --build

 

BUG解决

一、docker-nginx-改ip

        docker前端改ip:软件里左键view file,usr/share/nginx

二、资源文件导入问题:

修改DockerFile

video:
upload:
windows: D:\LYFProject\ProjectResources\videos
linux: /app/static/videos
image:
upload:
windows: D:\LYFProject\ProjectResources\images
linux: /app/static/images
model:
upload:
windows: D:\LYFProject\ProjectResources\models
linux: /home/te/ProjectNew/models
unityserver:
windows: D:\GenerateFiles\GraduationServer\实训场景操作.exe
linux: /app/static/LinuxServer/LinuxServer.x8
FROM openjdk:22-jdk

# 先创建好三个静态目录
RUN mkdir -p /app/static/videos \
/app/static/images \
/app/static/LinuxServer \

# 设置工作目录
WORKDIR /app

# 拷贝你的 Spring Boot 可执行 Jar
COPY VirtuLab_back-0.0.1-SNAPSHOT.jar app.jar

# (可选)如果有默认资源,把它们一并拷进来
COPY ProjectResources/videos /app/static/videos
COPY ProjectResources/images /app/static/images
COPY LinuxServer /app/static/LinuxServer

# 暴露你后端的端口
EXPOSE 8667

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]

三、docker部署后端访问不到redis和mysql

修改后端源代码里的yaml文件,一定要连接到容器的名称,而不是localhost
 

datasource:
url: jdbc:mysql://mysql_container:3306/virtulab?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
data:
redis:
host: redis_container

四、docker关闭容器并删除持久化数据(mysql残余)

docker-compose down -v

五、docker运行多个容器 

docker-compose -p myapp2 up -d
注意:docker-compose里的container要不同名称

六、docker-wsl 一直提示要更新

问题如下:docker-compose一直报wsl问题 

 

 

解决方案:

 更新wsl方案:

wsl.2.2.4.0.x64.msi下载这个msi包,然后双击执行

在终端执行

wsl --set-default-version 2

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值