当前位置: 首页 > news >正文

Docker Compose一键部署Spring Boot + Vue项目

目录

前提条件

概述

Compose简介

Compose文件

Compose环境

Compose命令

帮助命令

关键命令

Compose部署项目

初始化环境

查看代码文件

sql数据准备

nginx配置文件准备

创建 compose.yaml

一键启动compose多个容器

浏览器访问虚拟机ip:80(可省略默认的80端口)

查看Compose运行的容器

查看容器日志

关闭并删除Compose开启的容器


前提条件

  1. 熟悉Docker、Spring Boot 、Vue基本知识
  2. 熟悉yaml文件基本知识,可参考:YAML 入门教程
  3. 掌握Docker部署Spring Boot + Vue项目方法,可参考:Docker部署Spring Boot + Vue项目

概述

本文在普通的 Docker部署Spring Boot + Vue项目 的基础上进行。部署若依前后端分离版项目为例,重点在于如何使用Docker Compose的方式加快项目部署过程。

此前使用Docker部署一个Spring Boot + Vue项目,包含了4个容器:

  • MySQL

  • Redis

  • Java后端

  • Nginx前端

而稍微复杂的项目,还会有各种各样的其它中间件,需要部署的容器远不止4个。如果还像之前那样手动的逐一部署,就太麻烦了。

而Docker Compose就可以帮助我们实现 多个相互关联的Docker容器的快速部署

Compose简介

Docker Compose 是一个用于定义和运行多容器应用程序的工具,是实现精简且高效的开发与部署体验的关键所在。

它简化了对整个应用程序栈的控制,能够通过一个易于理解的 YAML 配置文件轻松管理服务、网络和存储卷。然后,只需一条命令,就能依据配置文件创建并启动所有服务。

Docker Compose 可在所有环境中工作,包括生产、预发布、开发、测试环境以及持续集成(CI)工作流程。它还具备用于管理应用程序整个生命周期的命令,比如:

  • 启动、停止和重建服务。

  • 查看正在运行服务的状态。

  • 流式输出正在运行服务的日志内容。

  • 在某个服务上运行一次性命令。

通过使用 Docker Compose,使用一个名为 Compose 文件的 YAML 配置文件来配置应用程序的各项服务,然后使用 Compose 命令行界面(CLI)依据该配置文件创建并启动所有服务。

Compose 文件(即 compose.yaml 文件)在定义多容器应用程序方面遵循了 Compose 规范所提供的规则。

Compose文件

Compose 文件的默认路径是位于工作目录下的 compose.yaml(首选)或 compose.yml。为了与早期版本兼容,Compose 也支持 docker-compose.yamldocker-compose.yml。如果这两种文件都存在,Compose 会优先使用规范的 compose.yaml 文件。

你可以使用片段和扩展来保持 Compose 文件的高效性和易于维护性。

多个 Compose 文件可以合并在一起以定义应用程序模型。YAML 文件的组合是通过根据你设置的 Compose 文件顺序来追加或覆盖 YAML 元素来实现的。简单属性和映射会被最高顺序的 Compose 文件覆盖,列表则通过追加来合并。当要合并的互补文件存放在其他文件夹时,相对路径会基于第一个 Compose 文件的父文件夹来解析。由于一些 Compose 文件元素既可以表示为单个字符串也可以表示为复杂对象,所以合并操作适用于展开形式。

如果想复用其他 Compose 文件,或者将应用程序模型的部分内容提取到单独的 Compose 文件中,也可以使用 “include”。如果你的 Compose 应用程序依赖于由不同团队管理的另一个应用程序,或者需要与他人共享,这将非常有用。

Compose环境

安装docker时已经附带安装了docker-compose-plugin插件,所以无需另外安装docker compose

image.png

使用如下命令查询compose版本,看到版本号,说明docker compose正常可用

[root@localhost ~]# docker compose version
Docker Compose version v2.29.7
​

Compose命令

通过 “docker compose” 命令及其子命令与 Docker Compose 应用程序进行交互。可以管理在 compose.yaml 文件中定义的多容器应用程序的生命周期。这些命令能够轻松地启动、停止和配置应用程序。

