Docker-Compose概述与简单编排部署

目录

前言

一、Docker-Compose 概述

1、Docker-Compose 概念

2、Docker-Compose 优缺点

2.1 Docker-Compose 优点

2.2 Docker-Compose 缺点

3、Docker-Compose与Docker-Swarm的区别

二、两大文件格式

1、YAML 文件格式

2、JOSON 文件格式

3、YAML 与 JOSON 格式的区别

三、Docker-Compose.yml 文件格式

1、数据结构

1.1 对象映射:

1.2 序列数组

1.3 布尔值

2、Docker-Compose 配置常用字段

3、Docker-Compose 常用命令

四、Docker-Compose 环境安装

五、 Docker-Compose 简单编排部署

1、Nginx Docker-Compose编排

1.1 建立工作目录并上传相关安装包

1.2 编写 Nginx Dockerfile 脚本

1.3 创建网页目录和文件

1.4 编写配置文件 docker-compose.yml

1.5 Nginx Docker-Compose 文件结构

1.6 启动 Docker 容器

1.7 浏览器测试页面

2、nginx+tomcat docker-compose编排

1.1 建立工作目录并上传相关安装包

1.2 编写 Tomcat Dockerfile 脚本

1.3 修改配置文件 docker-compose.yml

1.4 Nginx+Tomcat Docker-Compose 文件结构

1.5 启动 Docker 容器


前言

  • 在当今软件开发和部署的环境中,容器化技术已经成为主流。Docker Compose 在这一背景下应运而生,为开发人员和运维团队提供了一种便捷的方式来定义和管理多个容器化应用程序的部署
  • 使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker Compose 
  • Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等

一、Docker-Compose 概述

1、Docker-Compose 概念

  • Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排
  • Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul
  • Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器
  • 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等
  • Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
  • Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理

2、Docker-Compose 优缺点

2.1 Docker-Compose 优点

  • 简化部署: Docker Compose 可以通过一个 YAML 文件定义整个应用程序的组件,使得部署变得简单且可重复

  • 容器编排: 允许用户轻松地定义多个相互关联的容器,实现容器编排,确保各个组件可以协同工作

  • 环境一致性: 使用 Docker Compose 可以确保开发、测试和生产环境中的容器配置保持一致,减少了环境引起的问题

  • 快速启动: 一条命令即可启动整个应用程序,节省了时间和精力,特别适用于开发和测试环境

  • 易于维护: 通过统一的配置文件管理多个服务,便于维护和更新

2.2 Docker-Compose 缺点

  • 不适用于大型集群: 对于大规模的、需要高度扩展性和动态调整的应用程序,Docker Compose 显示出了一些局限性,这时候可能需要更为强大的编排工具,比如 Kubernetes

  • 单机限制: Docker Compose 针对单机或者少量主机的场景设计,如果需要跨主机的容器编排,需要额外考虑其他解决方案

  • 监控和治理: 在生产环境中,监控和治理方面的需求可能超出了 Docker Compose 的能力范围,需要额外的工具来支持

总体来说,Docker-Compose 在简化部署、容器编排、环境一致性等方面有着明显的优势,但在大规模集群、监控治理等方面存在一定的局限性 

3、Docker-Compose与Docker-Swarm的区别

Docker-Compose和Docker-Swarm是两个不同的工具,用于管理Docker容器的部署和运行,它们之间有一些重要的区别:

  • Docker-Compose:

    • Docker-Compose是用于定义和运行多容器Docker应用程序的工具。它使用YAML文件来配置应用程序的服务、网络和卷等信息,并通过一个命令来启动、停止和管理整个应用程序的容器
    • Docker-Compose适用于在单个主机上部署和管理容器化应用程序,通常用于开发和测试环境
  • Docker-Swarm:

    • Docker-Swarm是Docker官方提供的容器编排工具,用于在多个Docker主机上部署和管理容器化应用程序。它允许将多个Docker主机组成一个集群,统一管理和调度容器的部署
    • Docker-Swarm支持高可用性、负载均衡和自动容器恢复等功能,适用于生产环境中需要横向扩展和高可用性的场景

总的来说,Docker-Compose更适合于单个主机上的开发和测试环境,而Docker-Swarm适合于生产环境中需要在多个主机上部署和管理容器的场景

二、两大文件格式

