Docker入门二(应用部署、迁移与备份、DockerFile、docker私有仓库、Docker-Compose)

文章目录

  • 一、应用部署
    • 1.MySQL部署
    • 2.Redis部署
    • 3.Nginx部署
  • 二、迁移与备份
    • 1.容器做成镜像
    • 2.镜像备份和恢复(打包成压缩包)
  • 三、DockerFile
    • 0.镜像从哪里来?
    • 1.什么是DockerFile
    • 2.DockerFile 构建特征
    • 3.DockerFile命令描述
    • 4.构建一个带vim的centos镜像案例
    • 5.DockerFile构建Django项目
  • 四、docker私有仓库
    • 1.镜像传到官方仓库
    • 2.镜像分层
    • 3.私有仓库创建
      • docker搭建私有仓库(registry,这个是没有图形化界面)
  • 五、Docker-Compose介绍及下载
    • 1.介绍docker-compose
    • 2.下载docker-compose
    • 3.docker-compose常用命令
  • 六、使用docker-compose部署flask-redis项目

一、应用部署

1.MySQL部署

	'在dokcer中部署mysql,以后不需要在宿主机上装mysql'
	1.做端口映射
		docker run -id --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7
	2.做目录映射
		-如果没有做目录映射,在mysql容器中表数据一旦删除就所有都没有了,一旦做了目录映射,重新创建相同的,数据会在里面还在
		1.docker pull mysql:5.7  拉取镜像
		2.mkdir /mysql  # 创建文件夹数据分离  在根目录下
		  mkdir /mysql/conf.d
		  mkdir /mysql/data/
		'创建好文件 写入配置'
	  	3.vim /mysql/my.cnf  # 如果在宿主机上没有安装vim,就使用vi创建
	  	  '写入数据,就是和本机上面安装的mysql的配置文件差不多参数'
	  	[client]
		default-character-set=utf8
		[mysqld]
		user=mysql
		character-set-server=utf8
		default_authentication_plugin=mysql_native_password
		secure_file_priv=/var/lib/mysql
		expire_logs_days=7
		sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
		max_connections=1000
		4.做目录映射  # 基于镜像运行成容器 端口映射3306 目录映射
		docker run -di -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7
		5.本地链接好容器mysql5.7,创建库、创建表,插入数据
		6.关闭容器,删除容器,这样mysql的容器就没有了,但是数据还在宿主机上放着
			docker stop mysql5.7
			docker rm mysql5.7
		'这个时候删除容器 数据还在 只需要再创建一个新的容器 做好目录映射就可以继续使用了,目录保持一致,密码保持一致'

2.Redis部署

	
	1.docker pull redis 	# 拉取redis镜像,不写版本默认latest
	2.mkdir /root/data    # 根目录创建data文件夹
	3.vim /root/redis.conf  # 创建并编辑redis配置文件
		bind 0.0.0.0
		daemonize NO
		protected-mode yes
		requirepass 1234
	4.运行创建
		-启动容器时,运行的命令是什么 redis-server /etc/redis/redis.conf
		-在容器运行时,可以自己定制运行命名 举例:docker run -id centos:centos7 ls
		docker run -id  -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis  redis-server /etc/redis/redis.conf
	5.运行redis容器,并写入数据,用本地能链接redis的软件链接一下查看,或者直接cmd链接
		docker exec -it redis /bin/bash
		'容器redis链接'
		redis cli  # 链接
		auth xxxx # 密码
		'cmd窗口链接查看'
		redis-cli -h ip地址 -p 端口号
		auth 密码
		'resp链接:填入链接名称(随意填)、地址、密码即可'

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.Nginx部署

1.docker pull nginx 	# 拉取nginx镜像
'没做映射操作'
2.docker run -id --name=nginx -p 80:80 nginx  # run起容器
3.从win机器浏览器可以访问:xx.xxx.xx:80
4.进入容器内部,修改index    /usr/share/nginx/html
	docker exec -it nginx /bin/bash
5.修改index.html
	vi、vim、yum都没有因为不是Centos系统
	apt-get update
	apt-get install vim
'做映射操作'
6.做目录映射
	# /usr/share/nginx/html
	-docker run -id --name nginx1 -p 8088:80 -v /root/html:/usr/share/nginx/html nginx
	-cd /root/html
	-vi index.html  随便填入html文本 <h1>hello world!</h1>
	-进入到容器内部后到/usr/share/nginx/html目录就可以看到映射过来的index.html文件了
	'以后只需要修改宿主机的/root/html 路径,看到页面就是修改后的'