帮助命令

docker compose帮助命令

[root@localhost ~]# docker compose --help
​
Usage:  docker compose [OPTIONS] COMMAND
​
Define and run multi-container applications with Docker
​
Options:--all-resources              Include all resources, even those not used by services--ansi string                Control when to print ANSI control characters ("never"|"always"|"auto") (default "auto")--compatibility              Run compose in backward compatibility mode--dry-run                    Execute command in dry run mode--env-file stringArray       Specify an alternate environment file-f, --file stringArray           Compose configuration files--parallel int               Control max parallelism, -1 for unlimited (default -1)--profile stringArray        Specify a profile to enable--progress string            Set type of progress output (auto, tty, plain, json, quiet) (default "auto")--project-directory string   Specify an alternate working directory(default: the path of the, first specified, Compose file)-p, --project-name string        Project name
​
Commands:attach      Attach local standard input, output, and error streams to a service's running containerbuild       Build or rebuild servicesconfig      Parse, resolve and render compose file in canonical formatcp          Copy files/folders between a service container and the local filesystemcreate      Creates containers for a servicedown        Stop and remove containers, networksevents      Receive real time events from containersexec        Execute a command in a running containerimages      List images used by the created containerskill        Force stop service containerslogs        View output from containersls          List running compose projectspause       Pause servicesport        Print the public port for a port bindingps          List containerspull        Pull service imagespush        Push service imagesrestart     Restart service containersrm          Removes stopped service containersrun         Run a one-off command on a servicescale       Scale services start       Start servicesstats       Display a live stream of container(s) resource usage statisticsstop        Stop servicestop         Display the running processesunpause     Unpause servicesup          Create and start containersversion     Show the Docker Compose version informationwait        Block until containers of all (or specified) services stop.watch       Watch build context for service and rebuild/refresh containers when files are updated
​
Run 'docker compose COMMAND --help' for more information on a command.
​

查看某个命令的帮助,例如,docker compose up命令帮助如下

[root@localhost ~]# docker compose up --help
​
Usage:  docker compose up [OPTIONS] [SERVICE...]
​
Create and start containers
​
Options:--abort-on-container-exit      Stops all containers if any container was stopped. Incompatible with -d--abort-on-container-failure   Stops all containers if any container exited with failure. Incompatible with -d--always-recreate-deps         Recreate dependent containers. Incompatible with --no-recreate.--attach stringArray           Restrict attaching to the specified services. Incompatible with --attach-dependencies.--attach-dependencies          Automatically attach to log output of dependent services--build                        Build images before starting containers-d, --detach                       Detached mode: Run containers in the background--dry-run                      Execute command in dry run mode--exit-code-from string        Return the exit code of the selected service container. Implies --abort-on-container-exit--force-recreate               Recreate containers even if their configuration and image haven't changed--menu                         Enable interactive shortcuts when running attached. Incompatible with --detach. Canalso be enable/disable by setting COMPOSE_MENU environment var.--no-attach stringArray        Do not attach (stream logs) to the specified services--no-build                     Don't build an image, even if it's policy--no-color                     Produce monochrome output--no-deps                      Don't start linked services--no-log-prefix                Don't print prefix in logs--no-recreate                  If containers already exist, don't recreate them. Incompatible with --force-recreate.--no-start                     Don't start the services after creating them--pull string                  Pull image before running ("always"|"missing"|"never") (default "policy")--quiet-pull                   Pull without printing progress information--remove-orphans               Remove containers for services not defined in the Compose file-V, --renew-anon-volumes           Recreate anonymous volumes instead of retrieving data from the previous containers--scale scale                  Scale SERVICE to NUM instances. Overrides the scale setting in the Compose file ifpresent.-t, --timeout int                  Use this timeout in seconds for container shutdown when attached or when containersare already running--timestamps                   Show timestamps--wait                         Wait for services to be running|healthy. Implies detached mode.--wait-timeout int             Maximum duration to wait for the project to be running|healthy-w, --watch                        Watch source code and rebuild/refresh containers when files are updated.
​

关键命令

