什么是Docke,部署dockers,和基本操作命令

news2025/1/9 2:14:20

Docker简介

什么是容器

  • 容器是用来装东西的,Linux 里面的容器是用来装应用的;

  • 容器就是将软件打包成标准化单元,以用于开发、交付和部署;

  • 容器技术已经成为应用程序封装和交付的核心技术;

  • 容器原理:容器技术的核心,由以下几个内核技术组成:

    • Cgroups (Control Groups) :资源管理
    • SELinux:安全 (是针对于文件系统,文件的管理措施)
    • NameSpace:命名空间

命名空间

  • 是指可以对系统资源空间进行分割隔离的技术
  • 例如:创建一个虚拟机,在虚拟机里的所有操作,都不会对真实机造成影响。
  • 命名空间分为六大类,可以从各个方面来对系统资源空间进行隔离;
    • UTS:主机名隔离
    • NETWORK:网络隔离
    • MOUNT:文件系统隔离
    • USER:用户隔离
    • PID:进程隔离
    • IPC:信号向量隔离

Docker 的优缺点

  • 优点

    • 相比于传统的虚拟化技术,容器更加简洁高效
    • 传统虚拟机需要给每个 VM 安装操作系统
    • 容器使用的共享公共库和程序
  • 缺点

    • 容器的隔离性没有虚拟机强
    • 共用Linux内核,安全性有先天缺陷

在这里插入图片描述
Docker

使用Vmware的克隆以下机器,配置如下

主机名IP地址内存CPU
docker-0001192.168.8.1072G2
docker-0002192.168.8.1082G2

docker-0001配置IP地址和主机名

