docker入门(八)—— dockerfile详细介绍,编写dockerfile

news2024/11/14 16:26:26

dockerfile(重点)

大家想想,Nginx,tomcat,mysql 这些镜像都是哪里来的?官方能写,我们不能写吗?

我们要研究自己如何做一个镜像,而且我们写的微服务项目打包上云部署,docker 就是最方便的。

微服务打包成镜像,任何装了 docker 的地方,都可以下载使用,极其方便。

流程:开发应用 => 编写 dockerfile => 打包为镜像 => 上传到仓库(私有仓库公司内部,公有仓库 dockerhub)=> 下载镜像 => 启动运行。

还可以方便移植!

什么是 dockerfile

dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于描述镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。

通过编写 dockerfile,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。

dockerfile 的基本结构包括以下几个部分:

  • 基础映像(Base Image):使用 FROM 指令指定基础映像,作为构建镜像的起点。基础映像通常包含了操作系统和一些预装的软件和工具。
  • 构建过程指令:使用一系列指令来描述构建过程,例如 RUN 用于执行命令和安装软件包,COPY 用于拷贝文件和目录,ADD 用于拷贝和提取文件,WORKDIR 用于设置工作目录,等等。
  • 容器启动指令:使用 CMD 或 ENTRYPOINT 指令来定义容器启动时要执行的命令,也就是默认的容器执行命令。

通过编写 dockerfile,可以自定义构建过程,选择所需的软件和配置,以及设置环境变量、暴露端口等。dockerfile 的语法简单且易于理解,使得镜像的构建过程变得可重复和可维护。

总的来说,dockerfile 是定义和构建 docker 镜像的文本文件,通过编写指令和参数来描述镜像的构建过程和配置,以实现应用程序的打包和部署。它是使用 docker 进行容器化开发和部署的重要工具。

构建步骤:

  1. 编写 dockerfile 文件
  2. docker build 构建镜像
  3. docker run 镜像

dockerfile 构建过程

基础知识:

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • # 表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

流程:

  1. docker 从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似 docker commit 的操作提交一个新的镜像层
  4. docker 再基于刚提交的镜像运行一个新容器
  5. 执行 dockerfile 中的下一条指令直到所有指令都执行完成!

说明:

从应用软件的角度来看,dockerfile,docker 镜像与 docker 容器分别代表软件的三个不同阶段。

  • dockerfile 是软件的原材料(代码)
  • docker 镜像则是软件的交付品(.apk)
  • docker 容器则是软件的运行状态(客户下载安装执行)

dockerfile 面向开发,docker 镜像成为交付标准,docker 容器则涉及部署与运维,三者缺一不可!

在这里插入图片描述

  • dockerfile:需要定义一个 dockerfile,dockerfile 定义了进程需要的一切东西。dockerfile 涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace 的权限控制)等等。
  • docker镜像:在 dockerfile 定义了一个文件之后,docker build 时会产生一个 docker 镜像,当运行 docker 镜像时,会真正开始提供服务;
  • docker容器:容器是直接提供服务的。

dockerfile 指令

关键字:

FROM         # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER   # 镜像维护者的姓名混合邮箱地址
RUN          # 容器构建时需要运行的命令
EXPOSE       # 当前容器对外保留出的端口
WORKDIR      # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV          # 用来在构建镜像过程中设置环境变量
ADD          # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY         # 类似ADD,拷贝文件和目录到镜像中!
VOLUME       # 容器数据卷,用于数据保存和持久化工作
CMD          # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT   # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD      # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

在这里插入图片描述

编写 dockerfile

dockerhub 中99%的镜像都是通过在 base 镜像(Scratch)中安装和配置需要的软件构建出来的

Scratch 镜像很赞,它简洁、小巧而且快速,它没有 bug、安全漏洞、延缓的代码或技术债务。除了被 docker 添加了 metadata 之外,它基本上是空的。

我们在使用 dockerfile 构建 docker 镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包。

如果我们的需求是在构建一个符合我们实际业务需求的 docker 镜像的前提下,确保镜像尺寸尽可能的小,应该怎么做呢?