启动在 compose.yaml 文件中定义的所有容器服务:

docker compose up

停止并移除正在运行的容器服务:

docker compose down

监控正在运行的容器的输出并调试问题,通过以下命令查看日志:

docker compose logs

列出所有容器服务及其当前状态:

docker compose ps

Compose部署项目

此前docker命令一个一个容器手动部署步骤如下:

# 1.创建网络
[root@localhost ~]# docker network create rynet
​
# 2.启动mysql容器
docker run -d -p 3306:3306 \
-v /app/myconf:/etc/mysql/conf.d \
-v /app/mydata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=password \
--network rynet \
--name mysqldb \
mysql:8.0.39-debian
​
# 3.运行sql文件,得到初始数据
​
# 4.运行redis容器
docker run -d -p 6379:6379 \
--name myredis \
-v /app/redis/conf:/usr/local/etc/redis \
-v /app/redis/data:/data \
--network rynet \
redis
​
# 5.构建后端镜像
# 5.1Dockerfile内容
FROM openjdk:8
LABEL author=liang
COPY ruoyi-admin.jar /ruoyi-admin.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/ruoyi-admin.jar"]
​
# 5.2构建镜像
[root@localhost ruoyi]# docker build -t ruoyiadmin:v1 .
​
# 6.运行后端容器
docker run -d -p 8080:8080 \
--name backend \
--network rynet \
-v /app/admindata/uploadPath:/ruoyi/uploadPath \
ruoyiadmin:v1
​
# 7.运行前端容器
docker run -d -p 80:80 \
-v /root/dist:/usr/share/nginx/html \
-v ryngconf:/etc/nginx \
--name rynginx \
--network rynet \
nginx
​

下面把这些步骤统一写在一个 compose.yaml文件中,然后使用一条命令启动这些容器,避免手动一步一步运行各个容器的麻烦,简化部署流程。compose.yaml内容(还可进一步优化,本文后面会提供优化后的yaml内容)如下:

services:mysql:image: mysqlcontainer_name: mysqldbports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: passwordvolumes:- "/app/compose/mysql/myconf:/etc/mysql/conf.d"- "/app/compose/mysql/mydata:/var/lib/mysql"- "/app/compose/mysql/myinit:/docker-entrypoint-initdb.d" # 初始化sql文件所在目录绑定挂载networks:- rynetredis:image: rediscontainer_name: myredisvolumes:- "/app/compose/redis/conf:/usr/local/etc/redis"- "/app/compose/redis/data:/data"networks:- rynetjavabackend:build: context: ./ruoyidockerfile: Dockerfilecontainer_name: backendimage: ruoyiadmin:v2 # 指定镜像名ports:- "8080:8080" # 暴露端口volumes:- /app/admindata/uploadPath:/ruoyi/uploadPath # 上传目录绑定挂载networks:- rynetdepends_on:- mysql- redisnginx:image: nginxcontainer_name: nginxports:- "80:80"volumes:- "/root/nginx.conf:/etc/nginx/nginx.conf" # 绑定挂载配置文件,提前准备- "/root/dist:/usr/share/nginx/html"depends_on:- javabackendnetworks:- rynet
networks:rynet:

看到compose.yaml文件定义了4个容器。读者可自行对比compose文件定义的容器和docker run命令运行容器的对应关系。

初始化环境

