2docker

news2024/12/1 0:46:16

1586333742105

一、引言


1.1 环境不一致

我本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。

1.2 隔离性

哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自己编些的程序。

1.3 弹性伸缩

淘宝在双11的时候,用户量暴增:需要很多很多的运维人员去增加部署的服务器,运维成本过高的问题。

1.4 学习成本

学习一门技术,得先安装啊:学习每一门技术都要先安装响应的软件,但是还有他所依赖的各种环境,安装软件成本快高过学习成本啦。

二、Docker介绍


2.1 Docker的由来

一帮年轻人创业,创办了一家公司,2010年的专门做PAAS平台。但是到了2013年的时候,像亚马逊,微软,Google都开始做PAAS平台。到了2013年,公司资金链断裂,不得不倒闭,于是将公司内的核心技术对外开源,核心技术就是Docker。由于开源了Docker,到了2014年的时候,得到了C轮的融资 $4000W,2015年的时候,得到了D轮的融资.$9500W。于是公司开始全神贯注的维护Docker。

Docker主要作者-所罗门
1586340594252
Docker的作者已经离开了维护Docker的团队
1586340639934

2.2 Docker的思想

  • 集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。

  • 标准化:

    • 运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派大海疼去搬运这个集装箱就可以了。
    • 命令的标准化:Docker提供了一些列的命令,帮助我们去获取集装箱等等操作。
    • 提供了REST的API:衍生出了很多的图形化界面,Rancher。
  • 隔离性:Docker在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。

  • 中央仓库|注册中心:超级码头,上面放的就是集装箱

  • 镜像:就是集装箱

  • 容器:运行起来的镜像

三、Docker的安装


3.1 下载Docker依赖的环境

想安装Docker,需要先将依赖的环境全部下载,就像Maven依赖JDK一样

yum -y install yum-utils device-mapper-persistent-data lvm2

3.2 指定Docker镜像源

默认下载Docker会去国外服务器下载,速度较慢,我们可以设置为阿里云镜像源,速度更快

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.3 安装Docker

依然采用yum的方式安装

yum makecache fast
yum -y install docker-ce

3.4 启动Docker并测试

安装成功后,需要手动启动,设置为开机自启,并测试一下Docker

# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试    运行hello-world 镜像 根据这个镜像 创建容器
docker run hello-world

四、Docker的中央仓库【重点


  • Docker官方的中央仓库:这个仓库是镜像最全的,但是下载速度较慢。

    https://hub.docker.com/

  • 国内的镜像网站:网易蜂巢,daoCloud等,下载速度快,但是镜像相对不全。

    https://c.163yun.com/hub#/home

    http://hub.daocloud.io/ (推荐使用)

  • 在公司内部会采用私服的方式拉取镜像,需要添加配置,如下……

配置阿里云镜像仓库
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

# 需要创建/etc/docker/daemon.json,并添加如下内容
{
	"registry-mirrors": ["https://registry.docker-cn.com"],
	"insecure-registries": ["ip:port"]   
}
# 重启两个服务
systemctl daemon-reload
systemctl restart docker

五、镜像的操作【重点


5.1 拉取镜像

从中央仓库拉取镜像到本地

docker pull 镜像名称[:tag]

# 举个栗子:docker pull daocloud.io/library/tomcat:8.5.15-jre8

5.2 查看本地全部镜像

查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小

docker images

5.3 删除本地镜像

镜像会占用磁盘空间,可以直接手动删除,表示通过查看获取

docker rmi 镜像的标识

5.4 镜像的导入导出

如果因为网络原因可以通过硬盘的方式传输镜像,虽然不规范,但是有效,但是这种方式导出的镜像名称和版本都是null,需要手动修改

# 将本地的镜像导出
docker save -o 导出的路径 镜像id         # docker save -o /usr/local/tmp/mytomcat8 b8dfe9ade316
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

六、容器操作【重点


6.1 运行容器

运行容器需要指定具体镜像,如果镜像不存在,会直接下载