在这里插入图片描述
在这里插入图片描述

二、迁移与备份

1.容器做成镜像

	-镜像从哪来的?
		1 docker pull 拉的
	    2 通过容器打包成镜像
	    	-centos镜像运行成容器---》装了vim
	        -把装了vim的容器---》打包成镜像
	        -以后拿到这个镜像--》再运行成容器,都会带vim命令
	        
	    3 Dockerfile构建

	-容器保存为镜像
		-运行一个centos容器
		docker run -id --name centos_vim centos:centos7
		-在容器中装vim
		docker exec -it a6e240 /bin/bash
		yum install vim -y
		
		-把容器做成镜像(centos+vim)  需要退出容器,在宿主机上操作
		docker commit 容器名 镜像名
		docker commit centos_vim centos_vim
		
		-把centos_vim 容器删除
		docker rm centos_vim -f
		-基于新构建的镜像,运行成容器
		docker run -id --name centos_vim centos_vim:latest
		-进入到容器中,查看,软件都在
		docker exec -it c3e633bd1 /bin/bash

2.镜像备份和恢复(打包成压缩包)

	'镜像的备份和恢复'
	-把镜像做成压缩包
		docker save -o 压缩包名	镜像名/镜像id
		docker save -o mynginx.tar nginx  	# 把镜像做成tar文件
	-删除原有镜像
	-把备份的镜像恢复
		docker load -i 压缩包名
		docker load -i mynginx.tar			# 把压缩包load成镜像

三、DockerFile

0.镜像从哪里来?

	1 远程仓库拉取的 docker pull   (hub.docker---》搭建私有仓库)
    2 用容器做成的镜像 docker commit 
    3 把备份的恢复 docker load
    4 使用Dockerfile来构建(这种多)

1.什么是DockerFile

Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件
利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像(定制镜像)文件名必须叫Dockerfile。

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

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

2.DockerFile 构建特征

1.DockerFile必须具备一个FROM命令来进行构建
2.每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交后,产生新的镜像层)
3.通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID

在这里插入图片描述

3.DockerFile命令描述

	详细指令介绍:https://zhuanlan.zhihu.com/p/419175543
	
	'常用命令'
	FROM: 指定基础镜像
	RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build
	CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改
	ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
	:为镜像添加对应的数据。
	MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
	ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
	ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
	ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件
	COPY:将本地文件或目录拷贝到镜像的文件系统中。
	WORKDIR:设置工作目录
	
	'''不怎么常用命令'''
	EXPOSE:设置对外暴露的端口。
	VOLUME:添加数据卷
	USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
	ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
	STOPSIGNAL:设置容器退出时发出的关闭信号。
	HEALTHCHECK:设置容器状态检查。
	SHELL:更改执行shell命令的程序。Linux的默认shell是[/bin/sh”,-c”],Windows的是[“cmd”,/S”,/C”]'CMD与ENTRYPOINT'
	1.相同点:
		只能写一条,如果写了多条,那么只有最后一条生效。
		容器启动时才运行,运行时机相同。
	2.不同点:
		ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖。
		如果我们在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
	
	
	'ARG 和 ENV'
		ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
		ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失

在这里插入图片描述
在这里插入图片描述

