Docker的架构与自制镜像的发布
一. Docker 是什么 Docker与自动化测试及其测试实践
大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来和真实操作系统一模一样,当废弃不用时直接删除虚拟机文件即可回收资源,很方便集中管理。
由于虚拟机非常庞大,同时对硬件资源的消耗也大,linux 发展出了另一种虚拟化技术,即 linux 容器(Linux Containers,缩写为 LXC),它并不像虚拟机那样模拟一个完整的操作系统,却提供虚拟机一样的效果。如果说虚拟机是操作系统级别的隔离,那么容器就是进程级别的隔离,可以想象这种级别隔离的优点,无疑是快速的,节省资源的。
docker 就是对 linux 容器的封装,提供简单实用的用户接口,是目前最流行的 linux容器解决方案。
下面是百科的定义:
docker 是基于 Go 语言的开源的应用容器引擎,并遵从Apache2.0协议,docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
如果对软件测试、接口、自动化、性能测试、LR脚本开发、面试经验交流。感兴趣可以加裙485187702,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。
二. docker 解决什么问题
1. 解决虚拟机资源消耗问题。
服务器操作系统之上运行着虚拟机,虚拟机上运行着客户操作系统,客户操作系统之上运行着用户的应用程序,一台服务器 80% 的资源开销都花费在了硬件虚拟化和客户机操作系统本身。
如图 1 所示,如果采用 docker 容器技术,容器上运行着虚拟服务器,虚拟服务器中运行着用户的应用程序,虚拟服务器和服务器操作系统使用同一内核,虚拟服务器的文件系统使用物理服务器的文件系统,但做了隔离,看上去每个虚拟服务器都有自己独立的文件系统;在物理服务器上建立了虚拟网桥设备,每个虚拟服务器通过虚拟网桥设备连接网络。虚拟服务器直接使用物理服务器的CPU、内存、硬盘,并不对硬件进行虚拟化,因此没有硬件虚拟化和客户机操作系统占用的资源消耗,每一台虚拟服务器的性能接近于物理服务器性能。
一台普通家用电脑运行一个 Linux 虚拟机可能已经非常卡,但是却可以使用 docker 虚拟出几十甚至上百台虚拟的 linux 服务器。如果换成性能强劲的服务器,使用 docker 就可以提供私有云服务了。
2. 快速部署。
软件开发的难题在于环境配置,在自己电脑上运行的软件,换一台机器可能就无法运行,除非保证操作系统的设置正确,各种组件和库的正确安装。比如部署一个 Java 开发的 web 系统,计算机必须安装 Java 和正确的环境变量,可能还需要安装 tomcat、nginx。换台机器部署就要重来一次。
使用 docker 可以将应用程序及依赖打包在一个文件里(docker 镜像文件),运行这个文件就会启动虚拟服务器,在虚拟服务器启动应用程序或服务,就像在真实在物理机上运行一样,有了 docker,就可以一次部署,处处运行,也可以用于自动化发布。
3. 提供一次性的环境。
比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境,启动或关闭一个虚拟服务器就像启动或关闭一个进程一样简单和快速。
4. 提供弹性的云服务。
因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
5. 组建微服务架构。
通过多个容器,一台机器可以跑很多个虚拟服务器,因此在一台机器上就可以模拟出微服务架构,也可以模拟出分布式架构。
三. docker 安装部署与使用
本文介绍 ubuntu 18.04 系统下的安装与使用。其他操作系统请参考官方文档docs.docker.com/。
1. 安装 docker 引擎
获取最新版本的 Docker 安装包
aaron@ubuntu:~$ wget -qO- https://get.docker.com/ | sh
执行上述命令,输入当前用户密码,即可自动下载最新版的 docker 安装包,并自动安装。 安装完成后有个提示:
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:sudo usermod -aG docker aaronRemember that you will have to log out and back in for this to take effect!WARNING: Adding a user to the "docker" group will grant the ability to runcontainers which can be used to obtain root privileges on thedocker host.Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surfacefor more information.
当要以非 root 用户可以直接运行 docker 时,需要执行
sudo usermod -aG docker aaron
命令将用户 aaron 添加到 docker 用户组中,然后重新登陆,否则会报下面的错误:
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
执行下列命令启动 docker 引擎
aaron@ubuntu:~$ sudo service docker start
安装成功后已默认设置开机启动并自动启动,如果要手动设置,执行下面命令:
sudo systemctl enable docker
sudo systemctl start docker
测试运行
aaron@ubuntu:~$ sudo docker run hello-world
2. 使用 docker
1. 理解 docker 的架构
使用前先了解下 docker 的架构,如下图所示:
docker 镜象(image) 是存放在 docker 仓库(Registry)的文件,是用于创建 docker 容器 的模板。
docker 容器 是独立运行的一个或一组应用,可以理解为前述介绍的虚拟服务器。
docker 主机 是一个物理或者虚拟的机器用于执行 docker 守护进程和容器。
docker 客户端 通过命令行或者其他工具使用 docker API 与 docker 的守护进程通信。 作为用户,我们直接使用的是 docker 客户端。
2. docker 命令
查看docker 命令的帮助信息
docker --help #docker 全部命令帮助信息
docker COMMAND --help #docker 具体命令COMMAND的帮助信息
查看docker 信息
docker info
可以看到容器的池、已用数据大小、总数据大小,基本容器大小、当前运行容器数量等。
搜索镜像,从网络中搜索别人做好的容器镜像。
docker search ubuntu
docker search centos
从这里可以看出有的镜像已经集成了 php、java、ansible 等应用,我们也可以制作包含自己应用或服务的镜像文件,将此文件传给别人,别人即可直接使用 docker 打开容器,不需要任何额外的操作,也不像虚拟机那样消耗资源,即可运行你的应用或服务,是不是非常方便?!
从网络中下载别人做好的容器镜像。
docker pull centos
docker pull ubuntu
导入下载好的容器镜像文件
docker load < image_xxx.tar
查看镜像
docker images
docker images -a
检查镜像
docker inspect ubuntu
可以看到容器镜像的基本信息。
删除镜像,通过镜像的 id 来指定删除
docker rmi ubuntu
删除全部镜像
docker rmi $(docker images -q)
显示镜像历史
docker history ubuntu
运行容器
Docker容器可以理解为在沙盒中运行的进程,这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等。但这个沙盒默认是不会运行任何程序的,需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全停止。
运行 ubuntu 容器并进入交互式环境
aaron@ubuntu:~$ docker run -i --name="ubuntu1" --hostname="ubuntu1" ubuntu /bin/sh
cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 ubuntu1
whoami
root
uname -a
Linux ubuntu1 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
上述命令我们创建了一个名字为 ubuntu1 的容器,设置容器的主机名为 ubuntu1,进入 /bin/sh 命令后我们打印了 hosts 文件的内容,查看了内核版本(与本机操作系统版本一致),这里可以使用各种 linux 命令,就像在新的操作系统中使用命令一个样。同样的方法,我们在新的终端创建一个 ubuntu2 的容器,并使用
docker ps
查看正在运行的容器。
输入 exit 退出容器。
docker run -d ubuntu
会出现一串长的字母数字组成的串,为容器的 id,请注意容器要有持续运行的进程存在,否则,容器会很快自动退出。
运行容器并指定MAC地址
docker run -d --name='centos3' --hostname='centos3' --mac-address="02:42:AC:11:00:24" docker-centos6.10-hadoop-spark
列出所有的容器
docker ps -a
列出最近一次启动的容器
docker ps -l
检查容器
docker inspect centos1
可以获取容器的相关信息。
获取容器CID
docker inspect -f '{{.Id}}' centos1
获取容器PID
docker inspect -f '{{.State.Pid}}' centos1
获取容器IP
docker inspect -f '{{.NetworkSettings.IPAddress}}' centos1
获取容器网关
docker inspect -f '{{.NetworkSettings.Gateway}}' centos1
获取容器 MAC
docker inspect -f '{{.NetworkSettings.MacAddress}}' centos1
查看容器 IP 地址
docker inspect -f '{{.NetworkSettings.IPAddress}}' centos1
连接容器
ssh 容器的 IP 地址
输入密码:123456
容器运行后,可以通过另一种方式进入容器内部
docker exec -it centos /bin/sh
查看容器运行过程中的日志
docker logs centos1
列出一个容器里面被改变的文件或者目录,列表会显示出三种事件,A 增加的;D 删除的;C 被改变的
docker diff centos1
和初始容器镜像项目,用户或系统增加/修改/删除了那些目录文件,都可以查看到。
查看容器里正在运行的进程
docker top centos1
拷贝容器里的文件/目录到本地服务器
docker cp centos1:/etc/passwd /tmp/
ls /tmp/passwd
通过网络 IP 地址也可以将容器的文件拷贝到服务器,这种方式比较方便。
停止容器
docker stop centos1
停止所有容器
docker kill $(docker ps -a -q)
启动容器
docker start centos1
删除单个容器
docker stop centos1
docker rm centos1
删除容器之前要先停止该容器的运行。
删除所有容器
docker kill $(docker ps -a -q)
docker rm $(docker ps -a -q)
3. 卷的概念
为了能够保存(持久化)数据以及共享容器间的数据,docker 提出了卷的概念。卷 Volume 就是容器的特定目录,该目录下的文件保存在宿主机上,而不是容器的文件系统内。
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过容器默认的文件系统,可以提供很多有用的特性:
(1)数据卷可以在容器之间共享和重用;
(2)对数据卷的修改会立马生效;
(3)对数据卷的更新,不会影响镜像;
(4)数据卷默认会一直存在,即使容器被删除。
注意:数据卷的使用,类似于 Linux下对目录进行挂载 mount,容器中被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
创建、使用数据卷
mkdir -p /root/volume1
mkdir -p /root/volume2
docker run -d -v /volume1 --name='centos5' docker-centos6.10-hadoop-spark
docker run -d -v /root/volume1:/volume1 --name='centos6' docker-centos6.10-hadoop-spark
docker run -d -v /root/volume1:/volume1 -v /root/volume2:/volume2 --name='centos7' docker-centos6.10-hadoop-spark
docker run -d -v /root/volume1:/volume1:ro --name='centos8' docker-centos6.10-hadoop-spark
使用docker run命令创建容器,指定 -v 标记来创建一个数据卷并挂载到容器里;可以挂载多个数据卷;可以设置卷的只读属性;可以不指定服务器映射的目录,由系统自动指定目录,通过 docker inspect 来查看映射的路径。
分别进入这些容器,查看 /volume1、/volume2目录。
数据卷共享
如果要授权一个容器访问另一个容器的数据卷,可以使用-volumes-from 参数来执行。
数据卷容器
如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
(1)创建一个名为 dbdata 的数据卷容器
docker run -d -v /dbdata --name dbdata docker-centos6.10-hadoop-spark
(2)在其他容器中使用--volumes-from来挂载 dbdata 容器中的数据卷
docker run -d --volumes-from dbdata --name db1 docker-centos6.10-hadoop-spark
docker run -d --volumes-from dbdata --name db2 docker-centos6.10-hadoop-spark
这样就可以实现容器之间的数据共享。
分别进入这些容器,查看 /volume1、/volume2 目录。
4. 自制镜像并发布
保存容器修改,提交一个新的容器镜像
docker commit centos1 centos111
将现有的容器提交形成一个新的容器镜像,使用 docker images 可以看到 centos111 镜像。通过此方法,可以创建一个新的容器镜像。
查看镜像
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos111 latest d691a75ee371 23 minutes ago 501.5 MB
根据新容器镜像创建容器
docker run -d --name='centos111' centos111
查看容器
docker inspect centos111
导出和导入镜像
当需要把一台机器上的镜像迁移到另一台机器的时候,需要导出镜像与导入镜像。
机器A
docker save docker-centos6.10-hadoop-spark > docker-centos6.10-hadoop-spark2.tar
或
docker save -o docker-centos6.10-hadoop-spark docker-centos6.10-hadoop-spark2.tar
使用 scp 命令同其他方式将 docker-centos6.10-hadoop-spark2.tar 拷到机器 B 上
机器B
docker load < docker-centos6.10-hadoop-spark2.tar
或
docker load -i docker-centos6.10-hadoop-spark2.tar
发布容器镜像
docker push centos6.8-lamp1
将容器发布到网络中。
5. docker 网络
如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以175317069,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。
docker 启动时会在宿主机器上创建一个名为 docker0 的虚拟网络接口。它会从RFC 1918 定义的私有地址中随机选择一个主机不用的地址和子网掩码,并将它分配给 docker0,默认选择 172.18.0.1/16,一个 16 位的子网掩码给容器提供了 65534 个 IP 地址。
docker0 并不是正常的网络接口,只是一个在绑定到这上面的其他网卡间自动转发数据包的虚拟以太网桥,可以使容器与主机相互通信、容器与容器间相互通信。
docker 每创建一个容器,就会创建一对对等接口(Peer Interface),类似于一个管子的两端,在一边可以收到另一边发送的数据包。docker会将对等接口中的一个做为 eth0 接口连接到容器上,并使用类似于vethAQI2QT 这样的惟一名称来持有另一个,该名称取决于主机的命名空间。通过将所有 veth* 接口绑定到 docker0 桥接网卡上,docker 在主机和所有 docker 容器间创建一个共享的虚拟子网。
docker NAT 网络
docker 容器默认通过 nat 方式访问网络,docker 启动时会在宿主主机上创建一个名为 docker0 的虚拟网络接口,docker0 只是一个在绑定到这上面的其他网卡间自动转发数据包的虚拟以太网桥,它可以使容器和主机相互通信、容器与容器间通信。
docker0 的网关地址是172.18.0.1,掩码是 16 位,提供了 65534 个IP地址。
NAT 方式,虚拟器容器可以访问外网(宿主机以外),但宿主机以外的机器不能访问容器内网。
docker Bridage 网络
docker 容器可以通过 bridge 方式访问网络。
bridge方式,虚拟器容器可以访问外网(宿主机以外),宿主机以外的机器也能访问容器内网。
6. docker pipework
docker 自身的网络功能比较简单,不能满足很多复杂的应用场景。因此有很多开源项目用来改善 docker 的网络功能,如 pipework、weave、flannel 等。
pipework 是由 docker 的工程师 Jérôme Petazzoni 开发的一个 docker 网络配置工具,由 200 多行 shell 实现,方便易用。
安装 pipework
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /bin/
或
wget [http://172.17.1.240/docker/software/pipework](http://172.17.1.240/docker/software/pipework)
chmod a+x pipework
cp pipework /bin/
运行容器
docker run -d --net='none' --name='centos9' docker-centos6.10-hadoop-spark
配置容器网络,并连到网桥 docker0 上;网关在IP地址后面加 @ 指定。
pipework docker0 centos9 172.18.0.100/16@172.18.0.1
7. docker 网络端口映射
容器如果使用 docker0 虚拟网络,那么容器的网络是 172.17.0.0/16,容器可以通过 NAT 方式访问外网;但外网不能访问内网。如果容器使用 br0 虚拟网络,容器和服务器可以在同一个网络地址段;容器可以访问外网;外网也可以访问容器网络。 对于使用 docker0 虚拟网络的容器,可以通过端口映射的方式,让外网访问容器某些端口。
运行容器
docker run -d -p 38022:22 --name='centos10' docker-centos6.10-hadoop-spark
连接容器
ssh localhost -p 38022
在其他服务器上通过访问物理服务器加端口即可访问容器,可以一次映射多个端口。
运行容器
docker run -d -p 38022:22 -p 38080:80 --name='centos11' docker-centos6.10-hadoop-spark
其实现原理是在服务器上通过 iptables 转发来实现。当然也可以通过iptables 转发整个容器 IP 地址。
四. 总结
由于容器是进程级别的,相比虚拟机有很多优势。
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】
软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
8小时传疯!大厂面试真题全被大佬整理在这个小程序上了!【软件测试,建议收藏】
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux
6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础
全套资料获取方式:点击下方小卡片自行领取即可

相关文章:

Docker的架构与自制镜像的发布
一. Docker 是什么 Docker与自动化测试及其测试实践 大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来和真实操…...

嵌入式系统中C++ 类的设计和实现分析
C代码提供了足够的灵活性,因此对于大部分工程师来说都很难把握。 本文介绍了写好C代码需要遵循的10个最佳实践,并在最后提供了一个工具可以帮助我们分析C代码的健壮度。 原文:10 Best practices to design and implement a C class。 1. 尽…...

【torch高级】一种新型的概率学语言pyro(02/2)
前文链接:【torch高级】一种新型的概率学语言pyro(01/2) 七、Pyro 中的推理 7.1 背景:变分推理 引言中的每项计算(后验分布、边际似然和后验预测分布)都需要执行积分,而这通常是不可能的或计算…...

Git基本概念与使用
一、Git基本概念 git,是一种分布式版本控制软件,与CVS、Subversion这类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。g…...

Kubernetes数据卷Volume和数据卷分类(emptyDir、nfs、hostPath、ConfigMap)详解
Kubernetes数据卷Volume和数据卷分类详解 数据卷概述 Kubernetes Volume(数据卷)主要解决了如下两方面问题: 数据持久性:通常情况下,容器运行起来之后,写入到其文件系统的文件暂时性的。当容器崩溃后&am…...

【MATLAB源码-第59期】基于matlab的QPSK,16QAM164QAM等调制方式误码率对比,调制解调函数均是手动实现未调用内置函数。
操作环境: MATLAB 2022a 1、算法描述 正交幅度调制(QAM,Quadrature Amplitude Modulation)是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度(π/2)的正弦波,因此…...

经典目标检测神经网络 - RCNN、SSD、YOLO
文章目录 1. 目标检测算法分类2. 区域卷积神经网络2.1 R-CNN2.2 Fast R-CNN2.3 Faster R-CNN2.4 Mask R-CNN2.5 速度和精度比较 3. 单发多框检测(SSD)4. YOLO 1. 目标检测算法分类 目标检测算法主要分两类:One-Stage与Two-Stage。One-Stage与…...

mysql存在10亿条数据,如何高效随机返回N条纪录,sql如何写
1 低效方案 1.使用ORDER BY RAND(): SELECT * FROM your_table ORDER BY RAND() LIMIT 1; 这将随机排序表中的所有行,并且通过LIMIT 1仅返回第一行,从而返回一个随机记录。然而,对于大型表来说,ORDER BY RAND()可能会…...

c语言中啥时候用double啥时候用float?
c语言中啥时候用double啥时候用float? 一般来说,可以使用double来表示具有更高精度要求的浮点数,因为它可以存储更大范围的数值并且具有更高的精度。 最近很多小伙伴找我,说想要一些c语言资料,然后我根据自己从业十年…...

vscode 保存 “index.tsx“失败: 权限不足。选择 “以超级用户身份重试“ 以超级用户身份重试。
vscode 保存 "index.tsx"失败: 权限不足。选择 “以超级用户身份重试” 以超级用户身份重试。 操作:mac在文件夹中创建文件,sudo 创建umiJs项目 解决:修改文件夹权限 右键文件夹...

综合性练习
名片管理系统 综合性项目实现—详细请点这里 dict {} # 定义一个空字典,用于存储信息。 list [] # 定义一个列表,存储name值 list1 [] #存储age值 list2 [] #存储phone值 def people_tips(): #提示print("*****" * 10)print("…...

threejs(7)-精通粒子特效
一、初识Points与点材质 // 设置点材质 const pointsMaterial new THREE.PointsMaterial(); import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 导入动画库 import gsa…...

使用了百度OCR,记录一下
由于识别ocr有的频率不高,图片无保密性需求,也不想太大的库, 就决定还是用下api算了,试用了几家,决定用百度的ocr包,相对简单。 遇到的问题里面下列基本有提到:例如获取ID,KEY&…...

5.OsgEarth加载地形
愿你出走半生,归来仍是少年! 在三维场景中除了使用影像体现出地貌情况,还需要通过地形体现出地势起伏,还原一个相对真实的三维虚拟世界。 osgEarth可通过直接加载Dem数据进行场景内的地形构建。 1.数据准备 由于我也没有高程数据,…...

基于回溯搜索算法的无人机航迹规划-附代码
基于回溯搜索算法的无人机航迹规划 文章目录 基于回溯搜索算法的无人机航迹规划1.回溯搜索搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用回溯搜索算法来优化无人机航迹规划。 …...

微信小程序云开发笔记-初始化商城小程序
缘起:由于痴迷机器人,店都快倒闭了,没办法,拿出点精力给店里搞个小程序,要多卖货才能活下来搞机器人,在此记录一下搞小程序的过程,要不然搞完又忘了。腾讯的云开发,前端和后端都有了…...

vulnhub_DeRPnStiNK靶机渗透测试
VulnHub2018_DeRPnStiNK靶机 https://www.vulnhub.com/entry/derpnstink-1,221/ flag1(52E37291AEDF6A46D7D0BB8A6312F4F9F1AA4975C248C3F0E008CBA09D6E9166) flag2(a7d355b26bda6bf1196ccffead0b2cf2b81f0a9de5b4876b44407f1dc07e51e6) flag4(49dca65f362fee401292ed7ada96f9…...

网站如何判断请求是来自手机-移动端还是PC-电脑端?如何让网站能适应不同的客户端?
如果网站需要实现手机和PC双界面适应,可以有两种方式: 第一种是响应式界面,根据屏幕宽度来判定显示的格式。这种需要前端来做,手机/PC共用一套代码,有一定的局限性。 第二种是后端通过request请求头中的内容来分析客户…...

sass和 scss的区别?
Sass(Syntactically Awesome Style Sheets)和 SCSS(Sassy CSS)是两种流行的 CSS 预处理器,它们扩展了普通的 CSS 语法,提供了更多的功能和便利性。下面是 Sass 和 SCSS 的主要区别: 1ÿ…...

Vuex 动态模块状态管理器
模块化思想 我们之前的博文已经讲述了Vuex怎么使用命名空间实现模块化状态管理。详情可以看: Vuex命名空间及如何获取根模块、兄弟模块状态管理器_AI3D_WebEngineer的博客-CSDN博客https://blog.csdn.net/weixin_42274805/article/details/133269196?ops_request_…...

实现分片上传、断点续传、秒传 (JS+NodeJS)(TypeScript)
一、引入及效果 上传文件是一个很常见的操作,但是当文件很大时,上传花费的时间会非常长,上传的操作就会具有不确定性,如果不小心连接断开,那么文件就需要重新上传,导致浪费时间和网络资源。 所以࿰…...

浅谈安科瑞EMS能源管控平台建设的意义-安科瑞 蒋静
摘 要:能源消耗量大、能源运输供给不足、环境压力日趋增加、能耗双控等一系列问题一直困扰着钢铁冶金行业,制约着企业快速稳定健康发展。本文介绍的安科瑞EMS能源管控平台,采用自动化、信息化技术,实现从能源数据采集、过程监控、…...

【原创】指针变量作为函数参数要点注意+main函数中值是否改变
指针变量作为函数参数要点注意(已写至笔记) 1传参指针不加*(main中函数) 2收参指针要加*(被main调用的函数) 3传参指针名可与收参指针名不同,不影响 4【问】如何看主函数中指针所指内容是否改变…...

售后处置跟踪系统设想
售后处置跟踪系统设想 前言 随着汽车工业的发展,软件定义车的模式已成为主流汽车设计及智能化功能架构模式,通过引入SOA的软件架构设计,使得现有的座舱软件、云端服务软件、App软件等众多功能模块的版本迭代频次日新月异,发版更…...

python实现ModBusTCP协议的server
python实现ModBusTCP协议的server是一件简单的事情,只要通过pymodbus、pyModbusTCP等模块都可以实现,本文采用pymodbus。 相关文章见: python实现ModBusTCP协议的client-CSDN博客 一、了解pymodbus的Server 1、pymodbus.server的模块 pym…...

AndroidStudio编译错误‘android.injected.build.density‘ is deprecated
问题 AndroidStudio编译错误 The option ‘android.injected.build.density’ is deprecated. It was removed in version 8.0 of the Android Gradle plugin. Density property injection from Android Studio has been removed. 解决 app/build.gradle 中这行 apply plugi…...

计网小题题库整理第一轮(面向期末基础)(3)
基础选择题的最后一章更新,看完期末75至少没问题~ 前情提要: 计网小题题库整理第一轮(12期) 一.选择题 1、 目前,最流行的以太网组网的拓扑结构是( C )。 A) 总线结构 B) 环…...

进程控制(一):进程终止
文章目录 进程控制(一)进程终止运行正常退出码 运行异常进程正常/异常总结 进程控制(一) 在前文中,我们初步了解了进程的概念,以及通过fork函数来创建子进程,并对于为什么运行一个程序…...

特殊类设计[下] --- 单例模式
文章目录 5.只能创建一个对象的类5.1设计模式[2.5 万字详解:23 种设计模式](https://zhuanlan.zhihu.com/p/433152245)5.2单例模式1.饿汉模式1.懒汉模式 6.饿汉模式7.懒汉模式7.1饿汉模式优缺点:7.2懒汉模式1.线程安全问题2.单例对象的析构问题 8.整体代码9.C11后可…...

计算机网络-应用层(1)
一、DNS 域名系统 (DNS) 是把主机域名解析为IP地址的系统。该系统是由解析器和域名服务器组成的。采用UDP 协议,较少情况下使用TCP 协议,端口号均为53。 域名系统由三部分构成: DNS 名字空间、域名服务器、 DNS客户机。 (1)根域:…...