# 简单操作
docker run 镜像的标识|镜像名称[:tag]

# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d:代表后台运行容器
# -p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
# --name 容器名称:指定容器的名称

6.2 查看正在运行的容器

查看全部正在运行的容器信息

docker ps [-qa]
# -a:查看全部的容器,包括没有运行
# -q:只查看容器的标识

6.3 查看容器日志

查看容器日志,以查看容器运行的信息

docker logs -f 容器id
# -f:可以滚动查看日志的最后几行

6.4 进入容器内容部

可以进入容器内部进行操作

docker exec -it 容器id    bash

出去: ctrl + p + q

6.5 复制内容到容器

将宿主机的文件复制到容器内部的指定目录

docker cp 文件名称 容器id:容器内部路径

将容器内部的文件复制到宿主机

docker cp 容器id:容器目录    宿主机目录

6.6 重启&启动&停止&删除容器

容器的启动,停止,删除等操作,后续经常会使用到

# 重新启动容器
docker restart 容器id

# 启动停止运行的容器
docker start 容器id

# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)

# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)

6.7提交运行时容器成为镜像

docker commit -a='作者' -m='备注' 运行时容器ID 新镜像名称

6.8查看容器元信息

docker inspect 容器id

6.9 设置容器自动启动

docker update --restart=always 容器id

七、Docker应用


7.1 Docker安装Tomcat

运行Tomcat容器,为部署SSM工程做准备

docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8

7.2 Docker安装MySQL

运行MySQL容器,为部署SSM工程做准备

docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4

7.3 部署SSM工程

  • 修改SSM工程环境,设置为Linux中Docker容器的信息
  • 通过Maven的package重新打成war包
  • 讲Windows下的war包复制到Linux中
  • 通过docker命令将宿主机的war包复制到容器内部
  • 测试访问SSM工程

八、数据卷【重点


为了部署SSM的工程,需要使用到cp的命令将宿主机内的ssm.war文件复制到容器内部。

数据卷:将宿主机的一个目录映射到容器的一个目录中。

可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变。

8.1 创建数据卷

创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data

docker volume create 数据卷名称

8.2 查看数据卷详情

查看数据卷的详细信息,可以查询到存放路径,创建时间等等

docker volume inspect 数据卷名称

8.3 查看全部数据卷

查看全部数据卷信息

docker volume ls

8.4 删除数据卷

删除指定数据卷

docker volume rm 数据卷名称

8.5 容器映射数据卷

映射有两种方式:

  • 通过数据卷名称映射,如果数据卷不存在。Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。
  • 通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置。但是这个路径下是空的。
# 通过数据卷名称映射
docker run -v 数据卷名称:容器内部的路径 镜像id
# 通过路径映射数据卷
docker run -v 路径:容器内部的路径 镜像id

九、Dockerfile自定义镜像


我们可以从中央仓库下载一个镜像,也可以自己手动去制作一个镜像,需要通过Dockerfile去指定自定义镜像的信息

9.1 Dockerfile

创建自定义镜像就需要创建一个Dockerfile,如下为Dockerfile的语言

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于操作系统(centos或者Ubuntu)基础镜像并最终创建的一个新镜像;

我们前面讲过的用手工的方式,修改配置文件,或者添加,删除文件目录的方式,来构建一种新镜像;这种手工方式麻烦,容易出错,而且不能复用;
我们这里讲Dockerfile,用脚本方式来构建自动化,可复用的,高效率的创建镜像方式,是企业级开发的首选方式;

再软件系统开发生命周期中,采用Dockerfile来构建镜像;
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;
3、对于运维人员:在部署时,可以实现应用的无缝移植。

from: 指定当前自定义镜像依赖的环境  指定基础镜像 一切从这里开始构建
copy: 将相对路径下的内容复制到自定义镜像中
workdir: 声明镜像的默认工作目录
run: 执行的命令,可以编写多个
cmd: 需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准)