4.构建一个带vim的centos镜像案例

	'构建一个带vim的centos:7镜像,根路径下有/jack/xx.py'

	1.在宿主机上创建一个文件(文件名必须叫Dockerfile),文件里面书写下面的
		-vim Dockerfile
			'''
			ENV 环境变量
			touch 创建文件
			echo 输出 等同于print
			echo 'xxx' > /xx.py   > 就是放入到指定文件中
			mv 1.txt test.txt  mv移动,也可以是重命名
			copy 复制到指定文件中
			workdir jack 工作目录,创建完毕后进入时会直接进入到这个目录
			'''
			FROM centos:centos7
			MAINTAINER WhiteG
			ENV name jack
			RUN yum install vim -y &&\
			mkdir /jack &&\
			touch /jack/xx.py &&\
			echo 'print(hello world)' > /jack/xx.py
			COPY ./test.txt /jack/test.txt
			WORKDIR /jack
			'''
			注意如果在这里使用了CMD命令,例如CMD ['python' './jack/xx.py'],
			运行容器时会默认加上 /bin/bash -c(可以在docker images 的COMMAND看) 这个是以shell形式,运行时,linux默认会加上的
			'''
			'然后保存退出,也可以查看一下 cat Dockerfile是否修改内容成功'

	2.基于dockerfile构建镜像, '.' 是基于当前路径下的Dockerfile 构建镜像  
		-docker build -t='centos_jack_vim' .

	3.可以查看是否构建成功镜像   docker images
	4.基于这个构建的镜像运行成容器
		# 因为建构的镜像没有写版本,默认就是latest,只要是latest,可写可不写
		- docker run -id --name xx centos_jack_vim:latest
		'上面的CMD命令方式运行,会自动加上/bin/bash -c 所以我们可以修改直接在把镜像运行成容器时添加启动命令即可'
		'docker run -id --name xx centos_jack_vim python /jack/xx.py'
	
	5.进入到容器内
		-docker exec -it xx /bin/bash
	6.验证vim,和文件夹,文件是否存在
		-使用python的方式查看环境变量
			1.python中,导入模块 import os
			2.os.environ.get('name')  # 获取对应环境变量
		-使用shell命令查看环境变量
			echo $name  # 使用echo输出即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.DockerFile构建Django项目

	'在公司中,使用Docker开发的工作流程:'
	1.开发完一个Django项目
    2.然后在项目路径下新建Dockerfile,编辑下面内容:
        FROM python:3.8
        MAINTAINER WhiteG
        WORKDIR /soft
        COPY ./requirements.txt /soft/requirements.txt
        RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
        CMD ["python","manage.py","runserver","0.0.0.0:8080"]
        
	3.把代码提交到git/或者私有仓库中
		'这里我以git 为例'
		-git init # 初始化
		-然后git仓库创建新的空仓库,然后粘贴对应的命令
		-git add .
		-git commit -m '' # 提交到版本库
		-git push origin master 
		
	4.在部署项目的机器上,clone(克隆)项目
		-在部署项目的机器上安装 yum install git
		-git clone https://gitee.com/xxxx/xxxxx.git
		
	5.构建镜像 ,cd到对应的文件夹中 执行构建命令
		-docker build -t='django_books' .   # 点表示从当前路径的Dockerfile中构建镜像
		
	6.把刚刚构建的镜像运行成容器,并做目录映射、端口映射
		-docker run -id --name=books -v /root/docker_books:/soft -p 8080:8080 django_books:latest
		"""
		如果镜像不是django_books目录下构建的,它是找不到dockerfile文件的
		解决方法:停止容器  删除容器  删除镜像  切到books下新构建新镜像
		"""
	7.这样直接访问宿主机的8080端口就能看到项目的前端页面了
	
	8.后续只需要开发人员继续提交代码到仓库(push)
	
	9.运维人员在部署的机器上拉取仓库代码(pull),然后重启容器,这样就可以直接看到最新的页面了
		-注意需要再第一次拉取的项目文件夹中拉取,否则无效
		-cd docker_books 
		-git pull origin master
		-docker restart books # 重启容器
	'''
	注意:如果是开发修改了项目依赖,然后修改requirements.txt,就需要重写构建镜像,然后在运行容器的操作了,
	如果是开发修改代码逻辑,为了做版本区分,也是需要做新版本镜像,这样也是需要重构新镜像
	'''

四、docker私有仓库

docker官方提供的远程仓库,可以把自己定义的镜像传上去,就是自己的私有镜像(可公开)。公司做的镜像一般不放在远程仓库,会放在公司自己搭建私有仓库(把公司制作的镜像传到私有仓库)

1.镜像传到官方仓库

0步:在远端创建仓库
	第一步:给镜像打标签
		docker tag 本地镜像名:标签  你的名字/镜像名字:标签
        例如:docker tag centos:centos7   0jchen/centos7:latest
        
	第二步:登录到远程仓库(官方的hub.docker)
		docker login  # 输入注册的docker官方账号和密码
		
	第三步:将镜像提交docker远程仓库
	    docker push 0jchen/centos7:latest
	    
	第四步:别人就可以下载了
		docker pull 0jchen/centos7:latest

2.镜像分层

