Docker 详解与入门案例

news2024/10/21 22:28:04

目录

  • 一、Docker 简介
  • 二、Docker 的安装与配置
  • 三、Docker 的基本命令
  • 四、Dockerfile 详解
  • 五、Docker 容器的网络配置
  • 六、Docker 容器的数据存储
  • 七、Docker 入门案例
  • 八、Docker 的高级应用

一、Docker 简介

Docker 是一个开源的容器化平台,它可以让开发者将应用程序及其依赖项打包到一个可移植的容器中,从而实现快速部署、可扩展性和一致性。Docker 的出现极大地改变了软件开发和部署的方式,使得应用程序的开发、测试和部署更加高效和可靠。

(一)Docker 的历史
Docker 最初是由 Solomon Hykes 在 2013 年创建的一个开源项目,其灵感来源于集装箱运输的理念。就像集装箱可以将货物标准化并方便地在不同的运输工具之间转运一样,Docker 容器可以将应用程序及其依赖项打包成一个标准化的单元,从而方便地在不同的计算环境中部署和运行。

(二)Docker 的核心概念

  1. 镜像(Image)
    • 镜像是一个只读的模板,它包含了运行一个特定应用程序所需的所有文件和依赖项。镜像可以被看作是一个轻量级的虚拟机,它只包含了应用程序运行所需的最小环境,而不包含操作系统内核。
    • 镜像可以通过 Dockerfile 来构建,Dockerfile 是一个文本文件,它包含了一系列的指令,用于描述如何构建一个镜像。
  2. 容器(Container)
    • 容器是镜像的运行实例,它是一个独立的运行环境,包含了应用程序及其所有的依赖项。容器可以在不同的主机上运行,并且可以在不同的环境中保持一致的行为。
    • 容器之间是相互隔离的,它们之间不能直接访问对方的文件系统和资源。容器的隔离性使得应用程序可以在不同的环境中安全地运行,而不会相互干扰。
  3. 仓库(Repository)
    • 仓库是用来存储和管理镜像的地方,它可以是一个本地仓库,也可以是一个远程仓库。远程仓库通常是由 Docker 官方或第三方提供的,用户可以从远程仓库中下载镜像,并将自己构建的镜像上传到远程仓库中。
    • 仓库中的镜像可以通过标签(Tag)来进行版本管理,用户可以根据自己的需要选择不同版本的镜像来运行容器。

(三)Docker 的优势

  1. 快速部署
    • Docker 容器可以在几秒钟内启动,而传统的虚拟机需要几分钟甚至更长时间才能启动。这使得应用程序的部署速度大大加快,从而提高了开发和部署的效率。
  2. 可移植性
    • Docker 容器可以在不同的操作系统和云平台上运行,而不需要进行任何修改。这使得应用程序可以在不同的环境中轻松地迁移和部署,从而提高了应用程序的可移植性。
  3. 一致性
    • Docker 容器可以保证应用程序在不同的环境中运行时具有一致的行为。这是因为容器包含了应用程序及其所有的依赖项,而不依赖于主机的操作系统和环境。
  4. 资源隔离
    • Docker 容器之间是相互隔离的,它们之间不能直接访问对方的文件系统和资源。这使得应用程序可以在不同的环境中安全地运行,而不会相互干扰。
  5. 易于管理
    • Docker 提供了一系列的命令和工具,使得容器的管理变得非常简单。用户可以轻松地启动、停止、删除容器,以及查看容器的状态和日志等。

二、Docker 的安装与配置

(一)安装 Docker

  1. 在 Linux 系统上安装 Docker
    • 大多数 Linux 发行版都可以通过包管理器来安装 Docker。例如,在 Ubuntu 系统上,可以使用以下命令来安装 Docker:
      sudo apt-get update
      sudo apt-get install docker.io
      
    • 安装完成后,可以使用以下命令来启动 Docker 服务:
      sudo service docker start
      
  2. 在 Windows 和 Mac 系统上安装 Docker
    • Docker 提供了专门的安装程序,用于在 Windows 和 Mac 系统上安装 Docker。用户可以从 Docker 官方网站上下载安装程序,并按照安装向导进行安装。