# 举个例子,制作SSM容器镜像,而且ssm.war要放在Dockerfile的同级目录下
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps

9.2 通过Dockerfile制作镜像

编写完Dockerfile后需要通过命令将其制作为镜像,并且要在Dockerfile的当前目录下,之后即可在镜像中查看到指定的镜像信息,注意最后的 .

docker build -t 镜像名称[:tag] .

十. Docker-Compose【重点


之前运行一个镜像,需要添加大量的参数,可以通过Docker-Compose编写这些参数。而且Docker-Compose可以帮助我们批量的管理容器。这些信息只需要通过一个docker-compose.yml文件去维护即可。

10.1 下载并安装Docker-Compose

10.1.1 下载Docker-Compose

去github官网搜索docker-compose,下载1.24.1版本的Docker-Compose

下载路径:https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64

10.1.2 设置权限

需要将DockerCompose文件的名称修改一下,给予DockerCompose文件一个可执行的权限

mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
10.1.3 配置环境变量

方便后期操作,配置一个环境变量

将docker-compose文件移动到了/usr/local/bin , 修改了/etc/profile文件,给/usr/local/bin配置到了PATH中

mv docker-compose /usr/local/bin

vi /etc/profile
# 添加内容: export PATH=$JAVA_HOME:/usr/local/bin:$PATH

source /etc/profile

个人建议的安装方式

# 直接联网下载到本地     /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

cd /usr/local/bin   # 进入该目录
chmod 777 docker-compose     # 给这个文件授权


# 在任意目录 测试  docker-compose  命令
10.1.4 测试

在任意目录下输入docker-compose

测试效果
1586420176720

10.2 Docker-Compose管理MySQL和Tomcat容器

yml文件以key: value方式来指定配置信息

多个配置信息以换行+缩进的方式来区分

在docker-compose.yml文件中,不要使用制表符

version: '3.1'
services:
  mysql:           # 服务的名称
    restart: always   # 代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/mysql:5.7.4  # 指定镜像路径
    container_name: mysql  # 指定容器名称
    ports:
      - 3306:3306   #  指定端口号的映射
    environment:
      MYSQL_ROOT_PASSWORD: root   # 指定MySQL的ROOT用户登录密码
      TZ: Asia/Shanghai        # 指定时区
    volumes:
     - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql   # 映射数据卷
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.5.15-jre8
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

10.3 使用docker-compose命令管理容器

在使用docker-compose的命令时 ,默认会在当前目录下找docker-compose.yml文件

# 1. 基于docker-compose.yml启动管理的容器
docker-compose up -d

# 2. 关闭并删除容器
docker-compose down

# 3. 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart

# 4. 查看由docker-compose管理的容器
docker-compose ps

# 5. 查看日志
docker-compose logs -f

10.4 docker-compose配合Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器

10.4.1 docker-compose文件

编写docker-compose.yml文件

# yml文件
version: '3.1'
services:
  ssm:
    restart: always
    build:            # 构建自定义镜像
      context: ../      # 指定dockerfile文件的所在路径
      dockerfile: Dockerfile   # 指定Dockerfile文件名称
    image: ssm:1.0.1
    container_name: ssm
    ports:
      - 8081:8080
    environment:
      TZ: Asia/Shanghai
10.4.2 Dockerfile文件

编写Dockerfile文件

from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
10.4.3 运行

测试效果

# 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
docker-compose up -d
# 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
# 重新构建的话。
# 重新构建自定义镜像
docker-compose build
# 运行当前内容,并重新构建
docker-compose up -d --build

十一. Docker CI、CD 砍掉不讲


11.1 CI、CD引言

项目部署

  • 将项目通过maven进行编译打包
  • 将文件上传到指定的服务器中
  • 将war包放到tomcat的目录中
  • 通过Dockerfile将Tomcat和war包转成一个镜像,由DockerCompose去运行容器

项目更新后,需要将上述流程再次的从头到尾的执行一次,如果每次更新一次都执行一次上述操作,很费时,费力。我们就可以通过CI、CD帮助我们实现持续集成,持续交付和部署。

