Docker复习

news2024/11/18 4:25:59

目录

  • 1. Docker的理解
    • 1.1 Docker三要素
  • 2 安装Docker
    • 2.1 安装命令
    • 2.2 配置阿里云加速器
  • 3 Docker命令
    • 3.1 启动类命令
    • 3.2 镜像类命令
  • 4 实战
    • 4.1 启动容器,自动创建实例
    • 4.2 查看Docker内启动的容器
    • 4.3 退出容器
    • 4.4 其他
    • 4.5 导入导出文件
    • 4.6 commit
  • 5 Dockerfile
    • 5.1 理解Dockerfile
    • 5.2 制作镜像
    • 5.2 虚悬镜像
  • 6 Compose
    • 6.1 下载Compose
    • 6.2 docker-compose.yaml文件示例
    • 6.3 使用compose
  • 基础概念补充
    • 1 挂载 Volume
    • 2 网络 network
      • 2.1. Docker容器之间如何通信的?
      • 2.2 想看看Docker各个容器的网络信息
      • 2.3 如何分配给容器Ip?
      • 2.4 bridge模式
      • 2.5 自定义网络名
      • 2.6 host 网络类型
    • 3 网关

1. Docker的理解

为什么要使用Docker?

  • 在开发项目的过程中,开发人员一套环境(软件代码,JDK版本,Redis版本,数据库版本等环境),测试人员一套环境,运维人员一套环境。

  • 开发人员自己可以运行程序,仅将源代码打包发给测试人员,测试人员需要按照要求配置出同样的运行环境,非常容易出现某处配置错误无法启动项目的情况。如使用了集群,不仅配置起来繁琐,工程量也大,维护更难。所以希望可以改善这种情况。

  • 于是出现Docker,开发人员将 开发环境+源代码,全部打包发送,测试人员在Docker上简单部署(其实就是将文件上传到Docker),就可以启动项目了,不需要像之前那样,还得按照要求搭建运行环境。

什么是Docker?

  • 对比VMware,我们需要一个本地服务器(自己的电脑),安装VM,在VM上安装centOS(一个或者多个),在centOS上安装软件。需要清楚的是:centOS本质上是一个Linux操作系统的镜像,也就是打包了Linxu一整套操作系统,所以比较大。因此安装几个centOS电脑资源就不够用了。而且每次创建centOS都得花费个3-5min,是比较慢的(我自己有时还得看教程安装)
  • 在这里插入图片描述
  • Docker引擎本质上就是将Linux操作系统的核心打包,并不是打包一整套操作系统。所以做到了轻量化,之前一台服务器安装一个VM,在VM上部署10台centOS,现在一台服务器安装一个Docker,可以部署100台容器。所以看到Docker对比VM就能理解了。只不过我们把VMware的centOS叫做虚拟机,也就是Docker的容器。
  • 创建不同的虚拟机实现隔离。也就是创建不同的容器实现隔离

1.1 Docker三要素

  1. 镜像
    将程序源代码+生产环境打包,制作成一个镜像文件(如跨境电商管理系统的镜像文件)

  2. 容器实例
    根据镜像文件创建运行实例,一个容器运行一种服务
    在这里插入图片描述

  3. 仓库
    存放镜像的地方,需要把镜像发布到仓库,再到仓库拉取下来。

  • Docker公司提供的库:Docker Hub
  • 阿里提供的仓库:阿里云
  • 公司自己建立的库

2 安装Docker

2.1 安装命令

yum -y install gcc
yum -y install gcc-c++
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
docker version
docker run hello-world

2.2 配置阿里云加速器

1. mkdir -p /ect/docker
2. cd /ect/docker/
3. tee /ect/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://aa25jngu.mirror.aliyun.com"]
> }
> EOF
4. systemctl daemon-reload
5. systemctl restart docker
6. docker run hello-world

3 Docker命令

3.1 启动类命令

stystemctl start docker 启动
stystemctl stop docker 关闭
stystemctl status docker 查看状态

3.2 镜像类命令

查看镜像
1. docker images

在这里插入图片描述

  • repository 仓库:存放下载的镜像
  • Tag 标签:(例如mysql 5.6 版本,Tag就是5.6)不设置版本号,默认是latest,表示最新版本
  • Image Id 唯一标识
根据镜像名称去查询仓库中的镜像

查询redis镜像(未指定版本号)
2. docker search redis

