Docker容器

本文介绍了Docker容器技术,包括其与虚拟化的区别、DevOps中的应用、镜像、容器和仓库的原理,以及Docker的安装、常用命令和数据卷的使用。通过Docker,可以实现应用的快速部署、升级和资源高效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Docker 简介

虚拟化技术

DevOps(开发、运维)

docker的镜像、容器和仓库

安装

Docker底层原理

Docker的常用命令

镜像命令

容器命令

其他常用命令

创建Nginx仓库

创建tomcat容器

部署es + kibana

可视化(-v数据卷)

 Docker镜像讲解

容器数据卷
​​​​​​​​​​​​​​

Docker 简介

传统发布一个项目(jar+(redis、mysql、jdk...依赖包)),环境配置十分的麻烦,每一个机器都要部署环境,而docker可以将应用程序和依赖包一起打包成镜像部署上线。

传统:开发编辑jar包,运维去部署

现在:开发打包部署上线,一整套流程做完

 Docker的思想来自于集装箱

容器技术的重点是隔离,Docker核心思想打包装箱,每个箱子是相互隔离的,通过隔离机制,可以将服务器利用到极致。

Docker没有出来之前,我们都是用虚拟机,而虚拟机很笨重,隔离需要开启多个虚拟机,docjer就是为了解决这个问题,所以它是秒级启动,更加轻巧。

Docker是基于GO语言开发的

总结:什么是Docker容器?docker是一个开源的,可以让开发者将应用和依赖一起打包的容器技术,容器完全使用隔离机制,容器之前没有任何接口。

虚拟化技术

1.虚拟机技术,优点:安全性最高,缺点是资源占用很多(需要模拟完整的操作系统),冗余步骤多,启动很慢,

2.容器化技术,不是模拟完整的操作系统

不同点

1、传统的虚拟机虚拟一个硬件,运行在一个完整的操作系统上安装和运行软件

2、容器内的应用都是直接运行在宿主机的内核,容器是没有自己的内核,也没有虚拟我们的硬件,所以更轻便,每个容器间相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。

DevOps(开发、运维)

应用更快速的交付和部署

传统:一堆帮助文档,安装程序

docker:打包镜像发布测试,一键运行

更便捷的升级扩缩容

使用了Docker之后,我们部署应用就像搭积木一样

更简单的系统运维

在容器化后,我们的开发测试环境都是高度一致的

更高效的利用计算资源

总结:为什么要用docker容器?因为传统的虚拟机技术是模拟一整套操作系统,占用资源会很大,项目部署的操作很繁琐,启动也很慢,而docker容器可以使应用快速的交付部署,升级更便捷,资源利用更高效

docker的镜像、容器和仓库

镜像(image)

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,

tomcat镜像 ===> run ===>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)

容器(container)

Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建的,可以把容器理解为一个简易的Linux系统

仓库(repository)

仓库分为公有仓库和私有仓库

安装

查看环境