11.2 CI介绍

CI(continuous intergration)持续集成

持续集成:编写代码时,完成了一个功能后,立即提交代码到Git仓库中,将项目重新的构建并且测试。

  • 快速发现错误。
  • 防止代码偏离主分支。

11.3 搭建Gitlab服务器

实现CI,需要使用到Gitlab远程仓库,先通过Docker搭建Gitlab

11.3.1 准备工作
  • 创建一个全新的虚拟机,并且至少指定4G的运行内存,4G运行内存是Gitlab推荐的内存大小。
  • 并且安装Docker以及Docker-Compose
11.3.2 修改ssh的22端口

将ssh的默认22端口,修改为60022端口,因为Gitlab需要占用22端口

vi /etc/ssh/sshd_config
  PORT 22 -> 60022
systemctl restart sshd
11.3.3 编写docker-compose.yml

docker-compose.yml文件去安装gitlab(下载和运行的时间比较长的)

version: '3.1'
services:
 gitlab:
  image: 'twang2218/gitlab-ce-zh:11.1.4'
  container_name: "gitlab"
  restart: always
  privileged: true
  hostname: 'gitlab'
  environment:
   TZ: 'Asia/Shanghai'
   GITLAB_OMNIBUS_CONFIG: |
    external_url 'http://192.168.199.110'
    gitlab_rails['time_zone'] = 'Asia/Shanghai'
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['gitlab_shell_ssh_port'] = 22
  ports:
   - '80:80'
   - '443:443'
   - '22:22'
  volumes:
   - /opt/docker_gitlab/config:/etc/gitlab
   - /opt/docker_gitlab/data:/var/opt/gitlab
   - /opt/docker_gitlab/logs:/var/log/gitlab

11.4 搭建GitlabRunner

查看资料中的gitlab-runner文件即可安装

11.5 整合项目入门测试

11.5.1 创建项目

创建maven工程,添加web.xml文件,编写html页面

11.5.2 编写.gitlab-ci.yml

编写.gitlab-ci.yml文件

stages:
  - test

test:
  stage: test
  script:
    - echo first test ci   # 输入的命令
11.5.3 将maven工程推送到gitlab中

执行git命令推送到Gitlab

git push origin master
11.5.4 查看效果

可以在gitlab中查看到gitlab-ci.yml编写的内容

效果图
1588671760385

11.6 完善项目配置

添加Dockerfile以及docker-compose.yml, 并修改.gitlab-ci.yml文件

11.6.1 创建Dockerfile
# Dockerfile
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps
11.6.2 创建docker-compose.yml
# docker-compose.yml
version: "3.1"
services:
  testci:
    build: docker
    restart: always
    container_name: testci
    ports:
      - 8080:8080
11.6.3 修改.gitlab-ci.yml
# ci.yml
stages:
  - test

test:
  stage: test
  script:
    - echo first test ci
    - /usr/local/maven/apache-maven-3.6.3/bin/mvn package
    - cp target/testci-1.0-SNAPSHOT.war docker/testci.war
    - docker-compose down
    - docker-compose up -d --build
    - docker rmi $(docker images -qf dangling=true)
11.6.4 测试
测试效果
1588674040060

11.7 CD介绍

CD(持续交付,持续部署)

持续交付:将代码交付给专业的测试团队去测试

持续部署:可以直接将指定好tag的代码直接部署到生产环境中

CICD图
1588677492583

11.8 安装Jenkins

11.8.1 编写docker-compose.yml

官网:https://www.jenkins.io/

version: "3.1"
services:
  jenkins:
   image: jenkins/jenkins
   restart: always
   container_name: jenkins
   ports:
     - 8888:8080
     - 50000:50000
   volumes:
     - ./data:/var/jenkins_home
11.8.2 运行并访问Jenkins

第一次运行时,会因为data目录没有权限,导致启动失败