(二)配置 Docker

  1. 配置 Docker 仓库
    • Docker 默认使用 Docker Hub 作为远程仓库,用户可以从 Docker Hub 上下载镜像。但是,由于网络原因,有时候可能无法访问 Docker Hub。在这种情况下,用户可以配置自己的私有仓库或者使用国内的镜像源。
    • 配置私有仓库的方法可以参考 Docker 官方文档。配置国内镜像源的方法如下:
      • 在 Ubuntu 系统上,可以编辑 /etc/docker/daemon.json 文件,添加以下内容:
        {
          "registry-mirrors": ["https://registry.docker-cn.com"]
        }
        
      • 保存文件后,重新启动 Docker 服务:
        sudo service docker restart
        
  2. 配置 Docker 网络
    • Docker 容器之间可以通过网络进行通信,Docker 提供了几种不同的网络模式,用户可以根据自己的需要进行选择。
    • 默认情况下,Docker 容器使用桥接网络模式,这种模式下,容器可以通过 IP 地址进行通信。但是,在某些情况下,可能需要使用其他网络模式,例如 host 模式、overlay 模式等。
    • 配置 Docker 网络的方法可以参考 Docker 官方文档。

三、Docker 的基本命令

(一)镜像相关命令

  1. docker pull:从远程仓库中拉取镜像。
    • 例如,要拉取一个名为 nginx 的镜像,可以使用以下命令:
      docker pull nginx
      
  2. docker images:列出本地所有的镜像。
    • 执行该命令后,会显示本地所有镜像的列表,包括镜像的名称、标签、大小等信息。
  3. docker rmi:删除本地的一个或多个镜像。
    • 例如,要删除一个名为 nginx 的镜像,可以使用以下命令:
      docker rmi nginx
      
  4. docker tag:为镜像打标签。
    • 例如,要为一个名为 nginx 的镜像打一个名为 my-nginx 的标签,可以使用以下命令:
      docker tag nginx my-nginx
      

(二)容器相关命令

  1. docker run:启动一个容器。
    • 例如,要启动一个名为 nginx 的容器,可以使用以下命令:
      docker run -d --name nginx nginx
      
    • 上述命令中,-d 表示以守护式(后台)模式运行容器,--name 表示为容器指定一个名称。
  2. docker ps:列出正在运行的容器。
    • 执行该命令后,会显示正在运行的容器的列表,包括容器的 ID、名称、镜像、状态等信息。
  3. docker stop:停止一个正在运行的容器。
    • 例如,要停止一个名为 nginx 的容器,可以使用以下命令:
      docker stop nginx
      
  4. docker start:启动一个已停止的容器。
    • 例如,要启动一个名为 nginx 的容器,可以使用以下命令:
      docker start nginx
      
  5. docker restart:重启一个正在运行的容器。
    • 例如,要重启一个名为 nginx 的容器,可以使用以下命令:
      docker restart nginx
      
  6. docker rm:删除一个已停止的容器。
    • 例如,要删除一个名为 nginx 的容器,可以使用以下命令:
      docker rm nginx
      

(三)其他命令

  1. docker exec:在运行中的容器中执行命令。
    • 例如,要在一个名为 nginx 的容器中执行一个 ls 命令,可以使用以下命令:
      docker exec nginx ls
      
  2. docker logs:查看容器的日志。
    • 例如,要查看一个名为 nginx 的容器的日志,可以使用以下命令:
      docker logs nginx
      
  3. docker inspect:查看容器的详细信息。
    • 例如,要查看一个名为 nginx 的容器的详细信息,可以使用以下命令:
      docker inspect nginx
      

四、Dockerfile 详解

(一)Dockerfile 的基本结构

  1. Dockerfile 是一个文本文件,它包含了一系列的指令,用于描述如何构建一个镜像。
  2. Dockerfile 的基本结构如下:
    # 注释
    FROM 基础镜像
    RUN 命令
    COPY 源文件 目标文件
    CMD 命令
    ENTRYPOINT 命令
    
  3. 其中,FROM 指令用于指定基础镜像,RUN 指令用于在构建镜像时执行命令,COPY 指令用于将文件从主机复制到镜像中,CMDENTRYPOINT 指令用于指定容器启动时要执行的命令。