# 删除容器
[root@localhost ~]# docker rm -f $(docker ps -qa)
fcb5469c0776
88c2f4a4496f
74eeb57c4038
08776c3691f7
3655375bda89
ce27bf664148
2f92612fd555
f16e0185235f
5d0a2242ac54
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
​
# 删除未使用的网络
[root@localhost ~]# docker network prune
​
# 删除相关镜像
[root@localhost ~]# docker images
REPOSITORY           TAG             IMAGE ID       CREATED         SIZE
ruoyiadmin           v1              6de9305df65c   2 hours ago     610MB
ruoyifront           v1              35c81e6d0f0b   25 hours ago    194MB
test/mychangenginx   v1              16689c99df42   3 days ago      188MB
ubuntu               latest          b1e9cef3f297   5 weeks ago     78.1MB
nginx                latest          39286ab8a5e1   6 weeks ago     188MB
redis                latest          7e49ed81b42b   2 months ago    117MB
mysql                latest          c757d623b190   2 months ago    586MB
mysql                8.0.39-debian   3c716403fbe7   2 months ago    611MB
hello-world          latest          d2c94e258dcb   17 months ago   13.3kB
​
[root@localhost ~]# docker rmi 6de 35c 166
​
[root@localhost ~]# docker images
REPOSITORY    TAG             IMAGE ID       CREATED         SIZE
ubuntu        latest          b1e9cef3f297   5 weeks ago     78.1MB
nginx         latest          39286ab8a5e1   6 weeks ago     188MB
redis         latest          7e49ed81b42b   2 months ago    117MB
mysql         latest          c757d623b190   2 months ago    586MB
mysql         8.0.39-debian   3c716403fbe7   2 months ago    611MB
hello-world   latest          d2c94e258dcb   17 months ago   13.3kB
​
​

查看代码文件

在完成  Docker部署Spring Boot + Vue项目 后,就会有前后端的代码文件,通过如下命令查看代码文件,确保如下这些文件存在。

# 查看代码文件
[root@localhost ~]# ls
ruoyi    dist   ...# 查看前端文件
[root@localhost ~]# ls dist
favicon.ico  html  index.html  index.html.gz  robots.txt  static# 查看到后端文件
[root@localhost ~]# ls ruoyi
Dockerfile  ruoyi-admin.jar

sql数据准备

将mysql数据初始化文件 ry_20240629.sql,上传到指定目录,例如:/app/compose/mysql/myinit/

[root@localhost ~]# mkdir -p /app/compose/mysql/myinit
[root@localhost ~]# ls /app/compose/mysql/myinit/
ry_20240629.sql

nginx配置文件准备

[root@localhost ~]# vi nginx.conf

nginx.conf内容如下:


user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  localhost;location / {root   /usr/share/nginx/html;try_files $uri $uri/ /index.html;index  index.html index.htm;}location /prod-api/{proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://backend:8080/;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

1.location / {里面的root 配置前端代码文件所在的目录

2.location /prod-api/{里面配置了前端请求带有/prod-api/开头的路径,将请求转发到对应的后端地址,这里配置的后端服务地址为http://backend:8080/,例如:localhost:80/prod-api/getAllUser请求转发到http://backend:8080/getAllUser

创建 compose.yaml

[root@localhost ~]# vi compose.yaml
​

优化后的compose.yaml文件内容如下:

services:mysqldb:image: mysql:8.0.39-debiancontainer_name: mysqldbports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: passwordMYSQL_DATABASE: ryvueLANG: C.UTF-8command:--character-set-server=utf8mb4--collation-server=utf8mb4_general_civolumes:- "/app/compose/mysql/myconf:/etc/mysql/conf.d"- "/app/compose/mysql/mydata:/var/lib/mysql"- "/app/compose/mysql/myinit:/docker-entrypoint-initdb.d" # 绑定挂载,初始化sql文件所在目录networks:- rynetmyredis:image: rediscontainer_name: myredisvolumes:- "/app/compose/redis/conf:/usr/local/etc/redis"- "/app/compose/redis/data:/data"networks:- rynetbackend:build: context: ./ruoyidockerfile: Dockerfilecontainer_name: backendimage: ruoyiadmin:v2 # 指定镜像名ports:- "8080:8080"volumes:- /app/admindata/uploadPath:/ruoyi/uploadPath # 绑定挂载,上传目录networks:- rynetrestart: alwaysdepends_on:mysqldb: condition: service_startedmyredis:condition: service_startednginx:image: nginxcontainer_name: nginxports:- "80:80"volumes:- "/root/nginx.conf:/etc/nginx/nginx.conf" # 绑定挂载,nginx配置文件,提前准备- "/root/dist:/usr/share/nginx/html" # 绑定挂载,前端代码目录depends_on:- backendnetworks:- rynet
networks:rynet:
 

一键启动compose多个容器

[root@localhost ~]# docker compose up -d
[+] Running 1/1! backend Warning Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting fo...                139.6s 
[+] Building 0.1s (8/8) FINISHED                                                                                 docker:default=> [backend internal] load build definition from Dockerfile                                                               0.0s=> => transferring dockerfile: 169B                                                                                       0.0s=> [backend internal] load metadata for docker.io/library/openjdk:8                                                       0.0s=> [backend internal] load .dockerignore                                                                                  0.0s=> => transferring context: 2B                                                                                            0.0s=> [backend internal] load build context                                                                                  0.0s=> => transferring context: 39B                                                                                           0.0s=> [backend 1/2] FROM docker.io/library/openjdk:8                                                                         0.0s=> CACHED [backend 2/2] COPY ruoyi-admin.jar /ruoyi-admin.jar                                                             0.0s=> [backend] exporting to image                                                                                           0.0s=> => exporting layers                                                                                                    0.0s=> => writing image sha256:83e99924b0730b778deafc3783a049a240783ee9658f2c096f151d55b12bb6bc                               0.0s=> => naming to docker.io/library/ruoyiadmin:v2                                                                           0.0s=> [backend] resolving provenance for metadata file                                                                       0.0s
[+] Running 5/5✔ Network root_rynet  Created                                                                                             0.1s ✔ Container myredis   Started                                                                                             0.6s ✔ Container mysqldb   Started                                                                                             0.6s ✔ Container backend   Started                                                                                             0.9s ✔ Container nginx     Started                                                                                             1.2s 
[root@localhost ~]# 
​

浏览器访问虚拟机ip:80(可省略默认的80端口)

虚拟机ip

image.png

输入验证码后,进入用户管理,看到如下界面

image.png

查看Compose运行的容器

[root@localhost ~]# docker compose ps
NAME      IMAGE                 COMMAND                  SERVICE   CREATED          STATUS         PORTS
backend   ruoyiadmin:v2         "java -jar /ruoyi-ad…"   backend   10 seconds ago   Up 8 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
myredis   redis                 "docker-entrypoint.s…"   myredis   10 seconds ago   Up 9 seconds   6379/tcp
mysqldb   mysql:8.0.39-debian   "docker-entrypoint.s…"   mysqldb   10 seconds ago   Up 9 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx     nginx                 "/docker-entrypoint.…"   nginx     9 seconds ago    Up 8 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp

查看容器日志

使用如下命令查看容器日志

[root@localhost ~]# docker compose logs
...
省略日志输出
...

看到输出了Compose中多个容器的日志。

关闭并删除Compose开启的容器

关闭并删除Compose开启的容器

[root@localhost ~]# docker compose down
[+] Running 5/5? Container nginx     Removed                                                                                             0.3s ? Container backend   Removed                                                                                             0.4s ? Container mysqldb   Removed                                                                                             0.6s ? Container myredis   Removed                                                                                             0.2s ? Network root_rynet  Removed                                                                                             0.1s 
[root@localhost ~]# 
​

再次查看容器

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

完成!enjoy it!

相关文章:

Docker Compose一键部署Spring Boot + Vue项目

目录 前提条件 概述 Compose简介 Compose文件 Compose环境 Compose命令 帮助命令 关键命令 Compose部署项目 初始化环境 查看代码文件 sql数据准备 nginx配置文件准备 创建 compose.yaml 一键启动compose多个容器 浏览器访问虚拟机ip:80(可省略默认的80端口) …...

【maven】idea执行了maven的install命令给本地安装项目依赖包 安装后删除

目录 事件起因环境和工具操作过程解决办法1、找到对应的目录下的文件,手动去删除,比如我的依赖库的路径是D:\qc_code\apache-maven-3.8.2\repository 我只需要找到这个目录下对应的依赖包进行手动删除即可(不推荐,强行删除文件夹文…...

Android中的Handle底层原理

先上结论: 一个小小的Handle,就能看出你对Android底层源码理解的深浅。 老规矩,如果你能看懂我上面画的这张草图,这篇文章你可以直接跳过! 开干! 1、先对Handle在Android系统中是如何发挥作用的做一个小结: 1)每一个线程,包括UI主线程,有一个ThreadLocalMap变量:…...

最简单方式SSH连接局域网中另一台电脑的WSL2

1、首先确认一下WSL2中的SSH服务是否开启: 先安装更新一下,再安装一下ssh服务模块,这里很多人都每安装过。 sudo apt update sudo apt upgrade sudo apt install openssh-server 2、配置SSH服务器: 打开配置文件,这…...

热点聚焦:AI在医疗保健领域的深度渗透与变革

内容概要 随着人工智能技术的不断进步,我们正在见证一个充满奇迹的转变,尤其是在医疗保健领域。这种转变不仅仅涉及到提高效率,更在于重新定义我们对疾病诊断和治疗方案的理解。通过智能算法,AI能够在早期识别潜在的健康问题&…...

模板方法模式:定义算法框架的设计模式

1. 引言 在软件开发中,算法的实现通常是可变的,但其基本步骤往往是相对固定的。模板方法模式(Template Method Pattern)正是为了解决这一问题而设计的,它通过定义一个操作中的算法框架,将一些步骤的实现延…...

[Redis] Redis事务

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

编译原理第一次实验报告

源代码及附件:编译原理实验一源程序及附件资源-CSDN文库实验题目 实验要求 实验设计 前两部分指出了实验的宏观把控,为了具体实施实验,我们需要预先为实验做出如下设计: 本次实验我选取了C语言的一个子集进行设计词法分析器&…...

uniapp的video视频属性打包app后层级过高

问题:在使用uniapp开发APP时,使用video标签显示视频发现H5可以正常展示,但是打包到APP后,它的层级过高,把底部导航都盖住了。 官网说明:uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…...

问:Redis为什么这么快?

Redis,全称Remote Dictionary Server,是一个开源的高性能键值对数据库。它以其卓越的性能、丰富的数据结构和灵活的使用方式,在现代互联网应用中扮演着重要角色。本文将探讨Redis之所以快的原因,包括其数据结构、内存管理、IO多路…...

环信鸿蒙IM SDK实现附件消息发送与下载

环信HarmonyOS IM SDK 正式版已经发布,该版本全面覆盖即时通讯(IM)的核心功能,为用户提供了完整的IM全功能体验,同时支持从Android APK到 NEXT 的数据迁移,更好地满足企业在不同业务场景下的适配需求。 点…...

探索NetCat:网络流量监测与数据传输的利器

从简单的数据传输到复杂的网络调试,NetCat的灵活性和多功能性让人赞叹不已,在这篇文章中我将深入探讨NetCat的魅力,揭示它的基本功能、实用技巧以及在日常工作中的应用场景,发现如何用这一小工具提升的网络技能与效率。 目录 Net…...

【运动的&足球】足球运动员球守门员裁判检测系统源码&数据集全套:改进yolo11-DBBNCSPELAN

改进yolo11-FocalModulation等200全套创新点大全:足球运动员球守门员裁判检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.28 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示…...

求最大公约数,最小公倍数

输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 求最小公倍数算法: 最小公倍数 两整数的乘积 最大公约数 根据求最小公倍数的算法,可以看出如果已知最大公约数,就能很容易求出最小公倍数。而通过辗转相除法和相减法&#…...

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况,Android设计了一中配置变更机制,在指定的环境配置发生变更之时,无需重启活动页面,只需执行特定的变更行为。该机制的视线过程分为两步: 修改 Androi…...

scala---10.30

val、var package com_1030class Person {var name:String"rose"def sum(n1:Int,n2:Int):Int{n1n2} } object Person{def main(args: Array[String]): Unit {//创建person对象var personnew Person()println(person.sum(10,20))//30println(person.name)person.nam…...

Pinctrl子需要中client端使用pinctrl过程的驱动分析

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体 input子系统专栏…...

【网络】传输层协议TCP

目录 四位首部长度 序号 捎带应答 标记位 超时重传机制 连接管理机制(RST标记位) 三次握手及四次挥手的原因 TCP的全称是传输控制协议(Transmission Control Protocol),也就是说,对于放到TCP发送缓冲…...

00-开发环境 MPLAB IDE 配置

MPLAB IDE V8.83 File 菜单简介 New (CtrlN): 创建一个新文件,用于编写新的代码。 Add New File to Project...: 将新文件添加到当前项目中。 Open... (CtrlO): 打开现有文件。 Close (CtrlE): 关闭当前打开的文件。 …...

<meta property=“og:type“ content=“website“>

<meta property"og:type" content"website"> ​ 这段代码是HTML中的一部分&#xff0c;具体来说&#xff0c;它是一个用于定义Open Graph协议的meta标签。 代码分析 <meta> 标签&#xff1a;这是一个HTML标签&#xff0c;用于在HTML文档的头…...

C++ 实现俄罗斯方块游戏

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

QT打包Macosx应用发布App Store简易流程

1、QC里编译工程&#xff0c;生成Release版的的app文件&#xff1b; 2、运行macdeployqt把需要的文件打包进app文件中&#xff1b; % ~/Qt/5.15.0/clang_64/bin/macdeployqt {编译的app文件所在路径}/Release/xxxx.app 3、使用codesign对app进行签名&#xff0c;如果要发App…...

untiy mlagents 飞机大战 ai训练

前言 之前那个python源码的飞机大战bug过多&#xff0c;还卡顿&#xff0c;难以继续训练。可直接放弃的话又不甘心&#xff0c;所以找了个unity版本的飞机大战继续(终于不卡了)&#xff0c;这次直接使用现成的mlagents库。 过程 前前后后花了两周时间&#xff0c;甚至因此拖…...

从0开始学统计-什么是中心极限定理

引言 中心极限定理&#xff08;Central Limit Theorem, CLT&#xff09;是统计学中的一块基石&#xff0c;它揭示了一个难以置信的数学现象&#xff1a;无论一个随机变量的原始分布如何&#xff0c;只要我们取足够大的样本量&#xff0c;这些样本的平均值&#xff08;或总和&a…...

工具方法 - 个人活动的分类

人类活动的分类是一个复杂的话题&#xff0c;因为人类的活动范围非常广泛且相互交叉。然而&#xff0c;我们可以尝试将人类的活动大致分为以下几个主要类别&#xff1a; 工作活动 工作活动是人类生活中不可或缺的一部分&#xff0c;通常包括以下方面&#xff1a; 1. 职业工作&a…...

11.1组会汇报-基于区块链的安全多方计算研究现状与展望

基础知识 *1.背书&#xff0c;这个词源来自银行票据业务&#xff0c;是指票据转让时&#xff0c;原持有人在票据背面加盖自己的印鉴&#xff0c;证明该票据真实有效、如果有问题就可以找原持有人。 区块链中的背书就好理解了。可以简单的理解为验证交易并声明此交易合法&…...

ubuntu【桌面】 配置NAT模式固定IP

DHCP分配导致虚拟机IP老变&#xff0c;SSH老要重新配置&#xff0c;设成静态方便些 一、设NAT模式 1、设为NAT模式 2、看模式对应的虚拟网卡 - VMnet8 3、共享主机网卡网络到虚拟网卡 - VMnet8 二、为虚拟网卡设置静态IP 记住这个IP 三、设置ubuntu固定IP 1、关闭DHCP并…...

评估 机器学习 回归模型 的性能和准确度

回归 是一种常用的预测模型&#xff0c;用于预测一个连续因变量和一个或多个自变量之间的关系。 那么&#xff0c;最后评估 回归模型 的性能和准确度非常重要&#xff0c;可以帮助我们判断模型是否有效并进行改进。 接下来&#xff0c;和大家分享如何评估 回归模型 的性能和准…...

如何下载安装TestLink?

一、下载TestLink、XAMPP TestLink 下载 |SourceForge.net 备用&#xff1a;GitHub - TestLinkOpenSourceTRMS/testlink-code&#xff1a; TestLink开源测试和需求管理系统 下载XAMPP&#xff1a; Download XAMPP 注意&#xff1a;TestLink与PHP版本有关系&#xff0c;所以XA…...

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…...