思路是使用空镜像 scratch,可以说是真正的从零开始构建属于自己的镜像,镜像的第一层

发布一个自己编写的 centos

由于阿里云官方的 centos 是不完整的,很多命令都没有(例如 vim、ipconfig 等),我们自定义一个 centos 镜像,,让它能够拥有这些命令

# dockerfile文件名字可以任意取,最好为Dockerfile
vim Dockerfile

编写 dockerfile 如下:

FROM centos7.9.2009
MAINTAINER akuya<123456@qq.com>

# 配置环境以及工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 安装vim、ipconfig等命令
RUN yum -y install vim
RUN yum -y install net-tools

# 暴露端口
EXPOSE 80

CMD echo $MYPATH
CMD echo "---akuya---"
CMD /bin/bash

由于最新版 centos8 有 bug,故使用 centos7.9版本

根据 dockerfile 构建镜像

docker build .

参数:

  • -f:等价于--file,指定 dockerfile 文件
  • -t:等价于--tag,指定输出的镜像文件名:版本号

命令最后一定要加一个.

# 构建镜像命令
docker build -f Dockerfile -t mycentos:1.0 .
[root@iZbp15293q8kgzhur7n6kvZ home]# docker build -f Dockerfile -t mycentos:1.0 .
[+] Building 54.3s (8/8) FINISHED                                                                                  docker:default
 => [internal] load build definition from Dockerfile                                                                         0.0s
 => => transferring dockerfile: 282B                                                                                         0.0s
 => [internal] load metadata for docker.io/library/centos:7.9.2009                                                          15.7s
 => [internal] load .dockerignore                                                                                            0.0s
 => => transferring context: 2B                                                                                              0.0s
 => [1/4] FROM docker.io/library/centos:7.9.2009@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987    10.0s
 => => resolve docker.io/library/centos:7.9.2009@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987     0.0s
 => => sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 1.20kB / 1.20kB                               0.0s
 => => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B                                   0.0s
 => => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB                               0.0s
 => => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB                             6.1s
 => => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc                                    3.4s
 => [2/4] WORKDIR /usr/local                                                                                                 2.2s
 => [3/4] RUN yum -y install vim                                                                                            21.2s
 => [4/4] RUN yum -y install net-tools                                                                                       3.4s 
 => exporting to image                                                                                                       1.7s 
 => => exporting layers                                                                                                      1.7s 
 => => writing image sha256:1e7fb59b8a162a54a01bc41930d654d7d474cbd7ade3d110f12d95727e1d193f                                 0.0s 
 => => naming to docker.io/library/mycentos:1.0                                                                              0.0s 
[root@iZbp15293q8kgzhur7n6kvZ home]# docker images                                                                                
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE                                                                   
mycentos     1.0       1e7fb59b8a16   About a minute ago   708MB
centos       latest    5d0da3dc9764   2 years ago          231MB

根据这个镜像运行容器后发现并没有打印出目录/usr/local---akuya---,这是因为 CMD 指令如果存在多个,只有最后一个会被执行

docker history 查看镜像的变更历史

如果你下载了一个镜像,报错了或者你想查看一些构建逻辑,使用 docker history

[root@iZbp15293q8kgzhur7n6kvZ home]# docker history mycentos:1.0
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
1e7fb59b8a16   7 minutes ago   CMD ["/bin/sh" "-c" "/bin/bash"]                0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   CMD ["/bin/sh" "-c" "echo \"---akuya---\""]     0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   CMD ["/bin/sh" "-c" "echo $MYPATH"]             0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   RUN /bin/sh -c yum -y install net-tools # bu…   208MB     buildkit.dockerfile.v0
<missing>      7 minutes ago   RUN /bin/sh -c yum -y install vim # buildkit    296MB     buildkit.dockerfile.v0
<missing>      7 minutes ago   WORKDIR /usr/local                              0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   ENV MYPATH=/usr/local                           0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   MAINTAINER akuya<123456@qq.com>                 0B        buildkit.dockerfile.v0
<missing>      2 years ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      2 years ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      2 years ago     /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB     