#系统内核3.10以上的
[root@localhost ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
#系统版本
[root@localhost ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

在 CentOS | 上安装 Docker 引擎Docker 文档

#卸载旧的docker
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#下载安装包
yum install -y yum-utils
#设置镜像仓库

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  #默认是从国外下载,特别慢

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #国内阿里云镜像

#更新yum软件包索引
yum makecache fast

#安装docker相关的  docker-ce 社区版  ee企业版
yum install docker-ce docker-ce-cli containerd.io

#启动docker
systemctl start docker

#使用docker version查看是否成功
docker version

#运行镜像hello-world
docker run hello-world

 

#查看docker中的镜像
[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

了解:卸载docker

#卸载 Docker 引擎、CLI 和容器包:
yum remove docker-ce docker-ce-cli containerd.io

#主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

阿里云镜像加速器

 配置使用

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://py5f753t.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

Docker底层原理

Docker是怎么工作的?

Docker是一个client——server结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问,Docker server接收到Docker client的指令就会执行这个命令。

Docker为什么比虚拟机快?

1.docker比虚拟机的抽象层更少

2.docker利用的是宿主机的内核,虚拟机需要Guset OS,新建一个容器的时候docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guset OS 分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程

Docker的常用命令

帮助命令

docker |Docker 文档

#显示docker的版本信息
docker version 
#显示docker的系统信息,包括镜像和容器的数量
docker info
#帮助命令
docker --help

镜像命令

docker 镜像|Docker 文档

#查看所有本地的主机上的镜像
[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

#解释
#REPOSITORY 镜像的仓库源
#TAG        镜像的标签
#IMAGE ID   镜像的id
#CREATED    创建时间
#SIZE       大小

#可选
-a          #所有镜像
-q          #只显示id

docker search 搜索镜像

[root@localhost ~]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12391     [OK]
mariadb                          MariaDB Server is a high performing open sou…   4768      [OK]
mysql/mysql-server               Optimized MySQL Server Docker images. Create…   917                  [OK]
percona                          Percona Server is a fork of the MySQL relati…   573       [OK]
phpmyadmin                       phpMyAdmin - A web interface for MySQL and M…   495       [OK]

#可选项,通过收藏次数过滤
--filter=STARS=3000  #搜索出来的镜像就是STARS大于3000的
[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12391     [OK]
mariadb   MariaDB Server is a high performing open sou…   4768      [OK]

docker pull 下载镜像shan

#下载镜像docker pull 镜像名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest    #如果不写tag,默认就是latest最新的
latest: Pulling from library/mysql
72a69066d2fe: Pull complete  #分层下载,docker images的核心 联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709  #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真实的地址

#指定文件下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

 docker rmi 删除镜像

#删除指定容器
docker rmi -f 容器id 
#删除多个容器
docker rmi -f 容器id 容器 id 容器id
#删除所有容器
docker rmi -f $(docker images -aq)

容器命令

说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像

docker pull centos

新建容器并启动

docker run [可选项] image

#参数说明
--name="Name"  容器名称 tomcat01、tomcat02.用来区分容器
-d             后台方式运行
-it            使用交互方式运行,进入容器查看内容
-p             指定容器的端口 -p 8080:8080
    -p ip 主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口
-P             指定随机的端口

#测试、启动并进入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@c911c0d68d0c /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#退出
exit

列出所有的运行的容器

#docker ps 命令
docker ps   #列出当前正在运行的容器
-a    #列出当前正在运行的容器 + 历史运行过的容器
-n=?    #列出最近创建的容器
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                       PORTS     NAMES
c911c0d68d0c   centos        "/bin/bash"   4 minutes ago   Exited (130) 2 minutes ago             laughing_lovelace
e352e0ad7139   hello-world   "/hello"      23 hours ago    Exited (0) 23 hours ago                xenodochial_haibt
[root@localhost ~]# docker ps -a -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                       PORTS     NAMES
c911c0d68d0c   centos    "/bin/bash"   4 minutes ago   Exited (130) 2 minutes ago             laughing_lovelace
[root@localhost ~]# docker ps -aq
c911c0d68d0c
e352e0ad7139

退出容器

exit   #关闭退出
ctrl + P + Q  #不关闭推出

删除容器

#删除指定的容器,不能删除正在运行的容器,如果要强制删除 docker rm -f
docker rm 容器id   
#删除所有容器
docker rm -f $(docker ps -aq) 
#删除所有容器
docker ps -a -q|xargs docker rm 

启动和停止容器的操作

#启动容器
docker start 容器id
#重启容器
docker restart 容器id
#停止容器
docker stop 容器id
#强制停止容器
docker kill 容器id

其他常用命令

后台启动容器

#命令 docker run -d 镜像名
[root@localhost ~]# docker run -d centos

#问题docker ps,发现centos停止了
#常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后发现自己没有提供服务,就会立即停止

查看日志

#自己写一个脚本,让centos后台运行
[root@localhost ~]# docker run -d centos /bin/bash -c "while true ; do echo chentian ; sleep 1 ;  done"

#显示日志
-tf   
--tail number #要显示日志的条数

[root@localhost ~]# docker logs -tf --tail 10 d6fc399ce0d2

查看容器中的进程信息

[root@localhost ~]# docker top d6fc399ce0d2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                24509               24491               0                   17:43               ?                   00:00:00            /bin/bash -c while true ; do echo chentian ; sleep 1 ; done

查看镜像元数据

[root@localhost ~]# docker inspect d6fc399ce0d2

进入当前正在运行的容器

#我们的容器通常都是以后台方式运行,需要进入容器,修改一些配置
[root@localhost ~]# docker exec -it d6fc399ce0d2 /bin/bash
[root@d6fc399ce0d2 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@d6fc399ce0d2 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:43 ?        00:00:00 /bin/bash -c while true ; do echo chentian ; sleep 1 ;  done
root       829     0  0 09:57 pts/0    00:00:00 /bin/bash
root       896     1  0 09:58 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       897   829  0 09:58 pts/0    00:00:00 ps -ef

#方式二
docker attach 容器id
[root@localhost ~]# docker attach d6fc399ce0d2
正在执行当前代码...

#docker exec  进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach 进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

#创建容器
[root@localhost ~]# docker run -it centos /bin/bash
#退出容器
[root@20cd9e411f48 /]# exit
exit
#查看容器信息
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                        PORTS     NAMES
20cd9e411f48   centos    "/bin/bash"   54 seconds ago   Exited (127) 18 seconds ago             musing_pare
993ffc1fde2b   centos    "/bin/bash"   4 minutes ago    Exited (0) 2 minutes ago                wizardly_saha
#开启容器
[root@localhost ~]# docker start 20cd9e411f48
20cd9e411f48
#进入容器内部
[root@localhost ~]# docker attach 20cd9e411f48
[root@20cd9e411f48 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@20cd9e411f48 /]# cd home
[root@20cd9e411f48 home]# ls
#创建一个文件
[root@20cd9e411f48 home]# touch test.java
[root@20cd9e411f48 home]# ls
test.java
[root@20cd9e411f48 home]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
20cd9e411f48   centos    "/bin/bash"   3 minutes ago   Exited (0) 11 seconds ago             musing_pare
993ffc1fde2b   centos    "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago              wizardly_saha
#将容器中的文件拷贝到主机
[root@localhost ~]# docker cp 20cd9e411f48:/home/test.java /root
[root@localhost ~]# ls
anaconda-ks.cfg  redis-5.0.14  redis-5.0.14.tar.gz  test.java

#拷贝是一个手动过程,我们可以通过使用 -v 卷的技术实现

创建Nginx仓库

#1.搜索nginx镜像
[root@localhost ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        16613     [OK]
bitnami/nginx                                     Bitnami nginx Docker Image                      121                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   40
#2.下载nginx镜像
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#3.后台启动nginx,并配置连接端口
[root@localhost ~]# docker run -d --name nginx01 -p 8091:80 nginx
9fedb977e0f42f41cb5ea8453ebff2ba1341cf60679068350e6eb480696b52b4
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
9fedb977e0f4   nginx     "/docker-entrypoint.…"   26 seconds ago   Up 22 seconds   0.0.0.0:8091->80/tcp, :::8091->80/tcp   nginx01
#4.本地访问
[root@localhost ~]# curl localhost:8091
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#进入容器
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@9fedb977e0f4:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@9fedb977e0f4:/# cd etc/nginx
root@9fedb977e0f4:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@9fedb977e0f4:/etc/nginx#

端口暴露的概念 

 思考?我们每次改动Nginx的配置文件,都需要进入容器内部,十分的麻烦,我要是可以在容器外部提供一个映射路径,在容器修改文件名,容器内部就可以自动修改就好了。  可以用  -v  数据卷

创建tomcat容器

#可以在dockerhub上面去查看版本信息下载
docker pull tomcat:9.0
#运行
docker run -d -p 8080:8080 --name tomcat01 tomcat9.0
#可以访问,但是没有tomcat

#进入容器
dockers exec -it tomcat01 /bin/bash
root@568e1b040eae:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@568e1b040eae:/usr/local/tomcat# cd webapps
root@568e1b040eae:/usr/local/tomcat/webapps# ls

#发现问题,1.Linux命令少了,2.webapps是空的。原因阿里云和镜像默认是最小的的镜像,
#所有不必要的都剔除掉,保证最小可运行环境

思考?我们以后要部署项目,如果每次都要进入容器是不是十分麻烦,我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了。

部署es + kibana

# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录!挂载
# --net somenetwork  网络配置
# 启动es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 启动了 Linx就卡住了  docker stats 查看cpu的状态

# 增加内存的限制,修改配置文件 -e ,环境配置修改
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.6.2

 查看cpu状态

docker stats

[root@localhost ~]# curl localhost:9200
{
  "name" : "a973572f5349",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "OosLG8r3TYu6pAKpMfrOkQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

可视化(-v数据卷)

docker run -d -p 8080:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

 Docker镜像讲解

镜像是什么?

镜像是一种轻量级,可执行的独立的软件包。它包含运行某个软件所需要的所有内容,包含代码、运行时、库、环境变量和配置文件。

所有的应用,直接打包docker镜像,就可以直接跑起来!

如何得到镜像呢?

1.从远程仓库下载

2.拷贝

3.自己生成

Docker镜像加载原理

docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统是UnionFS(联合文件系统)。

UnionFS:是一种分层,轻量级并且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层一层的叠加(和git提交代码一样),同时可以将不同目录挂载到同一个虚拟文件下面。

bootfs (boot file system) 主要包含 bootloader(引导加载程序) 和 kernel(内核), bootloader主要是引导加载kernel, 当boot成功后 kernel 被加载到内存中后 bootfs就被卸载了.

rootfs (root file system) 包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。

 为什么docker的镜像比虚拟机小那么多?

因为docker底层直接用host的kernel,只需要rootfs就可以,省却了bootfs(一起用一个公共的bootfs)。

特点:

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都是镜像层

如何提交一个自己的镜像

commit 镜像

docker commit 提交容器成为一个新副本

#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

[root@localhost ~]# docker commit -a="huaxiaobai" -m="add webapps app" c5b012c83d1f tomcat02:1.0
sha256:387d7752198ede98f37c39f97afa02a2bc27ac05bd8cdcdb59c14c3752386353
[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
tomcat02        1.0       387d7752198e   17 seconds ago   685MB
nginx           latest    605c77e624dd   3 months ago     141MB
tomcat          9.0       b8e65a4d736d   3 months ago     680MB

容器数据卷

什么是容器数据卷

将docker容器产生的数据,同步到本地,将容器内的目录挂载到linux上面,将数据同步到Linux中

总结:容器的持久化和同步操作!容器间是可以数据共享的

 使用数据卷

#docker run -it -v 主机目录:容器目录
docker run -it -v /home/ceshi:/home centos /bin/bash

#在容器中添加文件
[root@021759bd5b84 home]# touch test.java
#在本地查看
[root@localhost ceshi]# ls
test.java

#进入进入文件,进行修改
[root@localhost ceshi]# vim test.java
#在容器中查看
[root@021759bd5b84 home]# cat test.java
class test{
}

好处:我们以后修改只用在本地修改就可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值