chmod 777 data

访问http://192.168.199.109:8888

访问速度奇慢无比。。。。。

访问成功后,需要输入密码,可在日志中查看

1588679573467

手动指定插件安装:指定下面两个插件即可

publish ssh.

git param.

1588679653006

安装成功后,需要指定上用户名和密码,登陆成功

1588681196639

11.9 配置Jenkins的目标服务器

执行过程为代码提交到Gitlab,Jenkins会从Gitlab中拉取代码,并在Jenkins中打包并发布到目标服务器中。

idea写代码 -----Gitlab <-----Jenkins ----->目标服务器

下面的操作 是让 jenkins 连接目标服务器

11.9.1 点击左侧的系统设置
左侧导航
1588681954779
11.9.2 选中中间区域的系统设置
系统设置
1588681970621
11.9.3 搜索Publish over SSH
Publish over SSH
1588682011820
11.9.4 点击上图新增
新增SSH连接
1588682092002

image-20200923094630017

11.10 配置GitLab免密码登录

链接Gitlab需要使用密码,我们可以通过SSH的方式,免密码登陆Gitlab拉取代码,避免每次都输入密码。

11.10.1登录Jenkins容器内部
docker exec -it jenkins bash
11.10.2 输入生成SSH秘钥命令
ssh-keygen -t rsa -C "邮箱(随便写)"
进入     cd /var/jenkins_home/.ssh/     目录   找到 id_rsa.pub 
把这个文件内容  复制到下面图中所示
11.10.3将秘钥复制到GitLab的SSH中
配置密钥
1588683585249

11.11 配置JDK和Maven

我们需要再Jenkins中将代码打包,需要依赖JDK和Maven的环境

11.11.1 复制软件到data目录下
效果
1588684490466
11.11.2 在监控界面中配置JDK和Maven
配置环境变量
1588684458028
11.11.3 手动拉取gitlab项目

使用SSH无密码连接时,第一次连接需要手动确定

手动拉取一次
1588685220324

11.12 创建maven任务

实现通过Jenkins的Maven任务,自动去Gitlab拉取代码,并在本地打包,发布到目标服务器上

11.12.1 创建maven工程,推送到GitLab中

随便创建一个即可……

11.12.2 Jenkins的监控页面中创建maven任务
指定GitLab地址
1588686481506
指定maven打包方式
1588686489821
11.12.3 执行maven任务
立即构建,并查看日志
1588686591351
控制台查看日志信息
1588686553880
11.12.4 最终效果
打包成功
1588687382594

11.13 实现持续交付持续部署

实现根据tag标签,实现持续交付和持续部署

11.13.1 安装Persistent Parameter的插件
安装插件
1588693533099
11.13.2 重新指定构建项目的方式
根据标签构建项目
1588696879059
自定义构建
1588697752850
11.13.3 构建项目成功后,需要将内容发布到目标服务器
发布服务器后执行的命令
1588697770621
11.13.4 添加程序代码
# Dockerfile 文件
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testcd-1.0-SNAPSHOT.war /usr/local/tomcat/webapps

# docker-compose.yml文件
version: "3.1"
services:
  testcd:
    build: docker
    restart: always
    container_name: testcd
    ports:
      - 8081:8080
11.13.5 测试
根据标签修改发布版本
1588700462690

| 1588696879059 |

自定义构建
1588697752850
11.13.3 构建项目成功后,需要将内容发布到目标服务器
发布服务器后执行的命令
1588697770621
11.13.4 添加程序代码
# Dockerfile 文件
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testcd-1.0-SNAPSHOT.war /usr/local/tomcat/webapps

# docker-compose.yml文件
version: "3.1"
services:
  testcd:
    build: docker
    restart: always
    container_name: testcd
    ports:
      - 8081:8080
11.13.5 测试
根据标签修改发布版本
1588700462690

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

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

相关文章

基于Java+SpringBoot制作一个校园圈子小程序