项目中编写 dockerfile 思路

  1. 基于一个空的镜像
  2. 下载需要的环境 ADD
  3. 执行环境变量的配置 ENV
  4. 执行一些Linux命令 RUN
  5. 日志 CMD
  6. 端口暴露 EXPOSE
  7. 挂载数据卷 VOLUMES

这个过程就是你手动部署项目的过程,你通过 docker 可以再未来实现自动化构建。

CMD 与 ENTRYPOINT 区别

两个命令都是指定一个容器启动时要运行的命令,但二者有很大的区别

  • CMD:容器内有多个 CMD 指令时,只有最后一个 CMD 指令会生效,而如果在执行docker run命令时携带了其它命令,将会覆盖掉所有 dockerfile 的 CMD 指令

  • ENTRYPOINT:ENTRYPOINT 的命令不容易被覆盖。在docker run命令中提供的任何参数都会作为 ENTRYPOINT 命令的参数传递。

当两者组合使用时:那么 CMD 将作为 ENTRYPOINT 的默认参数,如果在docker run命令中提供了参数,它将覆盖 CMD 并作为 ENTRYPOINT 的参数传递。

例如:

FROM centos
CMD ["echo", "hello world"]

运行容器时,可以覆盖默认的 CMD:

docker build -f Dockerfile -t cmdtest .
docker run cmdtest /bin/bash

结果不会打印出hello world

使用 ENTRYPOINT 指令:

FROM centos
ENTRYPOINT ["echo", "hello "]
CMD ["world"]

运行容器时,可以传递参数给 ENTRYPOINT:

docker build -f Dockerfile -t entrytest .
docker run entrytest 	  	# 输出hello world
docker run entrytest akuya	# 输出hello akuya

练习:构建一个 tomcat,编写首页

使用空镜像从零构建一个完整的 tomcat

一般一个项目都在一个文件夹中,我们只需要在项目目录下编辑一个 Dockerfile 文件即可

当执行docker bulid指定时如果没有-f参数指定 dockerfile 文件,会默认寻找项目目录下的 Dockerfile 来构建镜像,所以我们名字通常设定为Dockerfile

准备工作:准备 tomcat 和 jdk 的 jar 包,创建Dockerfile文件,以及一个任意内容的readme.md即可

在这里插入图片描述

编辑Dockerfile,内容如下:

FROM centos:7.9.2009
MAINTAINER akuya<123456@qq.com>

# 宿主机目录下文件拷贝到容器内,文件如果不是绝对路径会默认寻找 dockerfile 文件的同级目录下,所以最好所有文件都在同一个目录下
COPY readme.md /usr/local/readme.md

# 添加我们自己的安装包
ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local

#安装vim编辑器
RUN yum -y install vim

# 配置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 暴露端口
EXPOSE 8080

# 启动的时候自动运行tomcat,打印日志
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

构建并运行:

# 构建,不指定 dockerfile 文件会自动寻找该目录下的 Dockerfile
docker build -t mytomcat .
# 运行
docker run -d -p 8080:8080 --name mytomcat \
-v /root/mytomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \
-v /root/mytomcat/logs:/usr/local/apache-tomcat-9.0.22/logs \
--privileged=true \
mytomcat

运行成功后打开浏览器,输入ip地址:8080,即可访问到 tomcat 主页

在这里插入图片描述

在我们自定义的 tomcat 服务器中上传一个项目,在本地挂载目录,丢一个项目上去。

首先进入到我们挂载的宿主机目录下/root/mytomcat

[root@iZbp15293q8kgzhur7n6kvZ mytomcat]# cd /root/mytomcat/
[root@iZbp15293q8kgzhur7n6kvZ mytomcat]# ll
total 8
drwxr-xr-x 2 root root 4096 Mar 21 14:45 logs
drwxr-xr-x 2 root root 4096 Mar 21 14:45 test

在 test 目录下丢项目即可

示例:编写一个index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>docker test</title>
</head>
<body>
    <h1>----------hello akuya----------------</h1>
    <br>
    <h2>my docker tomcattest</h2>