每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID.

	'只要执行一个命令就会多一层,例如:'
		-RUN yum install vim -y
		-RUN yum install git -y
		-这样就会多出好几层,这也是为什么我上面的一个案例里面会把RUN命令都合并的写(&&),这样能减少镜像分层的层数
		
	'查看镜像分层的命令'
		docker history  镜像名:版本
	'而分层少的的好处:构建快,分发方便,如果本地有某一层了,这一层就不需要下载了'

	'所以以后:Dockerfile写命令,建议多条命令合为一条,这样就只会生成一层,例如:'
		-使用了\就是换行,这样在Dockerfile文件中就可以换行写,不然就只能一行的写,观看效果不好
		RUN python -m pip install --upgrade pip &&\
        python -m pip install --upgrade setuptools &&\
        pip install -r requirements.txt

在这里插入图片描述

3.私有仓库创建

企业级的私有仓库Harbor (有图形化界面,跟hub.docker 很像),harbor部署与使用具体自行搜索即可

docker搭建私有仓库(registry,这个是没有图形化界面)

	'Harbor就是封装了Docker的registry v2,然后做了图形化界面'
	这里就演示搭建一个registry私有仓库

	'搭建步骤:(使用docker搭建docker私有仓库)'
	1.拉取registry镜像
		docker pull registry
		
	2.registry镜像运行成容器
		docker run -di --name=registry -p 5000:5000 registry

	3.这是个web服务端,所以需要从浏览器中访问它
		-打开浏览器 输入地址http://10.0.0.110:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
	4.修改daemon.json
		vi /etc/docker/daemon.json  # 这个之前创建的时候配置过国内镜像下载
		# 配置私有仓库的地址,就是ip地址+端口号
	    {
	        "insecure-registries":["10.0.0.110:5000"]  
	    } 
    5.重启docker和重启容器,让配置生效
    	systemctl restart docker
    	docker start registry
   	6.把某个镜像tag成私有仓库的镜像
   	 	docker tag 镜像名字/id IP地址:端口/私有仓库镜像名:版本  # 版本可以不填,默认latest
   	 	docker tag django_books 10.0.0.110:5000/django_books
	7.提交到私有仓库
		docker push 10.0.0.110:5000/django_books
	8.其他人,只要配置了私有仓库就可以直接拉取
		docker pull 10.0.0.110:5000/django_books

五、Docker-Compose介绍及下载

1.介绍docker-compose

使用docker部署项目时,会存在一个问题,例如一个Django项目中,把mysql、redis都放在一个容器中,之后不好使用服务,如果每个服务放在一个容器,批量管理多个容器,比较难操作,于是出现了docker-compose

docker-compose是一个能一次性定义和管理多个Docker容器的工具,单机容器编排【定义和管理】。Compose中定义和启动的每一个容器都相当一个服务(service),Compose中能定义和启动多个服务,且它们之间通常具有协同关系。管理方式:

  1. 使用YAML文件来配置我们应用程序的服务。
  2. 使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务。

多容器编排的工具:

	-docker swarm:公司里用的不多
	-k8s是多机容器编排工具,go语言写了k8s

2.下载docker-compose

安装docker-compose (可执行文件,放在了github上,下载下来即可,速度很慢)
https://github.com/docker/compose/releases
'然后找到自己想要的对应版本的docker-compose复制链接即可,例如docker-compose-linux-x86_64 v2.24.6版本'
https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64

-使用压缩包形式下载
1.在docker上安装yum install wget -y
	wget https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64
2.本地下载上传到docker上
'因为去github官方下载很慢,所以我这里选择自己在本地下载好,使用yum install lrzsz软件'
	rz 从本地文件中导入进来

-复制目录
'想在任意路径下执行docker-compose都有相应反应,就需要把可执行文件放到环境变量所在的目录下'
cp ./docker-compose /usr/local/bin/docker-compose 
/usr/local/bin/ 这个目录就是在环境变量当中

-给执行的权限
chmod +x /usr/local/bin/docker-compose
'''
+x linux中的执行权限,具体可自行查找资料
ls -al  查看权限
rwx    rwx    rwx
属主   属组   其他
 r:read 读权限 
 w:wirte 写权限
 x:执行权限

chmod +x 表示添加执行权限
chmod +r 表示添加读权限
chmod +w 表示添加写权限

属主   属组  所有人
chmod  777   文件名   777就是最高权限三个rwx全都有

--------------------

rwx   rwx   rwx
000	  000   000  使用二进制来表示每个rwx的三位,二进制只有0、1
(逢二进一[第一位需要到二就第二位为一],到第二位进第三位也是逢二进一),所以一个rwx就需要7,因此三个rwx就是777

例如:chmod 555 文件名
当rwx中有为零的则用-表示,如果全为零---表示
r-x  r-x  r-x
101  101  101
这个例子就是表示只有当前文件的所有的读权限和执行权限
'''  