[root@template ~]# hostnamectl set-hostname docker-0001
[root@docker-0001 ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses  192.168.8.107/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254  connection.autoconnect yes
[root@docker-0001 ~]# nmcli connection up ens160
[root@docker-0001 ~]# dnf clean all
[root@docker-0001 ~]# dnf repolist
[root@docker-0001 ~]# dnf -y install lrzsz

docker-0002配置IP地址和主机名

[root@localhost ~]# hostnamectl set-hostname docker-0002
[root@docker-0002 ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.8.108/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254  connection.autoconnect yes
[root@docker-0002 ~]# nmcli connection up ens160
[root@docker-0002 ~]# dnf clean all
[root@docker-0002 ~]# dnf repolist
[root@docker-0002 ~]# dnf -y install lrzsz

Docker安装

docker安装(两台主机都要安装,以docker-0001为例)

开启路由转发,docker是通过虚拟交换机来进行通讯的,需要开启路由转发的功能

[root@docker-0001 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@docker-0001 ~]# sysctl -p              #sysctl -p 让配置立刻生效(否则需要重启虚拟机)

2024-AI大模型Java全链路工程师环境资料/第四模块/docker文件夹上传至虚拟机docker-0001和虚拟机docker-0002的/root

命令说明
docker version查看服务器与客户端版本
docker info查看 docker 服务配置信息
[root@docker-0001 ~]# dnf remove podman					#卸载冲突的软件包
[root@docker-0001 ~]# dnf remove runc
[root@docker-0001 ~]# dnf -y install lrzsz
[root@docker-0001 ~]# cd /root/docker
[root@docker-0001 ~]# dnf -y localinstall *.rpm			#安装docker
[root@docker-0001 docker]# systemctl start docker		#启动服务
[root@docker-0001 docker]# systemctl enable docker		#将服务设置为开机自启
[root@docker-0001 docker]# docker version				#查看版本

Docker镜像管理

什么是镜像

  • 镜像是启动容器的核心

  • 在Docker 中容器是基于镜像启动的

  • 镜像采用分层设计,使用 COW 技术

在这里插入图片描述

  • 容器本身是没有操作系统,和宿主机共用一个操作系统;

  • 容器是docker(容器的管理工具)使用镜像文件来启动的;

  • 镜像是启动容器的模板,镜像中存放的是应用程序(服务软件),例如: 有一个http的镜像文件,在这个镜像中就存放的是http的所有文件和变量;

  • 用户使用镜像启动容器时,会生成一个独立于镜像的容器层,并不会对镜像层产生任何影响;

  • 而且容器采用了cow(写时复制)的技术,用户可以使用一个镜像文件创建多个容器,互不干扰;

  • 镜像采用分层技术:

    • 用户可以根据自己的需求来制作镜像,例如:在镜像的第一层定义应用程序的变量,在镜像的第二层修改配置文件,在镜像的第三层进行应用软件的部署;
    • 分层做好镜像后,用户使用镜像启动容器时,可以选择根据镜像的哪一层来启动,类似快照还原;
  • 镜像来源

    • 镜像可以从官方镜像仓库下载https://hub.docker.com
    • 自己制作

添加镜像加速器

  • docker-0001和docker-0002都做此操作
  • 使用华为云的镜像加速器,每个人的都不一样
    在这里插入图片描述
    docker-0001操作
[root@docker-0001 ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["这里配置镜像仓库加速器地址"],
    "insecure-registries":[]
}
[root@docker-0001 ~]# systemctl restart docker 
[root@docker-0001 ~]# docker info
...
 Registry Mirrors:
  https://5af9fd904da541d2b1e38ab2771311a9.mirror.swr.myhuaweicloud.com/
 Live Restore Enabled: false

docker-0002操作

[root@docker-0002 ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["这里配置镜像仓库加速器地址"],
    "insecure-registries":[]
}
[root@docker-0001 ~]# systemctl restart docker 
[root@docker-0001 ~]# docker info
...
 Registry Mirrors:
  https://5af9fd904da541d2b1e38ab2771311a9.mirror.swr.myhuaweicloud.com/
 Live Restore Enabled: false

镜像管理

镜像管理命令说明
docker images查看本机镜像
docker pull 镜像名称:标签下载镜像
docker save 镜像名称:标签 -o 文件名备份镜像为tar包
docker load -i 备份文件名称导入备份的镜像文件
docker history 镜像名称:标签查看镜像的制作历史
docker search 关键字搜索镜像
[root@docker-0001 ~]# docker images          #还没有导入镜像,所以没有镜像
[root@docker-0001 ~]# docker search busybox
NAME     DESCRIPTION   			STARS  	OFFICIAL   AUTOMATED
busybox   Busybox base image.  	2010   	[OK] 
[root@docker-0001 ~]# docker pull busybox

查看镜像

[root@docker-0001 ~]# docker images
REPOSITORY     TAG      IMAGE ID       CREATED       SIZE
busybox        latest   6858809bf669   4 weeks ago   1.232 MB
#REPOSITORY  镜像名称
#TAG         镜像标签
#IMAGE ID    镜像ID号
#CREATED     镜像创建时间
#SIZE        镜像大小

镜像的备份与恢复

  • docker save 镜像名称:镜像标签 -o 备份文件夹(tar格式)
  • 恢复镜像(导入镜像):docker load -i 备份文件名称

docker-0001导出镜像(备份)

[root@docker-0001 ~]# docker save busybox:latest  -o /root/busybox.tar
#导出镜像busybox,需要指定名字和标签,导出到/root目录下,名称为busybox.tar
#名称和路径可以随意指定

拷贝备份镜像到docker-0002上

[root@docker-0001 ~]# scp /root/busybox.tar  192.168.8.108:/root/

docker-0002恢复镜像

[root@docker-0002 ~]# docker load -i busybox.tar 
[root@docker-0002 ~]# docker images 

2024-AI大模型Java全链路工程师环境资料/第四模块/myos.tar.xz上传至虚拟机docker-0001

[root@docker-0001 ~]# docker load -i myos.tar.xz				#导入镜像
[root@docker-0001 ~]# docker images 							#查看镜像
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myos         php-fpm   f70bdfd2042c   15 months ago   275MB
myos         nginx     10dc658da2fe   15 months ago   274MB
myos         latest    1de38c85c2d1   15 months ago   4.67MB
myos         httpd     9245e660f88f   15 months ago   299MB
myos         8.5       621bfd7f9b46   15 months ago   249MB
busybox      latest    beae173ccac6   2 years ago     1.24MB
rockylinux   8.5       210996f98b85   2 years ago     205MB

案例

  • 将rockylinux:8.5导出为rockylinux.tar,并在docker-0002上完成导入
  • docker-0001看镜像rockylinux:8.5的制作历史
[root@docker-0001 ~]# docker save rockylinux:8.5 -o rockylinux.tar		#导出镜像
[root@docker-0001 ~]# scp rockylinux.tar root@192.168.8.108:/root
[root@docker-0002 ~]# docker load -i rockylinux.tar 					#导入镜像
[root@docker-0002 ~]# docker images 									#查看镜像
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
rockylinux   8.5       210996f98b85   2 years ago   205MB
[root@docker-0001 ~]# docker history rockylinux:8.5			#由下到上,镜像可以分为3层 

Docker容器管理

容器管理命令说明
docker run -it(d) 镜像名称:标签创建容器
docker ps查看容器的信息
docker inspect 镜像名称|容器名称查询(容器/镜像)的详细信息
docker [start|stop|restart] 容器id启动、停止、重启容器
docker exec -it 容器ID 启动命令在容器内执行命令
docker cp 路径1 路径2拷贝文件:路径格式(本机路径、容器ID/路径)

运行容器

docker-0001使用myos:8.5启动容器

[root@docker-0001 ~]# docker run -it myos:8.5					#不加d选项直接进入容器
[root@9ddb443b9dac /]# exit
[root@docker-0001 ~]# docker run -itd myos:8.5					#加上d选项将容器放后台
d20df0c33f45e0b243afc5de3f5f3c6c41ef08ac343b2ca49f90d472c6dd4514
[root@docker-0001 ~]# 

docker-0001使用myos:nginx启动容器并放在后台运行

[root@docker-0001 ~]# docker run -itd myos:nginx 
0910a365ee6398a48bdfd0e191c758a5a24effb371b9e20e8efa12095e7dad24

查看容器

[root@docker-0001 ~]# docker ps
[root@docker-0001 ~]# docker ps -a			#ps -a 查看创建的所有的容器(运行的和已经停止的)
[root@docker-0001 ~]# docker ps -q			#ps -q 查看运行中容器的ID值
[root@docker-0001 ~]# docker ps -aq			 #ps -aq查看所有容器的id,用于脚本对容器的管理

删除容器(容器ID不能照抄,每个人都不一样)

[root@docker-0001 ~]# docker rm d20df0c33f

删除正在使用的容器时,会报错,无法删除,需要先停止容器,再执行删除命令

[root@docker-0001 ~]# docker stop 512567e6f64f		#停止容器
[root@docker-0001 ~]# docker rm 512567e6f64f

删除所有的容器:支持命令行重录,前一个命令的结果$(docker ps -aq)可以作为后一个命令的参数

[root@docker-0001 ~]# docker rm -f $(docker ps -aq)		#$()用来获取命令的执行结果

容器启动、停止、重启

[root@docker-0001 ~]# docker run -itd  nginx:latest 
[root@docker-0001 ~]# docker stop 38b8ee2a8754				#停止容器
[root@docker-0001 ~]# docker start 38b8ee2a8754				#启动容器			
[root@docker-0001 ~]# docker restart 38b8ee2a8754			#重启容器

查看镜像、容器信息

[root@docker-0001 ~]# docker inspect myos:8.5				#查看镜像信息
[root@docker-0001 ~]# docker inspect myos:nginx				#查看镜像信息
[root@docker-0001 ~]# docker inspect 38b8ee2a8754			#查看容器信息

拷贝文件

  • docker cp 本机文件路径 容器id:容器内路径(上传)

  • docker cp 容器id:容器内路径 本机文件路径(下载)

在第一个终端中执行

[root@docker-0001 ~]# docker run -itd --name xy myos:nginx 		#后台运行一个容器名字叫xy
[root@docker-0001 ~]# docker exec -it xy pwd					#查看容器工作目录

将容器内的数据拷贝至宿主机

[root@docker-0001 ~]# docker cp xy:/usr/local/nginx/html /opt/
[root@docker-0001 ~]# ls /opt/									#验证

将宿主机的数据拷贝至容器内部(/usr/local/nginx/html)

[root@docker-0001 ~]# docker cp  /etc/shells xy:/usr/local/nginx/html
[root@docker-0001 ~]# docker exec -it xy ls						#验证

其他管理命令

管理命令说明
docker rm 容器ID删除容器
docker logs 容器ID查看容器日志
docker tag 镜像ID:标签 镜像名称:新的标签创建新的镜像名称和标签
docker rmi 镜像名称:标签删除镜像(必须先删除该镜像启动的所有容器)
[root@docker-0001 ~]# docker rm 9ddb4		#根据容器ID删除容器
[root@docker-0001 ~]# docker rm -f xy		#根据容器名删除容器(-f可强制删除运行中的容器)
[root@docker-0001 ~]# docker rm -f $(docker ps -aq)		#删除所有容器
[root@docker-0001 ~]# docker run -itd --name xy myos:nginx		#运行容器
[root@docker-0001 ~]# docker logs xy 							#查看日志(不一定有)
  • 删除镜像,但是镜像不能有运行的容器
[root@docker-0001 ~]# docker rmi busybox:latest					#删除镜像busybox:latest
[root@docker-0001 ~]# docker images								#查看是否删除
  • 对myos:8.5镜像制作标签linux:latest
[root@docker-0001 ~]# docker tag 621bfd7f9b46 linux:latest
[root@docker-0001 ~]# docker images

进入容器

  • docker exec -it 容器id 命令

  • docker attach 容器id

  • exec不会以上帝进程的身份进入容器,所以退出容器的时候容器不会停止

[root@docker-0001 ~]# docker run -it myos:8.5 			#使用myos:8.5进入容器
[root@fa35a4ae902f /]# exit								#退出以后容器处于停止状态
[root@docker-0001 ~]# docker ps -a
[root@docker-0001 ~]# docker start fa35					#启动容器
[root@docker-0001 ~]# docker exec -it fa35 /bin/bash
[root@fa35a4ae902f /]# exit								#再次退出容器还是处于运行状态
[root@docker-0001 ~]# docker ps							#查看验证
  • attach 以上帝进程的身份,进入容器内部,当执行exit退出容器时,会结束整个容器,通常用于在测试时,查看报错信息,可以按快捷键Ctrl p q退出容器,但不关闭容器;
[root@docker-0001 ~]# docker attach fa35
[root@fa35a4ae902f /]# exit								#退出已停止
exit
[root@docker-0001 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND     
  • 在对容器的使用过程中,都是使用exec,新开一个进程的方式进入容器,进行操作;
  • 而attach 往往应用于调试,终端输出的情况;

自定义镜像

  • 镜像采用分层设计
  • 创建读写层
  • 修改配置
  • 重新打包
    在这里插入图片描述
  • 2024-AI大模型Java全链路工程师环境资料/第四模块/yum.tar.gz上传至虚拟机docker-0001和虚拟机docker-0002的/root

docker-0002使用rockylinux:8.5创建容器

[root@docker-0002 ~]# docker run -itd --name linux rockylinux:8.5
[root@docker-0002 ~]# docker cp yum.tar.gz linux:/root			#将yum客户端文件上传至容器
[root@docker-0002 ~]# docker exec -it linux /bin/bash			#进入容器

容器内部操作

[root@c92f2ba78f95 /]# rm -rf /etc/yum.repos.d/				#删除容器中原有yum客户端文件
[root@c92f2ba78f95 /]# tar -xf /root/yum.tar.gz -C /etc/	#释放新的客户端文件
[root@c92f2ba78f95 /]# ls /etc/yum.repos.d/					#验证
[root@c92f2ba78f95 /]# dnf clean all
[root@c92f2ba78f95 /]# dnf repolist -v
[root@c92f2ba78f95 /]# dnf install -y net-tools vim-enhanced tree bash-completion #装包
[root@c92f2ba78f95 /]# dnf install -y net-tools iproute procps-ng psmisc		  #装包
[root@c92f2ba78f95 /]# exit

docker-0002操作,打包新的镜像

[root@docker-0002 ~]# docker stop linux
[root@docker-0002 ~]# docker commit linux mylinux:latest
[root@docker-0002 ~]# docker images

测试验证 ,使用新镜像创建容器

[root@docker-0002 ~]# docker run -it mylinux:latest			#运行容器
[root@65b44ca03a4a /]# ifconfig eth0						#命令可以用
[root@65b44ca03a4a /]# pstree								#命令可以用

容器与应用

  • docker-0002机器使用mylinux:latest创建容器,并在容器中部署tomcat服务
  • 2024-AI大模型Java全链路工程师环境资料/第四模块/docker文件夹上传至虚拟机docker-0001和虚拟机docker-0002的/root
[root@docker-0002 ~]# docker run -itd --name tomcat mylinux:latest 		#后台运行容器
[root@docker-0002 ~]# docker cp apache-tomcat-9.0.6.tar.gz tomcat:/root	#拷贝tomcat至容器
[root@docker-0002 ~]# docker exec -it tomcat /bin/bash					#进入容器
[root@6c4f3e02470b /]# dnf -y install java-1.8.0-openjdk				#安装jdk
[root@6c4f3e02470b /]# cd /root
[root@6c4f3e02470b ~]# tar -xf /root/apache-tomcat-9.0.6.tar.gz			#安装tomcat
[root@6c4f3e02470b ~]# mv apache-tomcat-9.0.6 /usr/local/tomcat
[root@6c4f3e02470b ~]# /usr/local/tomcat/bin/startup.sh					#启动服务
[root@6c4f3e02470b ~]# ss -nutlp | grep java

容器中编写测试脚本

[root@6c4f3e02470b ~]# vim /usr/local/tomcat/webapps/ROOT/time.jsp
<html>
    <head>
        <meta charset='utf-8'>
    </head>
    <body>
        <center>
            Now time is: <%=new java.util.Date()%> <!--通过基类调用系统时间-->
        </center>
    </body>
</html>
[root@6c4f3e02470b ~]# ifconfig eth0					#查看容器IP地址			
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
[root@6c4f3e02470b ~]# exit								#退出容器
[root@docker-0002 ~]# curl http://172.17.0.2/time.jsp
<html>
    <head>
        <meta charset='utf-8'>
    </head>
    <body>
        <center>
            Now time is: Thu May 09 18:55:26 UTC 2024 <!--通过基类调用系统时间-->
        </center>
    </body>
</html>

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

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

相关文章

如何在STEP 7 (TIA Portal)中配置访问共享的设备及模块内部共享输入/输出(MSI/MSO)功能

通过模块内部共享输入/输出&#xff08;MSI/MSO&#xff09;功能&#xff0c;输入或输出模块可以将其输入或输出数据最多提供给4个IO控制器。 这篇文档介绍了如何在STEP 7 (TIA Portal)中配置访问共享的设备及模块内部共享输入/输出功能。可以在两个不同的项目里或同一个项目里…

24.8.3数据结构|双向循环链表、静态链表

双向循环链表 节点类型与双链表的节点类型完全相同双向循环链表的操作也与双链表的操作基本一致。 例题 将自然数一到N按由小到大的顺序沿顺时针方向围成一个圈&#xff0c;然后以一为起点先沿顺时针方向数到第N个数将其划去&#xff0c;再沿逆时针方向数到第K个数将其滑去&a…

密码加密机的功能模块

密码加密机&#xff0c;也称为加密机或硬件加密模块(HSM&#xff0c;Hardware Security Module)&#xff0c;是一种通过国家商用密码主管部门鉴定并批准使用的国内自主开发的主机加密设备。以下是对密码加密机的详细解析&#xff1a; 一、基本概述 定义&#xff1a;密码加密机是…

LabVIEW位移检测系统

工业控制器的位移检测在保证机械设备精确运行中发挥着重要的作用。开发了一种基于LabVIEW的高精度位移检测系统&#xff0c;该系统通过集成硬件与软件的优化配置&#xff0c;实现了对工业控制器位移的精确测量和分析。 项目背景 在传统工业生产中&#xff0c;位移检测系统往往…

macos 10.15系统:macOS Catalina for mac 正式版

macOS Catalina for mac (macos 10.15系统)详细的最新功能介绍&#xff0c;此次macOS Catalina 10.15.7正式版更新发布&#xff0c;本次更新主要为您的Mac提供了重要的安全性更新和错误修复。感兴趣的朋友&#xff0c;欢迎前来下载&#xff01; macOS Catalina 让你喜欢的种种…

JVM知识总结(CMS收集器)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ CMS收集器 CMS&#xff08;Concurrent Mark Sweep&#xff09;收集…

Spring Boot + Vue(4)授权查看信息

前言 在SpringBoot和Vue的组合中&#xff0c;实现一个查看商品详情信息需商品主人授权的功能&#xff0c;涉及到前后端的协作以及权限管理的设计。以下是一个基本的实现步骤和概念介绍&#xff1a; 一. 设计数据库模型 首先&#xff0c;你需要设计数据库模型来存储商品信息、用…

物镜球差透射AC-TEM的原理、步骤与数据分析-测试狗

物镜球差透射AC-TEM的原理、步骤与数据分析 物镜球差透射AC-TEM是一种高级的透射电子显微镜技术&#xff0c;它通过校正物镜球差来提高图像的分辨率和对比度&#xff1b;这种技术在材料科学、生物学、化学等领域的研究中发挥着重要作用。 一、原理 物镜球差透射AC-TEM的原理基…

代码随想录算法训练营第七天(一)| 454.四数相加II 383. 赎金信

454.四数相加II 题目&#xff1a; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1…

Debug小妙招·「1」--使用GDB分析进程Core Dump

使用GDB分析进程Core Dump 目录 Core Dump简介GDB简介生成Core Dump使用GDB分析Core Dump实例分析常见问题与解决方法1. Core Dump简介 什么是Core Dump 当程序崩溃(例如,由于非法内存访问或除零操作)时,操作系统会生成一个文件,称为core dump。这个文件包含了程序在崩溃时…

常见VPS服务器附加组件一览

网络主机行业竞争非常激烈&#xff0c;因此主机服务提供商竭尽全力为客户提供完整的解决方案&#xff0c;其中包含构建和管理在线项目所需的一切。但客户通常有特定需求&#xff0c;因此需要不同的附加组件。在管理自己的网络服务器时尤其如此。 今天&#xff0c;我们将介绍您…

无感陶瓷电阻器-EAK脉冲能量吸收电阻

EAK陶瓷电阻器系列投入批量生产。BA 系列的最大电阻为 1MΩ&#xff0c;电压高达 20kV。 在散装结构中表现出色 EAK 的无感陶瓷电阻器设计用于需要高电压、高能量和高峰值电流电阻器的应用。固有的非感性电阻器是通过本体结构产生的&#xff0c;而不是蜿蜒曲折或转弯产生的。这…

Django内置后端和自定义后端

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 5.2.3 内置…

java学习笔记 day8.6

修改数据 1.修改数据时判断name参数不为空且非空字符串,判断salary是不为空则添加记录 <update id"editStaffItem">update staff<set><if testname!null and name!"">name#{name},</if><if test"salary!null">sa…

LearnOpenGL-光照章节(颜色、基础光照、材质、光照贴图)

LearnOpenGL-光照章节&#xff08;颜色、基础光照、材质、光照贴图&#xff09; 颜色创建一个光照场景 基础光照一、环境光照二、漫反射光照三、镜面反射 材质光照贴图一、漫反射贴图二、镜面光贴图三、放射光贴图 颜色 我们在现实生活中看到某一物体的颜色并不是这个物体真正…

Unity强化工程 之 SpriteShape(精灵地形编辑器)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1.什么是SpriteShape&#xff1f; SpriteShape 是一个灵活且功能强大的世界构建资源&#xff0c;它可以沿着形状的轮廓进…

基于springboot+vue+uniapp的“口腔助手”小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

秒懂C++之deque及反向迭代器

目录 前言 一.deque的常用接口 二.deque的原理 2.1 vector与list的优缺点 2.2 deque的原理 三.反向迭代器 四.全部代码 前言 秒懂C之List-CSDN博客 秒懂C之vector&#xff08;下&#xff09;-CSDN博客 本文后面关于反向迭代器的操作会涉及到前面的文章~ 一.deque的常用接…

WriterSide 文档、接口自动编译并部署到GitPage

WriterSide 自动编译并部署到GitPage 1. GitHub 创建空仓库2. 配置GitHub 仓库的编译部署方式3. WriteSide 创建项目4. 创建自动、编译部署配置文件5. 自动编译、部署1. GitHub 创建空仓库 在 GitHub 创建一个空的仓库 仓库创建成功后, 记录仓库的远程地址 仓库地址需要修改…

弥散制氧机与变压吸附制氧机的差异

在氧气供应领域&#xff0c;弥散制氧机和变压吸附制氧机是常见的两种设备&#xff0c;它们在工作原理、性能特点、应用场景等方面存在着显著的区别。 工作原理&#xff1a; 弥散制氧机是通过富氧膜的渗透作用&#xff0c;将空气中的氧气分离并富集&#xff0c;从而提供一定浓度…