</body>
<script>
    console.log("my docker tomcat log")
</script>
</html>

浏览器访问ip地址:8080/test/

在这里插入图片描述

发布镜像

公有仓库:DockerHub

目前 DockerHub 网址无法访问,了解即可

注册dockerhub https://hub.docker.com/signup,需要有一个账号

发布镜像遵循以下几个步骤:

  1. 登录用户:
docker login

参数:

  • -u:等价于--username,登录所需的用户名
  • -p:等价于--password,密码
  1. 给要上传的镜像打上标签
docker tag 镜像id 镜像名:版本号
  1. 上传镜像
docker push 镜像名:版本号

私有仓库,一般都是公司内部自行搭建的,步骤跟上述相同

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

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

相关文章

开关电源测试项目大解密:如何成为合格的开关电源

开关电源作为重要的电源供应器&#xff0c;在其研发生产过程中对质量的把控是非常严格的。为了保证开关电源的质量和性能&#xff0c;开关电源测试贯穿研发、生产的始终。那么一个合格的开关电源需要经过哪些测试呢&#xff1f; 一、常规功能测试 1. 过压保护 2. 短路保护 3. 过…

Qt教程 — 3.7 深入了解Qt 控件: Layouts部件

目录 2 如何使用Layouts部件 2.1 QBoxLayout组件-垂直或水平布局 2.2 QGridLayout组件-网格布局 2.3 QFormLayout组件-表单布局 在Qt中&#xff0c;布局管理器&#xff08;Layouts&#xff09;是用来管理窗口中控件位置和大小的重要工具。布局管理器可以确保窗口中的控件在…

yarn的使用与安装

文章目录 1.安装方式一&#xff1a;全局安装yarn2.安装方式二&#xff1a;通过开启corepack安装3.其他部分yarn命令4.Yarn镜像配置5.Pnpm使用方法同yarn无区别,可按照以上yarn的安装以及使用方式来使用pnmp 1.安装方式一&#xff1a;全局安装yarn 全局安装yarn npm i yarn -g…

MySQL数据库-MySQL基础-下篇-函数、约束、多表查询、事务

文章目录 函数一、字符串函数练习 二、数值函数三、日期函数四、流程函数总结 约束概述约束演示外键约束概念语法删除/更新行为 总结 多表查询多表关系一对多&#xff08;多对一&#xff09;多对多一对一 多表查询概述内连接外连接自连接*联合查询-union, union all子查询标量子…

6.shell case控制语句

case控制语句 1.什么是case case条件语句相当于多分支的if/elif/else条件语句&#xff0c;主要还是用来做条件判断的,常被应用于实现系统服务启动脚本。 case语句中&#xff0c;会将case获取的变量值与表达式部分的值1、值2、值3等逐个进行比较&#xff0c;如果变量值和某个表…

大创项目推荐 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

六面体单元热应力问题有限元求解 | Matlab源码 | 理论文本 | 温度应力 | 热应变 |温度应变 |热力耦合

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

数字化转型导师坚鹏:数字化人才培养—企业数字化转型的核心力量

数字化人才培养&#xff1a;企业数字化转型的核心力量 ——数字化转型背景下重塑企业干部核心竞争力 授课背景&#xff1a; 很多银行存在以下问题&#xff1a; 企业干部不清楚企业需要哪些数字化人才&#xff1f; 企业干部不知道设计数字化人才培养方案&#xff1f; 企…

南京观海微电子---初识PCIe协议——PCIe接口专栏(一)

2. 概述 PCIe协议是一种端对端的互连协议&#xff0c;提供了高速传输带宽的解决方案。与传统的并行总线标准如PCI和PCI-X相比&#xff0c;PCIe提供了更低的延迟和更高的数据传输速率。每个连接到主板上的设备都通过独立的点对点连接与之相连&#xff0c;这避免了设备之间因为共…

桌面显示器PD芯片:引领桌面显示技术的新篇章