将查询结果限制展示5条
docker search --limit 5 redis

在这里插入图片描述

下载镜像

查询redis镜像(未指定版本号,默认下载最新版)
3. docker pull redis

查询redis镜像(指定版本号)
docker pull redis:6.0.8
查看docker资源使用情况
4. docker system df

在这里插入图片描述

查看操作系统的资源使用情况
在这里插入图片描述

删除镜像(指定名字)
5. docker rmi hello-world

删除镜像(指定镜像的唯一标识)
docker rmi 对应的Image Id

删除镜像(强制删除)
docker rmi -f hello-world 

删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG

删除全部
docker rmi -f $(docker images -qa)

4 实战

4.1 启动容器,自动创建实例

在这里插入图片描述
在Docker容器中启动ubuntu

启动容器中ubuntu实例
docker run -it ubuntu /bin/bash

-i :指交互式访问
-t :指tty,即系统
it需要一起使用,即告诉系统,启动后不要立刻走,而是停下来等待我进一步操作。并且是以bash的交互方式
/bin/bash:以bash的方式

在这里插入图片描述

此时就可以操作ubuntu内部信息,比如查看ubuntu的文件啥的

4.2 查看Docker内启动的容器

在这里插入图片描述

container id:容器实例Id
表示使用ubuntu镜像创建了 Id=226a56fb739e 的容器实例,因为未指定名称,此时就随机分配了一个

现在再利用ubuntu镜像创建一个容器实例,并且 指定名称

使用--name指定名称
(bash 或者 /bin/bash 都可以)
docker run -it --name=My_Ubuntu02 ubuntu bash

在这里插入图片描述

此时就根据ubuntu镜像创建了两个容器实例

此时若提问:必须指定交互方式吗,如果不写呢?如这样:docker run -it ubuntu
因为Docker机制的问题,这样启动有时候会导致容器启动后紧接着直接关闭,添加上交互方式就是让容器启动后并停留住。

这种方式叫做前台交互式启动
还有一种后台交互式启动:docker run -d ubuntu

总结一下,
前台交互式启动:docker run -it ubuntu bash
后台交互式启动:docker run -d ubuntu

4.3 退出容器

- exit
run 进去容器,exit退出,容器停止
- ctrl+p+q
run进去容器,ctrl+p+q退出,容器不停止

退出后如何再进去呢?

  • 第一种方式:docker exec -it 容器实例ID (推荐)

在这里插入图片描述

  • 第二种方式:docker attach -it 容器实例ID

区别:
exec会在容器中打开新的终端,并且启动新的进程,用exit退出,不会导致容器停止
attach直接进入容器终端,不启动新的进程,用exit退出,会导致容器停止

4.4 其他

  • 启动已经停止的容器 docker start 容器ID或者容器名
  • 重启容器 docker restart 容器ID或者容器名
  • 停止容器 docker stop 容器ID或者容器名
  • 强制停止容器 docker kill 容器ID或者容器名
  • 删除已停止的容器 docker rm 容器ID

4.5 导入导出文件

将容器实例中的文件导出在本地

docker cp 容器实例Id:/路径/a.txt  /主机路径

将容器实例打包成压缩包A.tar

docker export 容器实例Id > A.tar

4.6 commit

例如:我们使用ubuntu镜像创建了一个名为MyUbuntu01的实例,这个实例只包含了linxu核心的命令,我们现在实际业务需要修改内部的某个文件,想使用vim命令。MyUbuntu01内部没有
所以我们需要给其添加功能

如何做呢?先进入容器实例,依次执行命令
apt-get update
apt-get -y install vim

那我如果使用ubuntu镜像再创建一个名为MyUbuntu02的实例,也需要vim命令,岂不是还要添加一次功能。
这个时候,我们可以根据实例MyUbuntu01反向生成一个新的镜像,修改名称为new_ubuntu,同时也可指定版本用于区分(例如new_ubuntu:1.2)。这样根据new_ubuntu:1.2 创建的实例就都具有我们添加的vim功能了

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创作的目标镜像名:[TAG]
docker commit -m="vim cmd add ok" -a="zzyy" fahf33rfaaa new_ubuntu:1.2

5 Dockerfile

5.1 理解Dockerfile

我们已经学会使用镜像去创建容器实例,现在了解一下如何创建镜像
在这里插入图片描述
每个镜像背后都是由各自的Dockerfile制作的
因此学习一下DockerFile的语法规则

  • from