(二)常用指令详解

  1. FROM 指令
    • FROM 指令用于指定基础镜像,它是 Dockerfile 中的第一个指令。
    • 例如,要基于一个名为 ubuntu 的镜像构建一个新的镜像,可以使用以下指令:
      FROM ubuntu
      
  2. RUN 指令
    • RUN 指令用于在构建镜像时执行命令,它可以执行任何 shell 命令或脚本。
    • 例如,要在构建镜像时安装一个软件包,可以使用以下指令:
      RUN apt-get update && apt-get install -y software-package
      
  3. COPY 指令
    • COPY 指令用于将文件从主机复制到镜像中,它可以复制单个文件或整个目录。
    • 例如,要将主机上的一个文件复制到镜像中,可以使用以下指令:
      COPY file.txt /destination/
      
  4. CMD 指令
    • CMD 指令用于指定容器启动时要执行的命令,它可以是一个 shell 命令或脚本。
    • 例如,要在容器启动时执行一个 python 脚本,可以使用以下指令:
      CMD ["python", "script.py"]
      
  5. ENTRYPOINT 指令
    • ENTRYPOINT 指令用于指定容器启动时要执行的命令,它与 CMD 指令的区别在于,ENTRYPOINT 指令指定的命令是容器的默认入口点,而 CMD 指令指定的命令是作为参数传递给 ENTRYPOINT 指令指定的命令的。
    • 例如,要在容器启动时执行一个 python 脚本,可以使用以下指令:
      ENTRYPOINT ["python"]
      CMD ["script.py"]
      

(三)构建镜像

  1. 使用 Dockerfile 构建镜像的方法如下:
    • 在包含 Dockerfile 的目录下,执行以下命令:
      docker build -t 镜像名称.
      
    • 其中,-t 选项用于指定镜像的名称,. 表示当前目录,即 Dockerfile 所在的目录。
  2. 构建镜像时,Docker 会按照 Dockerfile 中的指令依次执行,每执行一条指令都会创建一个新的中间层,最终生成一个完整的镜像。

五、Docker 容器的网络配置

(一)Docker 网络模式

  1. Docker 提供了几种不同的网络模式,用户可以根据自己的需要进行选择。
  2. 常见的网络模式有:
    • bridge 模式:这是 Docker 的默认网络模式,容器之间通过 IP 地址进行通信。
    • host 模式:容器与主机共享网络栈,容器可以直接访问主机的网络资源。
    • overlay 模式:用于在多个 Docker 主机之间创建一个虚拟网络,容器可以在这个虚拟网络中进行通信。
    • macvlan 模式:为容器分配一个独立的 MAC 地址,使其可以直接连接到物理网络。

(二)网络配置方法

  1. 使用 docker run 命令启动容器时,可以通过 -p 选项将主机的端口映射到容器的端口,从而实现容器与外部网络的通信。
    • 例如,要将主机的 8080 端口映射到容器的 80 端口,可以使用以下命令:
      docker run -d -p 8080:80 nginx
      
  2. 可以使用 docker network create 命令创建一个自定义的网络,然后将容器连接到这个网络中,从而实现容器之间的通信。
    • 例如,要创建一个名为 my-network 的网络,可以使用以下命令:
      docker network create my-network
      
    • 然后,使用 docker run 命令启动容器时,可以通过 --network 选项将容器连接到这个网络中:
      docker run -d --network my-network nginx
      

六、Docker 容器的数据存储

(一)数据卷(Volume)

  1. 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过了 Union File System,可以提供一些用于持续存储或共享数据的功能。
  2. 使用数据卷的方法如下:
    • 使用 docker run 命令启动容器时,可以通过 -v 选项将主机的目录挂载到容器中,从而实现数据的持久化存储。
      docker run -d -v /host/directory:/container/directory nginx
      
    • 上述命令中,/host/directory 是主机上的目录,/container/directory 是容器中的目录。容器中的应用程序可以将数据写入到 /container/directory 目录中,这些数据将被持久化存储在主机的 /host/directory 目录中。
  3. 可以使用 docker volume create 命令创建一个数据卷,然后将容器连接到这个数据卷中,从而实现数据的持久化存储。
    • 例如,要创建一个名为 my-volume 的数据卷,可以使用以下命令:
      docker volume create my-volume
      
    • 然后,使用 docker run 命令启动容器时,可以通过 -v 选项将容器连接到这个数据卷中:
      docker run -d -v my-volume:/container/directory nginx
      