随着科技的飞速发展&#xff0c;桌面显示器作为人们日常工作与生活中不可或缺的重要设备&#xff0c;其性能与品质也在不断提升。其中&#xff0c;PD芯片作为桌面显示器中的核心组件&#xff0c;发挥着至关重要的作用。本文将对桌面显示器PD芯片进行详细介绍&#xff0c;探讨其…

Xinstall让App推广变得高效而简单

随着移动互联网的迅猛发展&#xff0c;App已成为人们生活中不可或缺的一部分。然而&#xff0c;对于众多开发者和广告主来说&#xff0c;如何高效地推广自己的App&#xff0c;却一直是一个令人头疼的问题。今天&#xff0c;我们要为大家介绍的&#xff0c;正是国内专业的App全渠…

ngrok实现内网穿透

在使用jenkins进行自动化部署时&#xff0c;需要设置github的webhook钩子来触发构建&#xff0c;由于jenkins运行在自己的电脑上&#xff0c;因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…

Wireshark 抓包工具与长ping工具pinginfoview使用,安装包

一、Wireshark使用 打开软件&#xff0c;选择以太网 1、时间设置时间显示格式 这个时间戳不易直观&#xff0c;我们修改 2、抓包使用的命令 1&#xff09;IP地址过滤 ip.addr192.168.1.114 //筛选出源IP或者目的IP地址是192.168.1.114的全部数据包。 ip.sr…

银河麒麟系统安装设备类型选择lvm简单模式之后,数据写入导致失败导致系统重启无法正常加载

银河麒麟系统安装设备类型选择lvm简单模式之后&#xff0c;数据写入导致失败导致系统重启无法正常加载 一 系统环境1.1 系统版本信息1.2 通过镜像安装的过程中选择设备类型选择的是lvm简单模式 二 问题描述三 问题修复过程3.1 挂载ISO镜像&#xff0c;引导到字符终端界面3.2 修…

如何注册 onlyFans? onlyFans 如何订阅教程

一、onlyFans 介绍 OnlyFans 是一个在线平台&#xff0c;允许创作者为他们的内容提供订阅服务&#xff0c;通常是成人内容或独家内容。该平台于2016年成立&#xff0c;起初被认为是一个用于演员、模特、艺术家和其他创意行业从业者分享内容的地方。随着时间的推移&#xff0c;O…

骑砍战团MOD开发(49)-使用ScoEditor编辑sco文件制作游戏场景

一.ScoEditor下载霸王•吕布 / ScoEditor GitCodehttps://gitcode.net/qq_35829452/scoeditor二.ScoEditor导出文件种类 mission_objects.json:场景物/出生点/通道等物体 layer_ground_elevation.pfm:场景terrain/ground地形增量,采用PFM深度图存储 ai_mesh.obj:AI网格静态模型…

二、SpringBoot3 配置文件

本章概要 统一配置管理概述属性配置文件使用YAML 配置文件使用批量配置文件注入多环境配置和使用 2.1 统一配置管理概述 SpringBoot工程下&#xff0c;进行统一的配置管理&#xff0c;你想设置的任何参数&#xff08;端口号、项目根路径、数据库连接信息等等)都集中到一个固定…

Echarts地图之——如何给省份名称添加背景图片背景色

上次添加的背景是给整张地图添加的&#xff0c;如果想要给省份名称设置背景图&#xff0c;我们就要在label配置里面去添加设置。 series: [ {type: map,map: china,aspectScale: 0.85,zoom: 1.2,top: 9%,left: 11%,roam: false,selectedMode: multiple,label: {show: true,col…

基于springboot的服装商城系统(含源文件)

&#xff08;源码附文章底部&#xff09; 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;时装购物系统当然也不能排除在外。时装购物系统是以实际运用为开发背景&#…

C++关键字:const

文章目录 一、const的四大作用1.修饰 变量、数组2.修饰 函数的形参、修饰 引用 (最常用&#xff09;3.修饰 指针&#xff1a;常量指针、指针常量 、只读指针4.修饰 类的成员函数、修饰 类的对象 一、const的四大作用 1.修饰 变量、数组 1.const修饰变量&#xff1a; 被const修…