在每个Dockerfile的第一行,表示当前镜像是基于哪个镜像进行变动的,也可以指定自己

  • maintainer

镜像的作者,表明此镜像是谁做的

  • run

这个run命令和docker run -it xxxx中的docker run不一样
docker run:这个run是在创建并启动实例
dockerfile内部的run:是在docker build时运行(创建镜像)

  • expose

暴露端口 Docker容器端口:镜像实例暴露端口
比如为什么Tomcat可以用8080端口访问,就是因为其镜像暴露的端口设置成了8080

  • workdir

修改进入容器后的落脚点(实例展示默认的落脚点)

在这里插入图片描述
如何修改

EVA MY_PATH /user/local
WORKDIR $MY_PATH
这样进去运行为镜像实例,就会切换到/user/local路径下,而不是默认落脚点

  • env

设置环境变量

  • copy

copy 路径A 路径B
A路径是本机资源路径,B路径是镜像中的路径,意思是将本地资源复制到镜像中指定的路径

copy --from=镜像名:TAG 路径A 路径B
例如COPY --from=oms-middleware-gosu-alpine-amd64:latest /usr/local/bin/gosu /bin/
A路径是镜像中路径,B路径也是镜像路径,意思是将名为XX的镜像A路径下的资源复制到 生成镜像B路径下

  • add

表示将路径A的资源复制到路径B,并且自动解压tar压缩包

  • volume

容器数据卷

  • cmd
  • Dockerfile内不写cmd指令,然后我们运行镜像实例时这样写的 docker run -it ubuntu /bin/bash
  • Dockerfile内会这么写 CMD ["/bin/bash","run"],然后我们运行镜像实例时这样写的 docker run -it ubuntu ,实际上执行的命令是 docker run -it ubuntu /bin/bash
    Dockerfile内写多个CMD命令 CMD ["/bin/bash","run"] CMD ["demo.sh","run"] ,然后我们运行镜像实例时这样写的 docker run -it ubuntu ,实际上执行的命令是 docker run -it ubuntu demo.sh (可以看到最后一个cmd命令会覆盖前面的cmd命令)
    Dockerfile内写多个CMD命令 CMD ["/bin/bash","run"] ,然后我们运行镜像实例时这样写的 docker run -it ubuntu demo.sh,实际上执行的命令是 docker run -it ubuntu demo.sh (可以看到最后一个dockerfile文件内的cmd直接失效)
  • entrypoint

类似于CMD命令,不会被覆盖

Dockerfile文件,镜像 nginx:test

 FROM nginx
 ENTRYPOINT {"nginx","-c"} # 定参
 CMD {"/etc/nginx/nginx.conf"} # 变参
# Docker命令 
docker run nginx:test
# 实际上执行命令
 docker run nginx:test nginx -c /etc/nginx/nginx.conf
# Docker命令 
docker run nginx:test  /etc/nginx/AAAA.conf
# 实际上执行命令
 docker run nginx:test nginx -c /etc/nginx/AAAA.conf

5.2 制作镜像

5.2 虚悬镜像

在构建镜像或者删除镜像时产生错误,导致创建了一个仓库名和TAG都为< none >的镜像,这种会有潜在的安全风险,建议删除

查询所有的虚悬镜像

docker image ls -f dangling=true

删除所有的虚悬镜像

docker image purne

6 Compose

6.1 下载Compose

搞一个新文件存放

curl -L "https://github.com/docker/compose/releases/download/v2.11.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

前面利用镜像创建镜像实例的时候,需要执行 docker run -d 镜像名
考虑一个场景:在一个大型项目中,我们需要先启动mysql服务,再启动redis集群(有30个redis),最后再启动注册中心(consul),最最后再启动项目代码。
会有什么问题呢?

  • 需要手动且按序 启动很多个容器(数量多+难记住顺序)
  • 假如consul服务挂掉,重新启动consul的容器后,会变更新的网络地址,无法保证容器之间的通信

使用Compose工具,将如何启动的相关信息全部写在一个文件,我们仅执行这个文件,Docker会自动执行该文件内部的信息。此乃自动化部署。

所以Compose被称为:自动化统一编排工具,我们创建的文件名为docker-compose.yaml。可以看,其实就是一个yaml文件。yaml有自己的语法规则,学习springboot就知道了

