镜像下载
在有网络的电脑下载镜像(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