制作一个校园圈子小程序,有效连接信息供需双方,用户可获取和发布需求信息、参与互动交流,适用于同校、同城、社区交流、客户互动、同学/老师注册发布信息等场景。 微信小程序实战开发专栏 一、小程序1.1 项目创建1.2 首页轮播图九宫格

Golang语法控制初识

Golang语法控制初识 采用文章 https://www.runoob.com/go/go-operators.html程序流程控制 在程序中&#xff0c;程序运行的流程控制决定程序是如何执行的&#xff0c;是我们必须掌握的&#xff0c;主要有三大流程控 制语句。 顺序控制分支控制循环控制 5.2 顺序控制 顺序控…

数智人力:现代企业解决人才短缺的新途径

后疫情时代&#xff0c;市场人才供需持续扩张。受疫情影响&#xff0c;人才市场供给总量较为充裕&#xff0c;但满足企业需求、符合业务调整方向的核心人才却仍然紧俏。供需双方在行业、地域以及岗位技能上往往存在错位&#xff0c;就业的结构性矛盾突出。 大型企业在解决人才…

数据结构与算法总结——Python版

目录 数据结构相关知识一.算法1. 哈希表是什么&#xff1f;2. 什么是时间复杂度&#xff1f;3. 空间复杂度4. 递归4. 查找4.1、顺序查找4.2. 二分查找 5. 排序5.1. 冒泡排序5.2. 选择排序5.3. 插入排序5.4. 快速排序5.5. 堆排序5.5.1.树5.5.2. 堆 5.6. 归并排序5.7. 希尔排序5.…

基于云计算的检验所云LIS系统源码(两癌筛查)

一、云LIS系统是基于云计算和使用B/S架构开发的实验室&#xff08;检验科&#xff09;管理系统&#xff0c;整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器访问。SaaS服务&#xff0c;无需部署&#xff0c;开通账号接口快速入门使用&#xff0c;集齐…

代理模式(CGLIB和JDK)

文章目录 一. 简介1. 生活中的代理案例2. java中代理模式的应用3. 什么是代理模式 二. 如何实现代理1. 简介2. 静态代理3. 动态代理 三. JDK中的动态代理1. 介绍2. 测试3. 原理分析4. 原理图 四. CGLIB中的动态代理1. 简介2. 案例3. 底层原理分析 一. 简介 1. 生活中的代理案例…

什么是Odoo ERP:部署方式、业务集成、成本投入、发展与未来

ERP部署的类型 如何部署ERP 系统&#xff1f;通过多年的发展&#xff0c;ERP系统的部署方式更加多样化&#xff0c;包括公有云或私有云部署、本地部署或整合不同环境的混合部署场景&#xff0c;企业可根据自身条件与应用场景加以选择。下面介绍了每种部署模式的主要优势&#…

kafka系统的CAP保证

kafka系统的CAP保证 CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中&#xff1a; 一致性&#xff08;Consistency&#xff09;可用性&#xff08;Availability)分区容错性&#xff08;Partition tolerance&#xff09; 最多满足其中的两个特性。…

Window winget 包管理工具安装踩坑记录

一、简介 想在 window 上安装一个好用的包管理工具&#xff0c;mac 上用 homebrew, window 则考虑再三&#xff0c;使用官方提供的 winget。 winget 官方使用文档。 二、安装流程与踩坑记录 按 win x&#xff0c;选择 Powershell&#xff08;管理员&#xff09; 方式打开 c…

【严重】Linux kernel ksmbd 模块远程代码执行漏洞

漏洞描述 ksmbd 是 Linux kernel 的一个模块&#xff0c;用于提供 SMB&#xff08;Server Message Block&#xff09;文件共享协议的支持&#xff0c;SMB2_TREE_DISCONNECT 命令用于断开客户端与服务器之间的文件共享连接。 Linux kernel 受影响版本中&#xff0c;由于 ksmbd…

SpringBoot Filter使用