1、YAML 文件格式

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。

YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [ ] 括起来, hash 用花括号 { } 括起来

使用 YAML 时需要注意下面事项:

  • 大小写敏感
  • 通过缩进表示层级关系
  • 不支持制表符 tab 键缩进,只能使用空格缩进
  • 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
  • 用 # 号注释
  • 符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠 -    
  • 如果包含特殊字符用单引号(' ')引起来会作为普通字符串处理,双引号(" "): 特殊字符作为本身想表示的意思

2、JOSON 文件格式

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输和配置文件等场景

对象: JSON 使用花括号 {} 表示对象,对象由键值对组成,键和值之间使用冒号 : 分隔,不同键值对之间使用逗号 , 分隔

数组: JSON 使用方括号 [] 表示数组,数组中可以包含多个值,各个值之间使用逗号 , 分隔

字符串: 字符串需要使用双引号 " 括起来

使用 JOSON 时需要注意下面事项:

  • 正确格式: JSON 必须严格遵循其定义的格式,包括花括号、方括号、逗号、冒号等

  • 嵌套结构: JSON 支持嵌套的对象和数组,但要确保嵌套结构的格式正确

  • 字符串转义: 特殊字符需要进行转义,例如 \n 表示换行符,\t 表示制表符等

  • 数据类型: JSON 中支持字符串、数字、布尔值、对象、数组等数据类型,需根据实际情况选择合适的数据类型

  • 注释: JSON 标准不支持注释,因此在 JSON 文件中不能添加注释

  • 编码: 在网络传输时,需要确保 JSON 数据按照 UTF-8 或其他适当的编码进行编码

  • 错误处理: 解析 JSON 时要处理可能出现的解析错误,以及确保所生成的 JSON 是有效的

3、YAML 与 JOSON 格式的区别

可读性

  • YAML 擅长人类可读性,其缩进和简洁的语法使得文件更易于阅读和理解
  • JSON 更适合机器处理,尤其是在网络传输和数据交换方面

注释

  • YAML 支持注释,这使得可以在文件中添加解释和说明
  • JSON 标准不支持注释,因此在 JSON 文件中不能添加注释

使用场景

  • YAML 常用于配置文件、Docker Compose 文件等,由于其可读性好,非常适合人类编辑和阅读
  • JSON 常用于API通信、前后端数据交互等,由于其简洁性和广泛的支持,更适合机器处理

总体来说,YAML 更适合人类编辑和阅读,而 JSON 更适合机器处理和数据交换。在选择使用哪种格式时,需要考虑到具体的应用场景和需求

三、Docker-Compose.yml 文件格式

Docker-Compose.yml 文件采用 YAML 格式,用于定义 Docker Compose 应用程序的服务、网络和卷等

1、数据结构

1.1 对象映射:

  • 键值对的字典
  • 对象映射指的是在docker-compose.yml文件中定义的服务和它们的配置
  • 这些对象映射定义了每个服务的配置,以及如何运行这些服务
如:animal: pets
#符号字符“ : ”后必须缩进1个空格

1.2 序列数组

  • 一组按次序排列的列表
  • 序列数组是一种数据结构,用于表示一组有序的元素
  • docker-compose.yml文件中,序列数组通常用于定义多个相似的配置项,例如多个服务或多个环境变量
如:
- Cat
- Dog
- Goldfish或者
["Cat", "Dog", "Goldfish"]
示例:# yaml 格式
languages:   #序列的映射- Java- Golang- Python
websites:    #映射的映射cpu: 2memory: 1024Mswap: 2048Mdisk: 60G # Json 格式
{languages: ['Java','Golang','Python'	],resources: {cpu: '2',memory: '1024M',swap: '2048M',disk: '60G'}
}

1.3 布尔值

  • 布尔值可以用来表示真假值
  • 在 YAML 中,以下是表示布尔值的方式:

① true 和 false:分别表示真和假

② yes 和 no:分别表示真和假

③ on 和 off:分别表示真和假

④ 1 和 0:分别表示真和假

如:
debug: true
debug: false

2、Docker-Compose 配置常用字段