-这样以后在任意位置敲docker-compose都可以


'''
补充:使用epel源 (epel源为“红帽系”的操作系统提供的额外的软件包,适用于RHEL,CentOS)
我们正常下载就去centos系统对应的仓库下载(别的系统就去它对应的系统仓库下载)
但是仓库的软件不够全面,只提供了一些常规的
这就是为什么要使用epel源,epel源,是一个扩展源,这个源仓库软件非常多,像nginx、redis等等都可以直接下载
这个源唯一的缺点就是不能指定下载的镜像版本

具体如何下载及配置自行查找资料,yum install -y epel-release 安装
'''

在这里插入图片描述
在这里插入图片描述

3.docker-compose常用命令

	常用命令
	# 启动管理容器
	docker-compose up  # 会自动搜索当前路径下的 docker-compose.yml文件
	docker-compose -f 指定文件 up
	docker-compose up -d  # 后台执行,一般我们看日志输出,不用这个
	
	docker-compose stop  # 停止,不会删除容器和镜像
	docker-compose down # 停止,并删除关联的容器
	docker-compose start  # 启动yml文件管理的容器
	docker-compose ps    # 正在运行的容器
	docker-compose images # docker-compose管理的镜像
	
	docker-compose exec yml文件中写的service /bin/bash  # 进入到容器内

六、使用docker-compose部署flask-redis项目

flask项目,使用redis服务---->2个容器

1. 新建flask项目app.py

from flask import Flask
from redis import Redis
import os

app = Flask(__name__)
# redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
# 容器的主机名---》flask容器和redis容器是能ping通的(同一个网段),可以通过ip ping 也可以通过主机名ping
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello(): 
    redis.incr('hits')
    return '你好! 查看 %s 次\n' % (redis.get('hits'))


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

2. 编写Dockerfile构建flask项目

FROM python:3.9
WORKDIR /app
COPY . /app
RUN pip install flask redis -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
EXPOSE 5000
CMD [ "python", "app.py" ]

# 构建出镜像,一会统一使用 docker-compose构建

3. 编写docker-compose 的yml文件docker-compose.yml

'注意,必须要缩进好'
version: "3"
services:
  redis:
    image: redis
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:5000
    environment:
      REDIS_HOST: redis

4. docker-compose启动

1.使用docker-compose构建并启动(一键部署:redis,和flask ,每个都在一个容器中)
	docker-compose up
2.ping redis  连接
 # 进入到了web,ping redis
    # 安装ping命令,
    apt-get update
    apt-get install inetutils-ping
    ping redis

3.这样删除后,在使用docker-compose up可以直接一键自动部署好
	docker-compose up
		-构建flask镜像
	    -reids镜像如果不存在,就会拉取
	    -启动flask
	    -启动redis

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle Primavera Analytics 是什么,与P6的关系?

前言 Oracle Primavera P6 Analytics 是与P6有关的一个相对较新的模块&#xff0c;Primavera 用户社区在很大程度上尚未对其进行探索。 那么它到底有什么作用呢&#xff1f; 通过了解得知它旨在通过深入了解组织的项目组合绩效&#xff0c;帮助高级管理层对其项目组合做出更好…

【开源】SpringBoot框架开发就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

MySQL | 表的约束

目录 1. 空属性 NULL 2. 默认值 DEFAULT 3. 列描述comment 4. zerofill 5. 主键 PRIMARY KEY 6. 自增长AUTO_INCREMENT 7. 唯一键UNIQUE 8. 外键 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数…

VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决

第一篇&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/aoxuestudy/article/details/124312629 error:There’ no Qt version assigned to project mdi.vcxproj for configuration release/x64.Please assign a Qt installation in “Qt Project Settings”. 一、分…

AG32 MCU以太网应用实例demo

一. 前言 AGM32系列32位微控制器旨在为MCU用户提供新的自由度和丰富的兼容外设&#xff0c;以及兼容的引脚和功能。AG32F407系列产品具有卓越的品质&#xff0c;稳定性和卓越的价格价值。 AG32产品线支持其所有接口外设尽可能接近主流兼容性&#xff0c;并提供丰富的参考设计…

机器人路径规划:基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(提供Python代码)

