【docker】doker概述与常用指令

1. docker概述

Docker 是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在本地编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

Docker平台就是一个软件集装箱化平台,意味着我们自己可以构建应用程序,将其依赖关系一起打包到一个容器中,然后这容器就很容易运送到其他的机器上进行运行,而且非常易于装载、复制、移除,非常适合软件弹性架构。

总结:

Docker 是一个开放平台,使开发人员和管理员可以在称为容器的松散隔离的环境中构建镜像、交付和运行分布式应用程序。以便在开发、QA 和生产环境之间进行高效的应用程序生命周期管理。

个人理解:
docker作为一个容器管理平台,是一个虚拟化技术,其作为平台对docker中的容器进行管理,而每个“集装箱”则可以理解为一个单独的运行环境
docker 内部存在一个最基本的Linux内核,通过创建容器(包含程序及其环境、配置)在该Linux内核中运行

在这里插入图片描述

1.1虚拟化简述

​ 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

​ 常见的虚拟化技术如:软件虚拟化、虚拟机、网络虚拟化等。

1.2 docker 与虚拟机

在这里插入图片描述

总体而言。docker与虚拟机的最大区别是,docker模拟的不是一个完整的操作系统,各个容器共享一个OS的资源,是从应用层面进行的隔离。相比于虚拟机完整的模拟物理环境搭建的操作系统,docker更加轻量,启动快、占用资源少。

DockerVMware
虚拟化轻量级虚拟化(只虚拟出来容器所需要的资源,软件层面)完全虚拟化(虚拟化硬件)
启动速度秒级分钟级
运行性能接近原生5%左右损失
磁盘占用MBGB
数量成百上千一般几十台
隔离性进程级别系统级(更彻底)
操作系统主要支持Linux几乎所有
封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统

1.3 docker中的主要概念

1. 镜像(image)

**Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)**。

**镜像可以被创建、启动、关闭、重启以及销毁。**

镜像不包含任何动态数据,其内容在构建之后也不会被改变。

Docker 设计时,就充分利用 Union FS 的技术,将其设计为**分层存储的架构**。 **即镜像实际是由多层文件系统联合组成**。(类似的,视频网站也是常利用分层存储的思路,保证视频数据的安全性)

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。

​ 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

​ 镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容。Docker以镜像和在镜像基础上构建的容器为基础,以容器开发、测试、发布的单元将应用相关的所有组件和环境进行封装,避免了应用在不同平台间迁移所带来的依赖问题,确保了应用在生产环境的各阶段达到高度一致的实际效果。

2. 容器(container)

**镜像运行时的实体。**

**镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。**

**容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。与镜像一样,容器使用的也是分层存储。**

**容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。**因而容器所有的文件写入操作,都应该使用**数据卷(Volume)**、或者**绑定宿主目录(通过-v)**,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,(即实现数据的持久化)其性能和稳定性更高。

**数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡**。因此, 使用数据卷后,容器可以随意删除、重新 创建run,数据不会丢失。

3. 仓库(repository)

​ 镜像构建完成后,可以很容易的在当前宿主服务器上运行,但是,如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,而Docker Registry 就是这样的服务。

​ 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

​ 因此,镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。

​ 通常一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest 作为默认标签。

公共仓库与私有仓库:

公开仓库是开放给用户使用、允许用户管理镜像的服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。最常使用的 公开仓库是官方的 Docker Hub ,这也是默认的仓库,拥有大量的高质量的官方镜像,网址为:[hub.docker.com/](https://hub.docker.com/) 

此外在国内访问 Docker Hub 可能会比较慢,因此国内也有一些云服务商提供类似于 Docker Hub 的公共服务。

除了使用公开仓库外,还可以在本地搭建私有 仓库 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 Docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

1.4 docker的架构

docker采用客户端-服务器架构。 Docker客户端(client) 与 守护进程(Docker daemon)进行对话,该守护进程 完成构建、运行和分发 Docker 容器的繁重工作。

在这里插入图片描述

​ Docker client是一个泛称,它可以是命令行docker,也可以是遵循了docker API规则的客户端,简单地说可以理解为一个用于交互/发送指令的接口。

1.5 docker的优势

简化配置

虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

​ 简单的来说,容器镜像打包完成后,它就是个独立的个体了,丢到哪里都能跑,而无需针对各个平台去独立配置。

代码流水线管理

​ 一般代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

提高开发效率

​ 使用Docker非常简单的就能够实现这两点,而且哪怕是开发环境的机器配置一般的情况下搭建多个生成服务应用。一台一般配置服务器或开发机也能轻松的跑起多个Docker应用,而无需额外增加机器配置。

隔离应用

很多情况下,我们需要在一台服务器上运行多个不同的应用,比如上面提到的提高开发效率的场景等。

​ 经常需要考虑三点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(比如微服务架构),三是还需要考虑应用之间的兼容性。而对于Docker来说,支持起来就非常简单了。同一台机器,我可以同时运行N个Docker web应用,托管到不同的Web服务器(Kestrel、Ngnix、Tomcat),而无需担心它们会发生冲突,也无需担心我的开发机器会跑不起来。

整合服务器

​ 正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。

快速部署

​ 在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。你可以在服务器中或云端创建销毁资源而无需担心重新启动带来的开销。


2. docker常用指令

1. docker基础指令

启动docker

systemctl start docker #systemctl表示系统级设置

关闭docker

systemctl stop docker 

重启docker

systemctl restart docker

设置docker随服务而自启动

systemctl enable docker

查看docker运行状态

systemctl status docker

查看docker版本信息

docker version 或者 docker info

docker 帮助指令

docker --help 忘记了某些命令便可使用此进行查看与回顾

比如拉取命令不知道可以带哪些参数 可以这样使用 docker pull --help

2. 镜像相关指令

1. 查看镜像列表

docker image ls docker images

docker images -a:列出所有镜像

2. 搜索镜像

docker search [OPTIONS] <image_name>

示例:

docker search -f stars=10 java   #从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像

OPTIONS说明:
**–no-trunc : ** 不显示完整的镜像描述;
-f, --filter <过滤条件>: 如 -f stars = 10

3. 拉取镜像

docker pull <image_name>
docker pull <image_name>:<Tag> tag即版本号

不加tag(版本号) 即拉取docker仓库中该镜像的最新版本latest , 加:tag 则是拉取指定版本

4. 删除镜像

注意:当前镜像没有被任何容器使用或没有存在依赖关系才可以删除,慎用强制删除

docker rmidocker image rm 的简写

docker rmi [-f] <镜像名/镜像ID> :删除单个镜像 -f参数表示强制删除
docker rmi [-f] <镜像名/镜像ID> <镜像名/镜像ID>... <镜像名/镜像ID> :删除多个 其镜像ID或镜像名用空格隔开即可
docker rmi [-f] $(docker images -a -q) :删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID

该命令会先使用“docker images -q”命令查询系统上的所有镜像,并使用“$(docker images -q)”将查询结果作为参数传递给“docker rmi”命令,从而实现删除所有镜像的操作。

5. 保存镜像

docker save -o <path/to/filename.tar> <image_name> :将镜像保存到指定位置

示例:

docker save -o /home/user/my_image.tar my_image:latest 
#执行此命令后,Docker 将创建一个 tar 归档文件 `/home/user/my_image.tar`,其中包含名为 `my_image:latest` 的 Docker 镜像。此命令只能保存单个镜像。如果需要保存多个镜像,请使用多个 `docker save` 命令。

6. 加载镜像

docker load -i <path/to/filename.tar>
# : -i 或者 -input 一样。其中,<path/to/filename.tar> 为要加载的镜像的 tar 归档文件的路径。

3. 容器相关指令

细节:

  1. 容器id一般是容器唯一定义标识码的前12位

1. 创建容器

1.1 创建不自动启动

docker create [options] <image_name> [command] [arg](创建一个新的容器但不启动它)

​ 其中,<image_name> 是要基于哪个镜像创建容器。 [options] [command][arg] 是可选项,允许您在容器启动时指定要执行的命令及其参数。

options常用选项:

-a, --attach=xxx:连接到容器的标准输入、输出或错误流。

-e, --env=xxx:设置环境变量。

--name:为容器指定一个名称。

-p:将容器的端口绑定到主机。

-v, --volume=[]:将主机目录或卷挂载到容器。

示例:

docker create --name myNginx nginx:latest #使用docker镜像nginx:latest创建一个容器,并将容器命名为mynginx
1.2 创建并自动启动

docker run [options] <image_name> [command] [arg]

​ 其中,<image_name> 是要基于的镜像名称。如果本地不存在该镜像,Docker 会尝试从 Docker Hub 下载。

[options] 是可选参数,用于配置容器的特性和行为。例如,可以指定容器的名称、映射端口、挂载卷等。

[command] 是容器启动后要执行的命令。如果不指定,默认情况下将运行容器中的默认命令(定义在镜像中)。

示例:

docker run -it ubuntu echo "Hello, World!"`
# 该命令将下载并使用 `ubuntu` 镜像创建一个容器,并在容器内执行 `echo "Hello, World!"` 命令。`-it` 参数用于分配一个交互式的终端。

options常见参数:

-d:以后台模式(detached mode)运行容器。

-v <host_path>:<container_path>:将宿主机上的目录或文件挂载到容器中。

例如,-v /path/on/host:/path/on/container 将宿主机上的 /path/on/host 目录挂载到容器中的 /path/on/container 目录。

--name <container_name>:指定创建容器的名称。

-e <key>=<value>:设置容器的环境变量。

例如,-e MYSQL_ROOT_PASSWORD=secret 设置名为 MYSQL_ROOT_PASSWORD 的环境变量,将其值设置为 secret

--restart <restart_policy>:指定容器在退出时的重新启动策略。

例如,--restart always 表示容器会在退出时自动重新启动。

-it:分配一个交互式的终端。-i:以交互模式运行容器 -t:为容器重新分配一个伪输入终端

--rm:容器退出后自动删除容器。

--privileged: 设置容器公开权限(默认为true)

--network:自定义的docker网络名称

--ip:自定义网络中的ip地址

-p <host_port>:<container_port>容器端口映射,将容器内部的端口映射到宿主机的指定端口。

[因为docker容器是相互隔离的,相当于一个独立的环境,因而想要访问一个容器需要让宿主机或者访问者的端口与被访问] 例如,-p 8080:80 将容器的 80 端口映射到宿主机的 8080 端口。

示例:

docker run -it \ 
--name mysql \ 
--network 自定义网络的名称 \
--ip 自定义IPv4地址 \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3311:3306   #端口映射 左为外界端口:容器中应用的端口 -d mysql
-d mysql

注意:若run命令中的指定的镜像本地不存在,则会自动从远程下载最新的镜像

1.3 使用-v / --volume 参数实现容器数据持久化
docker run -it \ 
--name mysqlX \ 
--network 自定义网络名称 \ 
--ip 自定义Ip地址 \   # :左边是外部自定义的文件(CenterOS): 右边是mysql应用在docker容器中数据存储的位置 实现宿主机与docker容器的文件关联
-v /usr/local/softwares/mysql/3306/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/softwares/mysql/3306/data:/var/lib/mysql \ 
-v /usr/local/softwares/mysql/3306/mysql-files:/var/lib/mysql-files \ 
-d mysql

2. 启动已存在的容器

docker start <container_name_or_id>其中,<container_name_or_id> 是要启动的容器的名称或容器的 ID。

3. 重启容器

注意:一般修改完容器配置后需要重启容器

  docker restart  <container_name_or_id>

4. 进入容器

docker exec -it <container_name_or_id> <command>

`<command>` 是要在容器内部执行的命令,通常使用一个交互式终端命令,如 `bash`  或者 `/bin/bash`

-it:以交互模式运行容器 ,为容器重新分配一个伪输入终端。

bash: bash(GNU Bourne-Again Shell)是最常用的一种shell(运行在终端的互动程序)

示例:

docker exec -it mysql_3306 bash

5. 停止正在运行的容器

  docker stop <container_name>
5.1 容器启动IP地址问题
docker容器启动时,docker会对容器进行分配动态的ip地址,即由启动docker的顺序确定。而多个容器启动时的顺序是不确定的,因而容器被自动分配的ip地址也不确定,在进行主从容器配置时,会造成隐患

解决方案:使用静态网络ip,为每个容器分配一个固定的IP地址

docker network create --driver bridge \
--subnet=自定义网络ip/16 \
--gateway=网关值 
自定义网络名称

6. 删除容器

注意:删除容器前应当先停止容器

docker rm <container_name / id> :id 可以只写明前4位

docker rm -f <container_name / id> :强制删除

docker rm -v <container_name / id> :删除容器 , 并删除容器挂载的数据卷

docker rm $(docker ps -a或-q) 删除所有已经停止的容器:

7. 查看容器

docker ps 查看当前正在运行的容器

docker ps -a 查看所有容器

8. 查看容器详细信息

docker inspect 用于获取容器、镜像或网络等对象的详细信息的命令。它提供了关于对象的元数据和配置的全面视图。

具体用法:

  1. 查看容器的详细信息: docker inspect <容器名称或ID>

  2. 查看镜像的详细信息: docker inspect <镜像名称或ID>

  3. 查看网络的详细信息: docker inspect <网络名称或ID>

  4. 查看多个对象的详细信息: docker inspect <对象1> <对象2> ...

8.1 >> Linux重定向(将详细信息输出到文件中,方便查看)
docker inspect >> /usr/xxx.txt
8.2 Linux 管道过滤信息
docker inspect | grep 关键字

# 同样也可以使用cat指令查看文件搭配管道grep指令达到仅查看文件关键的作用
cat 文件名 | grep 关键字
8.3 Linux 头尾指令
head [options] 文件名
tail [options] 文件名

options常用参数:

-n :指定显示的行数

示例:head -n 10 xxx.txt 显示文件的前10行

9. 退出容器

exitquit

10. 查看容器日志

docker  logs  [options] <container_name / id>

options常用参数:

-f, --follow: 实时跟踪容器日志输出,类似于tail -f命令。使用该参数可以持续查看最新的日志输出。

--tail <行数>: 仅显示最后几行的日志信息,默认为all。通过指定行数可以限制输出的日志量。

示例:docker logs --tail 100 <容器名称或ID>

--since <时间戳>: 仅显示指定时间之后的日志信息。时间戳可以使用绝对时间(格式为yyyy-MM-ddTHH:mm:ss)或相对时间(例如10m,表示10分钟以前)。

示例:docker logs --since 2022-01-01T00:00:00 <容器名称或ID>

--until <时间戳>: 仅显示指定时间之前的日志信息。同样可以使用绝对时间或相对时间指定。 示例:docker logs --until 2022-02-01T00:00:00 <容器名称或ID>

--timestamps: 在日志输出中显示时间戳。

示例:docker logs --timestamps <容器名称或ID>

--details: 显示完整的日志输出,包括容器的标准输出和标准错误输出。

示例:docker logs --details <容器名称或ID> 默认缺省是–details

--follow --tail <行数>的组合使用:实时跟踪容器日志并限制输出行数。

示例:docker logs -f --tail 100 <容器名称或ID>

例如10m,表示10分钟以前)。

示例:docker logs --since 2022-01-01T00:00:00 <容器名称或ID>

--until <时间戳>: 仅显示指定时间之前的日志信息。同样可以使用绝对时间或相对时间指定。 示例:docker logs --until 2022-02-01T00:00:00 <容器名称或ID>

--timestamps: 在日志输出中显示时间戳。

示例:docker logs --timestamps <容器名称或ID>

--details: 显示完整的日志输出,包括容器的标准输出和标准错误输出。

示例:docker logs --details <容器名称或ID> 默认缺省是–details

--follow --tail <行数>的组合使用:实时跟踪容器日志并限制输出行数。

示例:docker logs -f --tail 100 <容器名称或ID>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker 是一款开源的容器化平台,可以轻松地创建、部署和管理应用程序的容器。下面是 Docker 常用命令手册的概述: 1. docker version:显示 Docker 版本信息。 2. docker info:显示 Docker 系统信息,包括容器、镜像和存储驱动等。 3. docker images:列出本地所有镜像。 4. docker pull [IMAGE_NAME[:TAG]]:从 Docker 仓库拉取镜像,默认为最新版本。 5. docker search [KEYWORD]:在 Docker 仓库中搜索关键字相关的镜像。 6. docker run [OPTIONS] [IMAGE_NAME[:TAG]] [COMMAND]:创建并运行一个新容器。 7. docker start [CONTAINER_NAME/CONTAINER_ID]:启动一个已存在的容器。 8. docker stop [CONTAINER_NAME/CONTAINER_ID]:停止一个正在运行的容器。 9. docker restart [CONTAINER_NAME/CONTAINER_ID]:重启一个容器。 10. docker rm [CONTAINER_NAME/CONTAINER_ID]:删除一个已停止的容器。 11. docker rmi [IMAGE_NAME/IMAGE_ID]:删除一个本地镜像。 12. docker ps [OPTIONS]:列出正在运行的容器。 13. docker logs [CONTAINER_NAME/CONTAINER_ID]:查看一个容器的日志。 14. docker exec [OPTIONS] [CONTAINER_NAME/CONTAINER_ID] [COMMAND]:在运行中的容器中执行命令。 15. docker commit [CONTAINER_NAME/CONTAINER_ID] [REPOSITORY[:TAG]]:将容器变为一个新的镜像。 这些是 Docker常用的基本命令。还有许多其他命令可以用来管理、监控和调试 Docker 容器和镜像。根据实际需求,可以进一步了解和使用这些命令来提高工作效率和便捷性。 ### 回答2: Docker是一种轻量级的容器化技术,可以快速构建、部署和管理应用程序。下面是一些常用Docker命令: 1. docker run:运行一个容器。可以指定镜像名称、端口映射、卷挂载等参数创建一个容器的实例。例如:docker run -p 8080:80 nginx。 2. docker ps:列出当前正在运行的容器。可以使用docker ps -a命令来查看所有的容器,包括已停止的。 3. docker images:列出本地的镜像。可以使用docker images -a命令来查看所有的镜像,包括中间层。 4. docker pull:从远程仓库中拉取一个镜像到本地。例如:docker pull ubuntu。 5. docker stop:停止一个正在运行的容器。可以使用容器ID或者容器名称来指定停止的容器。 6. docker rm:删除一个已经停止的容器。可以使用容器ID或者容器名称来指定要删除的容器。 7. docker rmi:删除一个本地的镜像。可以使用镜像ID或者镜像名称来指定要删除的镜像。 8. docker exec:在一个正在运行的容器中执行命令。例如:docker exec -it <容器ID> /bin/bash。 9. docker build:利用Dockerfile来构建一个镜像。例如:docker build -t myimage:1.0 . 10. docker push:将一个本地的镜像推送到远程仓库。例如:docker push myimage:1.0。 这只是一些常用Docker命令,还有很多其他有用的命令和参数可以用来创建、管理和监控容器。熟练掌握这些命令可以更好地使用Docker进行应用程序的开发和部署。 ### 回答3: Docker是一个开源的容器化平台,可以将应用程序和其依赖项打包成一个轻量级、可移植的容器,方便在不同的环境中进行部署和运行。以下是Docker常用命令的简要手册: 1. docker run:创建并启动一个新的容器。可以指定容器的名称、镜像和其他选项,如端口映射、数据卷等。 2. docker stop:停止一个运行中的容器。可以指定容器名称或容器ID来停止指定的容器。 3. docker rm:删除一个已经停止的容器。可以指定容器名称或容器ID来删除指定的容器。 4. docker ps:列出当前运行中的容器。使用选项 -a 可以列出所有的容器,包括已停止的。 5. docker images:列出本地的镜像。使用选项 -a 可以列出全部的镜像,包括中间层镜像。 6. docker pull:从Docker仓库中下载一个镜像。 7. docker push:将一个本地的镜像推送到Docker仓库。 8. docker build:使用Dockerfile构建一个镜像。 9. docker exec:在运行中的容器中执行命令。 10. docker logs:查看容器的日志输出。 11. docker network:管理Docker的网络资源。 12. docker volume:管理Docker的数据卷。 13. docker-compose:通过一个YAML文件定义和管理多个容器的组合(服务)。 这只是Docker常用命令的简要手册,Docker拥有更多的功能和命令,可以根据具体需求进行深入学习和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值