Docker-Compose 配置常用字段
字段说明
build指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile构建镜像上下文路径 dockerfile-nginx
context可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image指定镜像
command执行命令,覆盖容器启动后默认执行的命令
container_name指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment添加环境变量
networks加入网络,引用顶级networks下条目
network_mode设置容器的网络模式,如 host,bridge,...
ports暴露容器端口,与 -p 相同,但端口不能低于 60
volumes挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname容器主机名
sysctls在容器内设置内核参数
links连接到另外一个容器,- 服务名称[:服务别名]
privileged

用来给容器root权限,注意是不安全的,true | false

设置重启策略,no,always,no-failure,unless-stoped,no,默认策略,在容器退出时不重启容器

on-failure :在容器非正常退出时(退出状态非0),才会重启容器

on-failure:3 :在容器非正常退出时重启容器,最多重启3次

always :在容器退出时总是重启容器

unless-stopped :在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器

depends_on

在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败

例如:在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出depends_on标签用于解决容器的依赖、启动先后的问题

例如:

php:
  depends_on:
    - apache         #先启动apache
    - mysql           #再启动mysql

3、Docker-Compose 常用命令

Docker-Compose 常用命令
命令说明
build重新构建服务
ps用于显示当前Docker Compose项目中正在运行的服务的状态
up创建和启动容器
exec在容器里面执行命令
scale指定一个服务容器启动数量
top显示容器进程
logs查看容器输出
down删除容器、网络、数据卷和镜像
stop/start/restart

停止/启动/重启服务

四、Docker-Compose 环境安装

Docker-Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker-Compose

#关闭防火墙和核心防护
systemctl disable --now  firewalld
setenforce 0
#下载
cd /opt
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /opt#安装:下载到本地并添加权限就能直接使用
mv /opt/docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose #查看版本
docker-compose --version

五、 Docker-Compose 简单编排部署

1、Nginx Docker-Compose编排

1.1 建立工作目录并上传相关安装包

mkdir -p /opt/docker-compose-nginx/nginx
cd /opt/docker-compose-nginx/nginx
#需在此路径上传 nginx 安装包 nginx-1.12.0.tar.gz

1.2 编写 Nginx Dockerfile 脚本

vim Dockerfile#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <dh>
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.12.0.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
//方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf			#关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

若使用方法一,必须得创建启动容器时执行的脚本:

vim run.sh#!/bin/bash
/usr/local/nginx/sbin/nginx

1.3 创建网页目录和文件

mkdir -p /opt/docker-compose-nginx/html/
echo "<h1>this is nginx web</h1>" > /opt/docker-compose-nginx/html/index.html

1.4 编写配置文件 docker-compose.yml

vim /opt/docker-compose-nginx/docker-compose.yml
version: '3'
services:nginx:container_name: web1hostname: nginxbuild:context: ./nginxdockerfile: Dockerfileports:- 1212:80- 2121:443networks:lnmp:ipv4_address: 172.30.0.10volumes:- ./html:/usr/local/nginx/html
networks:lnmp:driver: bridgeipam:config:- subnet: 172.30.0.0/16

1.5 Nginx Docker-Compose 文件结构

yum install -y tree
tree /opt/docker-compose-nginx

1.6 启动 Docker 容器

cd /opt/docker-compose-nginx
docker-compose -f docker-compose.yml up -d
#-f, --file FILE:使用特定的 compose 模板文件,默认为 docker-compose.yml
#-p, --project-name NAME:指定项目名称,默认使用目录名称
#up: Docker Compose 要启动配置文件中定义的服务
#-d:在后台运行

docker images   #查看所有镜像
docker ps       #查看当前正在运行中的容器

cd /opt/docker-compose-nginx
docker-compose ps   #必须在docker-compose.yml所在目录执行此命令
#用于显示当前Docker Compose项目中正在运行的服务的状态

docker inspect web1    #查看指定容器的ip地址等信息

1.7 浏览器测试页面

2、nginx+tomcat docker-compose编排

在上述 Nginx Docker-Compose编排的基础上,加入tomcat

1.1 建立工作目录并上传相关安装包

mkdir -p /opt/docker-compose-nginx/tomcat
cd /opt/docker-compose-nginx/tomcat
#需在此目录上上传jdk-8u291-linux-x64.tar.gz、apache-tomcat-8.5.16.tar.gz

1.2 编写 Tomcat Dockerfile 脚本