filter就是其他框架中的中间件,在SpringBoot启动时有很多默认加载的Filter 例如: characterEncodingFilterhiddenHttpMethodFilterhttpPutFormContentFilterrequestContextFilter Filter存在一个优先级, 数值越小越靠前 这有两个常量用来表顺顺序 Ordered.HIGHEST_PRECEDENCE…

webpack处理样式资源(css less sass scss)

Webpack 本身是不能识别样式资源的&#xff0c;所以我们需要借助 Loader 来帮助 Webpack 解析样式资源 一、处理css样式资源 去项目根目录新建css文件夹&#xff0c;在css文件夹下新增index.css文件&#xff0c;内容如图&#xff1a; 在src-main.js中引入css->index.css文…

各个AI模型写2023年广东高考作文大比拼

今天是一年一度的高考开始的日子&#xff0c;寒窗苦读十二年&#xff0c;剑指今朝。 作为过来人&#xff0c;当年的高考场景还历历在目。这里先预祝各位莘莘学子&#xff0c;高考正常发挥&#xff0c;旗开得胜&#xff0c;马到功成&#xff0c;考上心中理想的大学。 今天早上是…

《精通特征工程》学习笔记(3):特征缩放的效果-从词袋到tf-idf

1.TF-IDF原理 tf-idf 是在词袋方法基础上的一种简单扩展&#xff0c;它表示词频 - 逆文档频率。tf-idf 计算的不是数据集中每个单词在每个文档中的原本计数&#xff0c;而是一个归一化的计数&#xff0c;其中每个单词的计数要除以这个单词出现在其中的文档数量。 词袋bow(w, …

面向对象的特征三:多态性

1.多态性的理解&#xff1a; 可以理解为一个事物的多种形态。 2.何为多态性&#xff1a; 对象的多态性&#xff1a;父类的引用指向子类的对象&#xff08;或子类的对象赋给父类的引用&#xff09; 可以直接应用在抽象类和接口上 举例&#xff1a;Person p new Man(); O…

场景营销解密:出海品牌在全球市场的差异化策略

品牌出海是企业扩大国际市场份额、实现全球化发展的必经之路。然而&#xff0c;面对激烈的全球竞争和多样化的消费者需求&#xff0c;仅仅依靠传统的广告宣传手段已经无法满足品牌推广的需求。而场景营销则通过创造具有情境感的消费体验&#xff0c;更好地满足了消费者的参与需…

手写分布式事务的一种回滚方案。

1&#xff1a;项目架构 我一个朋友的公司基于实际业务的考虑&#xff0c;选择了多个单体项目来组建成一个分布式系统。&#xff08;对于目前来说分布式的系统最好采用微服务的架构来实现项目搭建。但基于许多客户只能采用内网的使用&#xff0c;微服务反而会影响项目的复杂度&a…

STM32ADC学习(一)

ADC 模拟/数字转换器 常见ADC类型 并联比较型工作示意图 ADC的特性参数 分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;用二进制位数来表示。例如3.3V&#xff0c;12位&#xff0c;能辨别的最小模拟量就是&#xff1a;&#xff08;3.3/4096&#xff09;转换时间&#x…

【面试题HTTP中的两种请求方法】GET 和 POST 有什么区别?

GET 和 POST 有什么区别&#xff1f; 1.相同点和最本质的区别1.1 相同点1.2 最本质的区别 2.非本质区别2.1 缓存不同2.2 参数长度限制不同2.3 回退和刷新不同2.4 历史记录不同2.5 书签不同 总结代码示例 GET 和 POST 是 HTTP 请求中最常用的两种请求方法&#xff0c;在日常开发…

练手必备,20个Python实战项目含源代码

“读”代码是不能给你带来任何收益的&#xff0c;正如“读书”一样&#xff0c;如果在读的时候你不琢磨&#xff0c;保管你读完仨月准忘了一大半。真正需要的是去“试”代码&#xff0c;动手去调调代码&#xff0c;改改这改改那&#xff0c;看看把A变成B这个代码的结果会有什么…