(二)数据卷容器

  1. 数据卷容器是一个专门用于提供数据卷的容器,其他容器可以通过挂载这个容器来实现数据的共享。
  2. 使用数据卷容器的方法如下:
    • 首先,创建一个数据卷容器:
      docker create -v /data --name data-container ubuntu
      
    • 然后,使用 docker run 命令启动其他容器时,可以通过 --volumes-from 选项将容器连接到这个数据卷容器中:
      docker run -d --volumes-from data-container nginx
      

七、Docker 入门案例

(一)创建一个简单的 Java Web 应用

  1. 使用 Java 开发工具(如 IntelliJ IDEA 或 Eclipse)创建一个简单的 Maven 或 Gradle 项目。
  2. 创建一个简单的 Servlet,例如:
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class HelloWorldServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<html><body>");
            out.println("<h1>Hello, Docker and Java!</h1>");
            out.println("</body></html>");
        }
    }
    
  3. 在项目的 web.xml 文件中配置 Servlet:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>HelloWorldServlet</servlet-name>
            <servlet-class>HelloWorldServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloWorldServlet</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    </web-app>
    
  4. 编译项目并生成 war 文件。

(二)创建 Dockerfile

  1. 在项目的根目录下创建一个名为 Dockerfile 的文件,内容如下:
    FROM tomcat:8.0-jre8-alpine
    COPY target/*.war /usr/local/tomcat/webapps/
    
  2. 这个 Dockerfile 使用 Alpine 版本的 Tomcat 8.0 作为基础镜像,将项目生成的 war 文件复制到 Tomcat 的 webapps 目录下。

(三)构建和运行容器

  1. 在包含 Dockerfile 和 war 文件的目录下,执行以下命令构建镜像:
    docker build -t my-java-web-app.
    
  2. 执行以下命令启动容器:
    docker run -d -p 8080:8080 my-java-web-app
    
  3. 打开浏览器,访问 http://localhost:8080/项目名称/hello,即可看到“Hello, Docker and Java!”的页面。

八、Docker 的高级应用

(一)Docker Compose

  1. Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个 YAML 文件来配置应用程序的服务,然后可以使用一个命令来启动、停止和管理整个应用程序。
  2. 例如,可以创建一个名为 docker-compose.yml 的文件,用于定义一个包含 Java 应用和数据库的多容器应用:
    version: '3'
    services:
      app:
        build:.
        ports:
          - "8080:8080"
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: myapp
          MYSQL_USER: myuser
          MYSQL_PASSWORD: mypassword
    
  3. 在包含 docker-compose.yml 文件的目录下,执行以下命令启动应用程序:
    docker-compose up
    

(二)容器编排

  1. 容器编排工具如 Kubernetes 和 Docker Swarm 可以用于管理大规模的 Docker 容器集群。
  2. 这些工具可以实现容器的自动部署、扩展、负载均衡和故障恢复等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决:YOLOv8训练数据集时P、R、mAP等值均为0的问题

文章目录 问题解决1.匹配pytorch与cuda的版本2.使用 Adam 优化器3.加大训练轮数epoch4. 删除data/labels下的train.cache和val.cache 问题 使用YOLOv8训练自己的数据集时&#xff0c;出现P、R、mAP等值均为0的问题 Model summary (fused): 186 layers, 2,685,733 parameters, …

【 Git 】git push 出现报错 fatal: Could not read from remote repository.

git push 出现报错 fatal: Could not read from remote repository. 问题描述解决方案 问题描述 Connection closed by 198.18.0.xx port xx fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解…

【JavaScript】Javascript基础Day04:函数

Javascript——Day04 01. 函数的基本使用02. 函数的参数以及默认参数03. 匿名函数之函数表达式04. 逻辑中断05. 转换为布尔型 01. 函数的基本使用 02. 函数的参数以及默认参数 注意&#xff1a; 03. 匿名函数之函数表达式 函数&#xff1a;匿名函数/具名函数 为什么这个外部…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时&#xff0c;从后端获取数据需要用到 Authorization 授权的Bearer令牌&#xff0c;而这个令牌的获取需要登录后台进行获取&#xff0c;这里登录时还涉及到的验证码的操作&#xff0c;所以在获取过程中&#xff0c;需要对后台系统进行登录并拿到这个Be…

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量&#xff1a; index&#xff1a;含义&#xff1a;它表示 Series 对象的索引&#xff0c;也就是每个数据点对…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…

面试官:并发时,故意不加锁会怎么样?

感谢Java面试教程关于并发锁的面试分享 在并发编程中&#xff0c;如果不加锁&#xff0c;可能会导致以下问题&#xff1a; 数据不一致&#xff1a;多个线程同时访问和修改共享资源时&#xff0c;如果没有加锁&#xff0c;可能会导致数据竞争&#xff0c;即一个线程在读取数据…

Maven入门到进阶:构建、依赖与插件管理详解

文章目录 一、Maven介绍1、什么是Maven2、Maven的核心功能 二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成 1.4、Packaging 2、POM、父POM和超级POM2.1、POM (Project Object Model)2.1、父POM&#xff08;Parent POM&#xff09;2.…

算法的学习笔记—丑数(牛客JZ49)

&#x1f600;前言 在程序设计和算法竞赛中&#xff0c;丑数问题是一个经典的动态规划题目。丑数&#xff08;Ugly Number&#xff09;定义为只包含质因子 2、3 和 5 的数。举例来说&#xff0c;数字 6&#xff08;因子为 2 和 3&#xff09;、数字 8&#xff08;因子为 2&…

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

珊瑚岛风灵月影四十九项修改器:体力不减/生命不减/开启金钱修改

珊瑚岛是一款以模拟经营岛屿为特色的休闲养成游戏。在游戏中&#xff0c;玩家需设法吸引顾客消费。同时&#xff0c;还需投入时间和资源修复遗址&#xff0c;过程中或会遇到技术、资金及文化保护等挑战&#xff0c;增添游戏趣味与深度。 修改器地址&#xff1a; https://downf…

力扣——链表的中间结点(链表)C语言

题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 返回中间3这个结点&#xff1b; 返回中4这个结点&#xff1b; 原理&#xff1a; 思路1&#xff1a;利用遍历链表&#xff0c;统…

图文深入理解java的内存分配

本篇图文深入讨论java的内存分配。当然&#xff0c;这里所说的深入&#xff0c;并不是指长篇大论&#xff0c;而是就事论事重点深入介绍java的内存分配原理机制。 在理解java如何为变量或者对象分配内存之前&#xff0c;我们先来了解一个问题&#xff1a;为什么需要分配内存&am…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一&#xff0c;每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品&#xff0c;从时尚尖货到家居好物&#xff0c;无数精选商品在这一季集中绽放&#xff0c;等待着慧眼识珠的你将它们带回家&#xff0c;今年的双十一&…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类&#xff1a;Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试&#xff1a;Test.java 3. 心得参考链接&#xff08;无&#xff09; 1. 简介 简单工厂模式(Simple Factory Patern):又称…

Java项目-基于springboot框架的网上书城系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

【番外】软件设计师中级笔记关于数据库技术更新笔记问题

提问 由于软件设计师中级笔记中第九章数据库技术基础的笔记内容太多&#xff0c;我应该分几期发布呢&#xff1f;还是一期一次性发布完成。 如果分为一期发布&#xff0c;可能需要给我多一些时间&#xff0c;由于markdown格式有所差异&#xff0c;所以我需要部分进行修改与调…

策略路由---选路

目录 拓扑图 配置IP 配置静态路由 配置ospf nat 配置路由策略 流分类 流行为 流策略 应用接口 测试流量路径 拓扑图 配置IP [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [R1-GigabitEthernet0/0/0]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add…

Java项目-基于Springboot的车辆充电桩项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…