vim DockerfileFROM centos:7
MAINTAINER tomcat image <dh>
ADD jdk-8u291-linux-x64.tar.gz /usr/local/  
# 将jdk……tar.gz文件解压到/usr/local/目录下
WORKDIR /usr/local/                         
# 为后续命令指定工作目录/usr/local/
RUN mv jdk1.8.0_291 /usr/local/java         
# 解压后的JDK目录重命名为java并移动到/usr/local/目录下
ENV JAVA_HOME /usr/local/java               
# 设置环境变量JAVA_HOME为/usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre               
# 设置环境变量JRE_HOME为${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib 
# 设置环境变量CLASSPATH,包含当前目录、Java库和JRE库 
ENV PATH $JAVA_HOME/bin:$PATH               
# 将JAVA_HOME/bin加入到PATH环境变量中
ADD apache-tomcat-8.5.16.tar.gz /usr/local/
WORKDIR /usr/local/                         
# 设置工作目录为/usr/local/
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat 
# 将解压后的Tomcat目录重命名为tomcat并移动到/usr/local/目录下
EXPOSE 8080                                 # 暴露容器的 8080 端口
#CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
# 设置容器启动时执行的命令为 /usr/local/tomcat/bin/catalina.sh run,以启动 Tomcat 服务
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]
# 设置容器启动时默认执行的命令为 /usr/local/tomcat/bin/startup.sh start,以启动Tomcat服务

1.3 修改配置文件 docker-compose.yml

#在services模块下继nginx后的添加tomcat
vim /opt/docker-compose-nginx/docker-compose.ymltomcat:hostname: tomcatbuild:context: ./tomcatdockerfile: Dockerfileports:- 8080:80networks:lnmp:
#注意格式对齐

1.4 Nginx+Tomcat Docker-Compose 文件结构

yum install -y tree
tree /opt/docker-compose-nginx

1.5 启动 Docker 容器

前提:必须删除之前使用该docker-compose.yml文件启动的容器

cd /opt/docker-compose-nginx
docker-compose down   #必须在docker-compose.yml所在目录执行此命令
#将删除由 docker-compose up 创建的所有容器、网络、数据卷和镜像
#如果你只想删除特定的容器、网络、数据卷或镜像,你可能需要使用 docker container rm, docker network rm, docker volume rm 和 docker image rm 等命令来手动删除它们

然后再启动 Docker 容器

cd /opt/docker-compose-nginx
docker-compose -f docker-compose.yml up -d
#-f, --file FILE:使用特定的 compose 模板文件,默认为 docker-compose.yml
#-p, --project-name NAME:指定项目名称,默认使用目录名称
#up: Docker Compose 要启动配置文件中定义的服务
#-d:在后台运行

docker images   #查看所有镜像
docker ps       #查看当前正在运行中的容器

cd /opt/docker-compose-nginx
docker-compose ps   #必须在docker-compose.yml所在目录执行此命令
#用于显示当前Docker Compose项目中正在运行的服务的状态

docker inspect ce482a4fb6e4    #查看指定容器的ip地址等信息

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

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

相关文章

全志ARM-蜂鸣器

sh操作准备&#xff1a; 1.使Tab键的缩进和批量对齐为4格 在/etc/vim/vimrc 中添加一项配置 set tabstop 4; 也可以再加一行 set nu显示代码的行数 vim的设置&#xff0c;修改/etc/vim/vimrc文件&#xff0c;需要用超级用户权限 /etc/vim/vimrc set shiftwidth4 设置批量…

【刷题篇】动态规划-二维费用的背包问题(十二)

文章目录 1、一和零2、盈利计划3、组合总和 Ⅳ4、不同的二叉搜索树(卡特兰数) 1、一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#x…

vue3 + ts 快速入门(全)

文章目录 学习链接1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue …

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

Android BINDER是干嘛的?

1.系统架构 2.binder 源码位置&#xff1a; 与LINUX传统IPC对比

题目:吃奶酪

问题描述&#xff1a; 解题思路&#xff1a; 枚举每种吃奶酪顺序&#xff0c;并计算其距离&#xff0c;选择最小的距离即答案。v数组&#xff1a;记录顺序。 注意点&#xff1a;1. 每次用于min的s需要重置为0。 2. 实数包括小数&#xff0c;所以结构体内x,y为double类型。 3. 第…

Python | Leetcode Python题解之第65题有效数字