6.2 docker-compose.yaml文件示例

看一个docker-compose.yaml文件示例

versdion:"3.6"

servers: #表示有几个服务(有MyUbuntu和MyZookeeper服务)
	MyUbuntu: # 自定义,命名不冲突就行
		iamg: ubuntu:3.2 # 模版镜像的名字
		container_name: mu01 # 生成镜像的名字
		ports:
			- "6001:6001" # 端口号
		volumes:
			- /app/MyUbuntu:/data # 挂载
		network:
			- atguigu_net # 设置网路
		depends_on: # 表明需要先启动redis,mysql,再启动本服务
			- redis
			- mysql
	MyZookeeper:# 自定义,命名不冲突就行
	    ...
	    ...
network:atguigu_net # 设置网络
	

这个文件与我们执行此命令是一样的

docker run -d -p 6001:6001 -v /app/MyUbuntu:/data --network atguigu_net --name mu01 ubuntu:3.2

6.3 使用compose

  1. 编写docker-compose.yaml(重点)
  2. 执行docker-compose up -d

基础概念补充

1 挂载 Volume

挂载是什么?

主机上有A文件,容器有B文件,此时容器无法访问主机的A文件,仅仅可访问自己的B文件
将主机的A文件挂载到容器上,容器就可以访问主机的A文件,也可以访问自己的B文件

为什么不直接将主机A文件放在容器中?

例如容器大小是10Mb,文件A是1Gb,无法直接将文件A存放到容器内。
此时使用一个链接,将主机的文件A 链接在容器上,当容器需要访问文件A时,就顺着链子获取A。这就是挂载
在这里插入图片描述

使用挂载还有什么好处?

  • 可以访问到主机的A文件,也就代表可以操作主机上A文件,可以保证数据持久化,若是只保存在容器,容器一重启就没了
  • 数据共享:多个容器可以共享同一个挂载目录,实现数据共享

怎么挂载呢?

  1. 创建名为web的容器,并将主机的/src/web目录挂载到容器的/opt/web目录下
    docker run -d --name web -v /src/webapp:/opt/webapp

2 网络 network

2.1. Docker容器之间如何通信的?

容器A:ip–127.0.0.1
容器B:ip–127.0.0.4
(注:在A,B同一网关下)
容器A通过ip连接 :ping 127.0.0.4 √,连接成功

2.2 想看看Docker各个容器的网络信息

选择一个镜像实例,查看具体网络情况
在这里插入图片描述
查看网关 Getway 和 地址 IPAddress
在这里插入图片描述
再看看另外一个镜像实例的网络情况
在这里插入图片描述
可以看到每个容器中镜像实例都有一个IP和网关,这个IP是怎么来的。其实不然,是Docker内部分配的

2.3 如何分配给容器Ip?

这就必须先了解Docker的网络模式
在这里插入图片描述
此图表示,网络模式有三种bridge(主要使用的),host ,null

这个name是什么意思?
选择一种网络模式后,必须自定义一个名字
我们定义方案A为dirver类型,以后谁想使用driver,直接勾选方案A。很方便管理
在这里插入图片描述

2.4 bridge模式

若容器A选择桥接模式后,docker会创建一个虚拟网桥docker0,docker0会给容器随机发一个Ip和网关
在这里插入图片描述
我怎么知道有虚拟网桥的?

输入ip addr查看主机上的通信情况
在这里插入图片描述

docker0我明白了这个东西的存在,那下面两条红框是什么?

当然不是容器直接一根线就链接到虚拟网桥,而是有更多的细节在里面
当创建一个容器并且设置网络模式为bridge(创建时默认为bridge)时,虚拟网桥会创建一个网卡给容器A,自己留一个与之对应的接口。容器B,容器C也是同样的。

在这里插入图片描述
当我们在主机上输入 ip addr时,veth 就是我们的接口标识。
在这里插入图片描述
现在我们切换到容器视角看看网络信息
在这里插入图片描述
总结一下
在这里插入图片描述

查看所有是桥接模式的容器docker network inspect bridge

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

2.5 自定义网络名

回到最开始的问题,docker容器之间如何通信?

前面说了根据Ip进行连接,那是不是容器A必须得知道容器B的Ip,第一次我告诉容器A了,10分钟后容器B挂掉了,我重启了容器B,这个时候容器B的IP就变成了新的,AB无法通信,除非A知道B最新的IP地址。