一、深度优先搜索算法介绍 深度优先搜索算法&#xff08;Depth-First-Search&#xff09;的基本思想是沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所有边都己被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已…

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.16 主要内容&#xff1a;今天主要是结合类型的题目加深对回溯算法的理解&#xff1a;1&#xff1a;组合总和&#xff1b;2&#xff1a;电话号码的字母组合 216.组合总和III17.电话号码的字母…

维基百科推广秘诀13个方法助你成为行业领导者-华媒舍

维基百科&#xff08;Wikipedia&#xff09;作为全球最大、最权威的在线百科全书&#xff0c;拥有海量的知识内容&#xff0c;被广大用户广泛使用。对于任何一个领域的从业者来说&#xff0c;建立自己的维基百科页面&#xff0c;无疑是提升行业影响力的重要手段。本文将向您介绍…

LEETCODE 100255. 成为 K 特殊字符串需要删除的最少字符数

整体思路: 1.可以看到这道题是要求是最小的&#xff0c;那么可以想到遍历所有情况 2.把题干已知条件转换为一个数组&#xff0c;那么只需要以数组每个元素为开头遍历所有情况即可。 3.对于一个数考虑其后面的情况&#xff0c;其后每个数等于这个数k和数本身的最小值(遍历累计求…

【C语言】指针基础知识(一)

计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中。 一,内存和地址 内存被分为一个个单元&#xff0c;一个内存单元的大小是一个字节。 内存单元的编号&#xff08;可以理解为门…

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的Thin…

ubuntu安装docker的详细教程

检查卸载老版本docker ubuntu下自带了docker的库&#xff0c;不需要添加新的源。 但是ubuntu自带的docker版本太低&#xff0c;需要先卸载旧的再安装新的。 注&#xff1a;docker的旧版本不一定被称为docker&#xff0c;docker.io 或 docker-engine也有可能&#xff0c;所以卸…

Hypermesh碰撞安全之头部撞击模拟

1、首先到自定义工作面板中选择Engineering Solutions(工程解决方案&#xff09; 2、进入行人保护建模流程模块 3、导入所需要的模型 4、对模型进行切割&#xff0c;选择所需要保留的区域 5、单击next进入下一界面 6、选择打击类型 下一步进入&#xff1a; 这样就完成了打击点…

基于深度学习的唇语识别系统的设计与实现

概要 人工智能作为三大工程之一&#xff0c;从上个世纪至今仍然活跃于各个行业的研究与应用之中&#xff0c;应时代的热潮方向&#xff0c;本 课题主要针对深度学习技术应用于唇语识别当中&#xff0c;实现词语唇语的翻译功能。唇语识别在图像处理中一直是一个富 有挑战性的课题…

基础知识学习 -- qnx 系统

QNX是一个基于优先级抢占的系统。 这也导致其基本调度算法相对比较简单。因为不需要像别的通用操作系统考虑一些复杂的“公平性”&#xff0c;只需要保证“优先级最高的线程最优先得到 CPU”就可以了。 基本调度算法 调度算法&#xff0c;是基于优先级的。QNX的线程优先级&a…

【LabVIEW FPGA入门】单周期定时循环

单周期定时循环详解 单周期定时环路是FPGA编程中最强大的结构之一。单周期定时循环中的代码更加优化&#xff0c;在FPGA上占用更少的空间&#xff0c;并且比标准While循环中的相同代码执行得更快。单周期定时环路将使能链从环路中移除&#xff0c;以节省FPGA上的空间。…

C++算法学习心得八.动态规划算法(4)

1.零钱兑换&#xff08;322题&#xff09; 题目描述&#xff1a; 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。…

QTextToSpeech的使用——Qt

前言 之前随便看了几眼QTextToSpeech的帮助就封装使用了&#xff0c;达到了效果就没再管了&#xff0c;最近需要在上面加功能&#xff08;变换语速&#xff09;&#xff0c;就写了个小Demo后&#xff0c;发现不对劲了。 出现的问题 场景 写了个队列添加到语音播放子线程中&a…

多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)

设计模式是什么 类似于棋谱一样的东西 计算机圈子里的大佬为了能让小菜鸡的代码不要写的太差 针对一些典型的场景, 给出了一些典型的解决方案 这样小菜鸡们可以根据这些方案(ACM里面叫板子, 象棋五子棋里叫棋谱, 咱这里叫 设计模式), 略加修改, 这样代码再差也差不到哪里去 … …