题目&#xff1a; 题解&#xff1a; from enum import Enumclass Solution:def isNumber(self, s: str) -> bool:State Enum("State", ["STATE_INITIAL","STATE_INT_SIGN","STATE_INTEGER","STATE_POINT","STATE_…

Vue基础:为什么要学Vue3,Vue3相较于Vue2有那些优势?

为什么要学Vue3&#xff1f; 1.框架层面 1.响应式底层API的变化 Proxy 数组下标的修改 对象动态添加属性 解释说明&#xff1a;1.vue2采用的是Object.definePrototype&#xff0c;它每次只能对单个对象中的单个数据进行劫持&#xff0c;所以在Vue2中data()中的数据一多就要进行…

基础IO认识

回顾文件 我们之前认识文件只是在语言程度上理解&#xff0c;但是我们理解的不够彻底&#xff0c;要想真正理解文件要在os上理解。 简单代码认识 1 #include<stdio.h>2 int main(){3 FILE* fpfopen("log.txt","w");4 if(fpNULL){5 p…

leetcode_43.字符串相乘

43. 字符串相乘 题目描述&#xff1a;给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 &q…

蓝桥杯练习系统(算法训练)ALGO-951 预备爷的悲剧

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 英语预备爷gzp是个逗(tu)比(hao)&#xff0c;为了在即将到来的英语的quiz中不挂科&#xff0c;gzp废寝忘食复习英语附录单词…

SpringBoot 基础简介

目录 1. SpringBoot 概述 1.1. 为什么会有springboot 1.1.1. 传统Spring 的两个缺点 1.1.2. Springboot 功能 2. SpringBoot 快速搭建 2.1. 创建Maven项目​编辑​编辑​编辑 2.2. 导入SpringBoot起步依赖 2.3. 定义controller 2.4. 添加引导类 2.5. 启动访问 3. Sprin…

使用node调用chrome(基于selenium-webdriver包)

下载测试版chrome和chromedriver https://googlechromelabs.github.io/chrome-for-testing/ 把chromedriver复制到chrome的文件里 设置环境变量 编写代码 const { Builder, Browser, By, Key, until } require(selenium-webdriver) const puppeteer require(puppeteer)//查…

2024/5/2 英语每日一段

Enablers’ fate is inherently linked to adopters, which are their ultimate customers, after all. That dynamic won’t flip overnight, but adopters able to demonstrate progress on AI initiatives will increasingly get credit from investors in the form of high…

基于SSM的“一汽租车辆共享平台”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“一汽租车辆共享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 租车界面 订单管理界面 财务报表界面 理赔界面 …

I/O体系结构和设备驱动程序

I/O体系结构 为了确保计算机能够正常工作&#xff0c;必须提供数据通路&#xff0c;让信息在连接到个人计算机的CPU、RAM和I/O设备之间流动。这些数据通路总称为总线&#xff0c;担当计算机内部主通信通道的作用。 所有计算机都拥有一条系统总线&#xff0c;它连接大部分内部…

Java | Leetcode Java题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int n obstacleGrid.length, m obstacleGrid[0].length;int[] f new int[m];f[0] obstacleGrid[0][0] 0 ? 1 : 0;for (int i 0; i < n; i) {for (i…

二叉树的递归详解:以例题计算二叉树第k层为例

1.代码速览 1.1节点的构建 #include<iostream> using namespace std; class ListNode { public:friend void fun();friend int TreeKLevel(ListNode* root, int k);ListNode(int val):_val(val),leftnext(nullptr),rightnext(nullptr){} private:int _val 0;class Lis…

【doghead】ubuntu构建libuv

按照官方的文档2024年3月的版本。首先构建libuv 最终构建的还得了test 构建过程 zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/thunderbolt/ayame/zhb-bifrost$ ls Bifrost-202403 README.md draw player-only worker 大神的带宽估计.png zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/…

240503-关于VisualStudio2022社区版的二三事

240503-关于VisualStudio2022社区版的二三事 1 常用快捷键 快捷键描述AltEnter选中代码片段以提取方法Alt上下箭头移动选中的代码片段F12转到方法定义CtrlR*2批量修改选中的变量名称 2 自动生成构造函数 3 快速重写父类方法 4 节约时间&#xff1a;写代码使用“头插法”&…