那这样岂不是特别麻烦,有没有什么办法解决呢?

既然容器IP是变动的,容器名不会变动,我们直接通过名字进行通信。
以前:容器A需要知道容器B的IP ping 127.0.0.3
现在:容器A只需要知道容器B名字 ping tomcat(容器B名字)

怎么做到呢?

  1. 创建自定义网络
    在这里插入图片描述
  2. 新建容器并指定使用该网络
docker run -d -p 8081:8081 --network diy_name --name t1 tomcat bash
docker run -d -p 8081:8081 --network diy_name --name t1 ubuntu bash
  1. ping一下
    docker exec -it t1 bash 进入容器t1
    ping t2 连接容器t2

2.6 host 网络类型

容器共享主机的IP,不再分配容器单独的Ip。

在这里插入图片描述

3 网关

网关是什么?

比如我们在浏览器输入www.baidu.com,域名解析后会得到百度的IP地址。电脑的网卡会将IP发送给路由器的网关,网关先转发到本地网络查是否有此IP地址,若没有再转发到互联网去查此IP地址。

所以网关就是负责转发。

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

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

相关文章

MySQL数据库局域网连接

目录 前言 客户端 开启访问权限 防火墙设置 windows Linux 测试连接 前言 MySQL数据库远程连接&#xff08;局域网&#xff09;是指在局域网内的不同计算机或设备之间&#xff0c;通过网络连接到MySQL数据库服务器的过程。在这种情况下&#xff0c;MySQL数据库服务器位…

编译原理

一&#xff0c;基本概念 二&#xff0c;词法分析

使用python部署chineseocr_lite

使用python部署chineseocr_lite 简介安装报错解决python调用结果 简介 项目地址&#xff1a;https://github.com/DayBreak-u/chineseocr_lite chineseocr_lite 是一个开源项目&#xff0c;用来实现中文的文字识别&#xff0c;支持竖排文字识别、繁体识别&#xff0c;总模型只…

Mysql加锁过程

1、背景 MySQL/InnoDB的加锁分析&#xff0c;一直是一个比较困难的话题。我在工作过程中&#xff0c;经常会有同事咨询这方面的问题。同时&#xff0c;微博上也经常会收到MySQL锁相关的私信&#xff0c;让我帮助解决一些死锁的问题。本文&#xff0c;准备就MySQL/InnoDB的加锁问…

最优除法(力扣)数学 JAVA

给定一正整数数组 nums&#xff0c;nums 中的相邻整数将进行浮点除法。例如&#xff0c; [2,3,4] -> 2 / 3 / 4 。 例如&#xff0c;nums [2,3,4]&#xff0c;我们将求表达式的值 “2/3/4”。 但是&#xff0c;你可以在任意位置添加任意数目的括号&#xff0c;来改变算数的…

LT2911R -D 是一款MIPI/TTL和LVDS互转的一款高性能旋转芯片

LT2911R -D 1.概述&#xff1a;LT2911R-D是一种在MIPI/TTL/LVDS之间相互转换的高性能转换器&#xff0c;除了LVDS转MIPI除外。LT2911R-D反序列化输入的MIPI/LVDS/TTL视频数据&#xff0c;解码数据包、旋转视频、改变帧率&#xff0c;并将格式化的视频数据流转换为AP和移动显示…

给你推荐几个好用的Android Studio插件

给你推荐几个好用的Android Studio插件 1. CodeGlance&#xff08;代码全景&#xff09; 类似于Sublime或Xcode&#xff0c;此插件在您的编辑器中嵌入了一个代码迷你地图。滚动条也会变得稍大一些。CodeGlance预览了文件的代码模式&#xff0c;让您快速导航到所需的部分。 …

QUiLoader:彻底分离你的Ui设计工作

QUiLoader:彻底分离你的Ui设计工作 1. QUiLoader:彻底分离你的Ui设计工作widget.hwidget.cpp 2. Qt、C动态UI3. QT 使用QLibrary加载动态库 1. QUiLoader:彻底分离你的Ui设计工作 原文链接&#xff1a;https://blog.csdn.net/adonis1620/article/details/5794797 Trolltech提…

加入气压计模组,星斗3号将实现快速三维定位

