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

news2024/11/16 20:25:28

文章目录

  • 一、应用部署
    • 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

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

网安渗透攻击作业(4)

Unload-labs-01 function checkFile() { var file document.getElementsByName(upload_file)[0].value; if (file null || file "") { alert("请选择要上传的文件!"); return false; } //定义允许上传的文件类型 v…

面渣逆袭:Java基础面试题,46道Java基础八股文(4.8万字,30+手绘图)

1、什么是 Java&#xff1f; Java是一种广泛使用的编程语言&#xff0c;由Sun Microsystems&#xff08;现为Oracle Corporation的一部分&#xff09;在1995年首次发布。它是一种面向对象的语言&#xff0c;这意味着它支持通过类和对象的概念来构造程序。 Java设计有一个核心理…

软件工程-第5章 结构化设计

5.1 总体设计的目标及其表示方法 5.2 总体设计 变换设计基本步骤&#xff1a; 第1步&#xff1a;设计准备--复审并精华系统模型&#xff1b; 第2步&#xff1a;确定输入、变换、输出这三部分之间的边界&#xff1b; 第3步&#xff1a;第一级分解--系统模块结构图顶层和第一层…

arcgis数据导出到excel

将arcgis属性数据导出到excel&#xff1a; 1&#xff09; 工具箱\系统工具箱\Conversion Tools.tbx\Excel\Excel 转表 2&#xff09;用excel打开导出的图层文件中后缀为.dbf的数据&#xff08;方便快捷&#xff0c;但是中文易乱码&#xff09;

GPT-5:人工智能的下一个前沿即将到来

当我们站在人工智能新时代的门槛上时&#xff0c;GPT-5即将到来的呼声愈发高涨且迫切。作为革命性的GPT-3的继任者&#xff0c;GPT-5承诺将在人工智能领域迈出量子跃迁式的进步&#xff0c;其能力可能重新定义我们与技术的互动方式。 通往GPT-5之路 通往GPT-5的旅程已经标记着…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FolderStack)

FolderStack继承于Stack(层叠布局)控件&#xff0c;新增了折叠屏悬停能力&#xff0c;通过识别upperItems自动避让折叠屏折痕区后移到上半屏 说明&#xff1a; 该组件从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件…

探秘atoi与atof的模拟之路:从原理到实践的全能指南!

目录 ​编辑 一.atoi及atof库函数的工作原理 1.1atoi 1.2atof 1.3使用时的注意事项 注意事项 1. 检查输入字符串是否为 NULL 2. 检查字符串是否仅包含有效的数字字符 3. 检查转换结果是否在预期范围内 4. 使用更健壮的替代函数 二. 模拟实现atoi和atof 2.1模拟 atoi…

罗马不是一天建成的:DevOps 转型分步指南

“罗马不是一天建成的”这句格言非常适合 DevOps。许多公司都渴望通过“闪电战”获得市场主导地位的即时满足感&#xff0c;但DevOps 的真正成功是一场马拉松&#xff0c;而不是短跑。它需要致力于建立可持续的 DevOps 文化——一种从头开始促进协作、自动化和安全性的文化。 …

计算机设计大赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

Linux编程4.8 网络编程-建立连接

1、服务器端 #include <sys/types.h> #include <sys/socket.h>int listen(int sockfd, int backlog);返回&#xff1a;成功返回0&#xff0c;出错返回-1。参数&#xff1a;sockfd:套接字的文件描述符backlog:定义了sockfd的挂起连接队列可能增长的最大长度。…

使用 ZipArchiveInputStream 读取压缩包内文件总数

读取压缩包内文件总数 简介 ZipArchiveInputStream 是 Apache Commons Compress 库中的一个类&#xff0c;用于读取 ZIP 格式的压缩文件。在处理 ZIP 文件时&#xff0c;编码格式是一个重要的问题&#xff0c;因为它决定了如何解释文件中的字符数据。通常情况下&#xff0c;Z…

【新手】win10安装nodejs V16.9.0详细教程

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【数据挖掘】练习2:数据管理1

课后作业2&#xff1a;数据管理1 一&#xff1a;上机实验1 # 读入数据 data("CO2") # 查看数据集CO2中的变量名称&#xff0c;并将变量Treatment的名称更改为Treat names(CO2) names(CO2)[names(CO2) "Treatment"] <- "Treat" names(CO2)…

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…

WanAndroid(鸿蒙版)开发的第四篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

共谋企业出海新篇章纷享销客荣获数字中国企业峰会“卓越成果奖”

3月9日&#xff0c;2024数字中国企业峰会在杭州西湖中维香溢大酒店成功举办&#xff0c;众多数字化领域专家、知名企业 CIO 代表到场。峰会旨在推动数字化转型与创新发展&#xff0c;为企业出海和国际合作搭建交流与合作的平台。本次峰会的颁奖环节&#xff0c;纷享销客凭借其卓…

c++的const总结(转)

为什么使用const&#xff1f;采用符号常量写出的代码更容易维护&#xff1b;指针常常是边读边移动&#xff0c;而不是边写边移动&#xff1b;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)&#xff0c;分类如下&#xff1a;…

二类医疗器械经营备案怎么办?怎么办理?二类的有效期多久?

第二类医疗器械工商登记怎么办&#xff1f; 这就是本文的主要内容。 下面&#xff0c;我们给大家分享一下第二类医疗器械工商登记的要求和材料。 经营第二类医疗器械只需到当地药品监督管理部门办理工商登记即可。 那么第二类医疗器械注册时应该怎么做呢&#xff1f; 第二类医疗…

计算机毕业设计 | vue+springboot 在线花店后台管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着社会发展&#xff0c;网上购物已经成为我们日常生活的一部分。但是&#xff0c;至今为止大部分电商平台都是从人们日常生活出发&#xff0c;出售都是一些日常用品比如&#xff1a;食物、服装等等&#xff0c;并未发现一个专注于鲜花的电商…

Linux:搭建ntp服务器

我准备两个centos7服务器 一个为主服务器连接着外网&#xff0c;并且搭建了ntp服务给其他主机同步 另外一个没有连接外网&#xff0c;通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器&#xff0c;主…