随着信息技术的飞速发展,人们的生活正在发生巨大改变,人们对基于位置服务的需求越来越迫切,尤其是室内位置服务。 室外定位系统中BDS系统、GPS系统等受室内复杂环境条件限制精度大幅下降甚至失效,难以在室内定位中发挥作用,而室内二维定位技术缺乏高程信息,也难以满足人们对室…

独立式电火花脉冲电源的放电回路

根据一篇专利来的 电火花加工电源的放电回路 1 电火花电源的放电回路 电火花加工电源的放电回路,包括工作电源、充电电源以及由电极和工件连接端子组成的放电支路,还包括分别与所述放电支路并联的消电离支路、负波吸收支路和增爆电容支路&#xff0c;所述放电支路的电极端连…

【多模态】19、RegionCLIP | 基于 Region 来实现视觉语言模型预训练

文章目录 一、背景二、方法2.1 Region-based Language-Image Pretraining2.2 目标检测的迁移学习 三、效果3.1 数据集3.2 实现细节3.3 结果 论文&#xff1a; RegionCLIP: Region-based Language-Image Pretraining 代码&#xff1a;https://github.com/microsoft/RegionCLIP …

要理解用户空间与内核空间之间的关系

需要对内核有深入的认识。从两个不同的角度来理解内核&#xff1a;一是从静态角度&#xff0c;内核可以被看作一个类库&#xff0c;对外提供API接口&#xff1b;二是从动态角度&#xff0c;内核启动多个内核线程提供系统服务&#xff0c;这些线程在ps命令下可以被看到。 当用户…

二级制部署kubernetes(1.20)

&#x1f618;作者简介&#xff1a;一名运维工作人员。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动动小…

HarmonyOS/OpenHarmony元服务开发-卡片使用动效能力

ArkTS卡片开放了使用动画效果的能力&#xff0c;支持显式动画、属性动画、组件内转场能力。需要注意的是&#xff0c;ArkTS卡片使用动画效果时具有以下限制&#xff1a; 以下示例代码实现了按钮旋转的动画效果&#xff1a; Entry Component struct AttrAnimationExample { St…

系列二、RocketMQ简介

一、概述 RocketMQ是一款阿里巴巴开源的消息中间件。2016年11月28日&#xff0c;阿里巴巴向Apache软件基金会捐赠RabbitMQ&#xff0c;成为Apache孵化项目。2017年9月25日&#xff0c;Apache宣布RocketMQ孵化成为Apache顶级项目&#xff08;TLP&#xff09;&#xff0c;成为国内…

01)docker学习 centos7离线安装docker

docker学习 centos7离线安装docker 在实操前可以先看下docker教程,https://www.runoob.com/docker/docker-tutorial.html , 不过教程上都是在线安装方式,很方便,离线安装肯定比如在线麻烦点。 一、什么是Docker 在学习docker时,在网上看到一篇博文讲得很好,自己总结一下…

日期类的实现【C++】

1、Date.h #pragma once #include <iostream> using namespace std;class Date { public:Date(int year 1, int month 1, int day 1);void Print();//Date& operator(const Date& d); //赋值重载int GetMonthDay(int year, int month);bool operator<(con…

CSDN周赛66期图文题解 - 路灯亮度 池塘水量

本期非编程题考察更多是对原书的阅读理解&#xff0c;可能还是因为自己理解不够&#xff0c;翻了半天书&#xff0c;还是错了两道。失之我命&#xff0c;不多废话。 本期编程题比较符合我的胃口&#xff0c;有陷阱&#xff0c;有技巧&#xff0c;窃以为是最近不少期里比较有意…

华为eNSP通过VMnet8虚拟网卡,NAT转换访问互联网

防火墙上配置&#xff1a; 配置G1/0/1接口IP地址&#xff0c;其实G1/0/1的IP就是终端PC1的网关地址。 配置G1/0/0接口自动获取IP地址&#xff0c;从VMnet8中自动获取地址。 配置安全区域zone,把对应的接口加入到对应的zone中 配置安全策略&#xff0c;放通trust安全区域到u…

基于Vue3+LeaderLine实现画线时对应点放大精确选点功能

我们在画线时&#xff0c;可能开始结束位置选择不准&#xff0c;导致测量结果会有偏差&#xff0c;所以新增放大功能&#xff0c;如下所示 核心源码&#xff1a; <template>...<el-col :span"2" v-if"largeImageSelected"><!-- 显示在右…