带你走进Docker基本管理的初篇


前言

只有光头才能变强。

想要自强必先什么?当然是学习了!!

估计大家也可能听过Docker这项技术(在论坛上、招聘技能上、交流群上等等),要是不了解Docker,都不好意思在网上冲浪的时候吹牛逼了。

所以这几天学了一下Docker,总结了Docker入门的相关知识,分享给大家(好让我们一起吹牛逼)。

一:什么是Docker?

Docker是Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

mark

二、Docker的概念

Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。

2.1:Docker的核心概念

  • 镜像
一个面向Docker容器引擎 的只读模板
  • 容器
从镜像创建的运行示例
  • 仓库

  • 【公有】:Docker官网提供

  • 【私有】:自己搭建的

集中保存镜像的地方

2.2:Centos安装Docker的两种方式

  • 使用CURL获得的Docker的安装脚本啊进行安装

  • 使用YUM仓库来安装Docker

2.1:集装箱化的优点:

  • 灵活:即使是复杂的应用程序也可封装。
  • 轻量级:容器利用并共享主机内核。
  • 便携式:您可以在本地构建,部署到云上并在任何地方运行。
  • 可扩展性:您可以增加和自动分发容器副本。
  • 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。

2.:3:images和容器

通过运行images启动容器,一个images是一个可执行的包,其中包括运行应用程序所需要的所有内容-代码,运行时,库、环境变量和配置文件。
容器时images运行时示例-当被执行时(即,images状态,或者用户进程)在内存中,可以使用命令查看正在运行容器的列表docker
ps,就像在Linux中一样。

三:虚拟机

虚拟机(virtual
machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真丝系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其它部分毫无影响。

3.1:虚拟机的缺点:

  • 资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1M,虚拟机依然需要几百MB的内容才能运行。
  • 冗余步骤多:虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
  • 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用陈故乡才能真正运行。

四:Linux容器

由于虚拟机存在这个缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机又很多优势。

  • 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
  • 资源占用少:容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所以资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
  • 体积小:容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

五:容器和虚拟机对比

一个容器中运行原生Linux和共享主机与其它容器的内核,它运行一个独立的进程,不占用任何其它可执行文件的内存,使其轻量化。

相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序虚拟访问主机资源。一般来说,虚拟机提供的环境比大多数应用程序需要的资源多。

mark

mark

六:Docker安装与优化

1.安装环境
#yum utils提供yum-config-manager
#device mapper存储驱动需要device-manager-persistent-data和lvm2
#device Mapper是Linux2.6内核中支持逻辑卷管理的通用设备映射机制
它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。

[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

2.设置阿里云镜像源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#查看一下yum仓库
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo
CentOS-CR.repo         CentOS-Media.repo      docker-ce.repo
CentOS-Debuginfo.repo  CentOS-Sources.repo

3.设置防火墙规则
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -t nat -F

4.安装Docker-CE
[root@localhost ~]# yum -y install docker-ce

5.启动服务设置开机自启
[root@localhost ~]# systemctl start docker.service 
[root@localhost ~]# systemctl enable docker.service 

已经安装完成但是你用的时候特别不舒服,下载镜像等特别慢,我们需要用到阿里云的镜像加速来实现下载提速

6.1:镜像加速

1.打开阿里云官网----》搜索"镜像加速"

mark

mark

  • 镜像加速
[root@localhost ~]# cd /etc/docker/     '//切换到加速目录'
[root@localhost docker]# ls
key.json

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rsezwjwx.mirror.aliyuncs.com"]
}
EOF
#使系统重新加载
[root@localhost docker]# systemctl daemon-reload

#重启docker服务
[root@localhost docker]# systemctl restart docker.service 

6.2:网络优化

#开启路由转发
[root@localhost docker]# vim /etc/sysctl.conf 
'//编写'
net.ipv4.ip_forward=1

#使命令生效
[root@localhost docker]# sysctl -p
[root@localhost docker]# service network restart 
Restarting network (via systemctl):                        [  确定  ]
[root@localhost docker]# systemctl restart docker.service 

七:Docker基本操作

7.1:Docker镜像常用命令

docker version  #查看docker版本
docker search   #搜索镜像
docker images   #查看镜像列表
docker history  #查看镜像制作历史
docker inspect  #查看镜像底层信息
docker pull     #下载镜像
docker push     #上传镜像
docker rmi      #删除本地镜像
docker save     #镜像另存为tar包
docker load     #使用tar包导入镜像
docker tag      #添加新镜像名称和标签
1.查看docker版本
[root@localhost docker]# docker version
2.搜索镜像:docker search 镜像名称
docker search 关键字

示例

#搜索nginx镜像(工业仓库)
[root@localhost docker]# docker search nginx
3.获取镜像
docker pull 仓库名称:[:标签]
  • 【stars-星级 代表镜像的使用率】
#下载nginx镜像
[root@localhost docker]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
d121f8d1c412: Pull complete 
ebd81fc8c071: Pull complete 
655316c160af: Pull complete 
d15953c0e0f8: Pull complete 
2ee525c5c3cc: Pull complete 
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest


#下载内核
[root@localhost docker]# docker pull busybox



#查看镜像列表
[root@localhost docker]# docker images       '//两个镜像已经被I下载好了 '
名称                标签                 ID等于身份证号       创建时间             文件大小
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
busybox             latest              6858809bf669        11 days ago         1.23MB

//9days ago:表示该镜像是官网9天前更新的
镜像是面向docker引擎提供的模板,想要它提供服务要把它装在容器里运行起来所以要启动

下载后存放在/var/lib/docker
[root@localhost docker]# cd /var/lib/docker/image/overlay2/
[root@localhost overlay2]# ls
distribution  imagedb  layerdb  repositories.json      //在repositories.json是秘文 
4.查看镜像详细信息
docker images 仓库名称[:标签]
docker inspect 镜像ID号

示例

[root@localhost overlay2]# docker inspect nginx:latest 
....省略信息.....
5.添加新镜像标签
docker tag 名称[:标签] 新名称[:新标签]

示例

'//基于lastest为副本 复制了一个信息  并不是修改是增加了一个镜像标签  相当于重命名'
[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
nginx               web                 7e4d58f0e5f3        9 days ago          133MB
busybox             latest              6858809bf669        11 days ago         1.23MB

'//查看标签'
[root@localhost overlay2]# docker images | grep nginx
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
nginx               web                 7e4d58f0e5f3        9 days ago          133MB
6.删除镜像
docker rmi 仓库名称[:标签]

docker rmi 镜像ID号

示例:

#删除容器不用加i   删除镜像要加i
[root@localhost overlay2]# docker rmi nginx:web
Untagged: nginx:web
#已经删除
[root@localhost overlay2]# docker images | grep nginx
nginx               latest              7e4d58f0e5f3        9 days ago          133MB

#在添加便签
[root@localhost overlay2]# docker tag nginx:latest nginx:web
#查看
[root@localhost overlay2]# docker images | grep nginx
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
nginx               web                 7e4d58f0e5f3        9 days ago          133MB

#删除ID呢?
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (must be forced) - image is referenced in multiple repositories

#我们单独把nginx:web镜像删除
[root@localhost overlay2]# docker rmi nginx:web
Untagged: nginx:web
#再去删除ID就可以删除了   说明了什么??  
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3
Untagged: nginx:latest
Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720

多个别名的镜像不支持删除ID删除;如果有别名的镜像,要先把别名的镜像删除才能用ID删除

[root@localhost overlay2]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              6858809bf669        11 days ago         1.23MB


7.存出镜像
docker save -o 存出文件名 存出的镜像

示例:

#导出到家目录命名为shuai
[root@localhost ~]# docker save -o shuai nginx:latest
#查看 可以发现shuai已经存在了
[root@localhost ~]# ll -h
总用量 131M
-rw-------. 1 root root 2.1K 6  17 23:17 anaconda-ks.cfg
-rw-r--r--. 1 root root 2.1K 6  17 23:17 initial-setup-ks.cfg
-rw-------. 1 root root 131M 9  20 10:57 shuai

#我们直接删除nginx:latest
[root@localhost ~]# docker rmi nginx:latest
Untagged: nginx:latest
#查看一下    已经删除
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              6858809bf669        11 days ago         1.2
8.载入镜像
docker load --input 存出文件名
或docker load < 存出文件名

示例:

[root@localhost ~]# docker load < shuai 
07cab4339852: Loading layer  72.49MB/72.49MB
f431d0917d41: Loading layer  64.31MB/64.31MB
60c688e8765e: Loading layer  3.072kB/3.072kB
eabfa4cd2d12: Loading layer  4.096kB/4.096kB
908cf8238301: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest

#再次查看镜像列表    已经恢复
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
busybox             latest              6858809bf669        11 days ago         1.2
9.上传镜像
docker push 仓库名称[:标签]

示例:

#上传镜像
"改标签"
docker tag nginx:latest abner/nginx:web		"用户名abner/仓库名:镜像名
"登陆"
docker logion
Username: docker
password
Email: xxx@xxx.com
"上传"
docker push abner/nginx:web

八:容器的操作

docker create -it     #创建容器;-i让容器的标准输入打开,-t让docker分配一个伪终端

docker run            #运行容器

docker ps             #查看容器列表

docker stop           #关闭容器

docker start id       #启动容器

docker restart        #重启容器

docker attach|exec    #进入容器

docker inpect         #查看容器底层信息#

docker top            #查看容器进程列表

docker export id > nginx-am #保存容器到本地#

cat nginx-am|docker import - nginx:web "从本地导入容器
     容器" "容器要先关闭,才能删除
1.查看容器运行状态
docker ps 【选项】

-a 列出所有的容器,包括未运行的容器
  • 里面是空的
[root@localhost ~]# docker ps -a
容器ID              来源镜像            执行指令
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2.容器创建
docker create【选项】镜像运行的程序

-i:让容器的标准输入保持打开
-t:让Docker分配一个伪终端

示例

[root@localhost ~]# docker create -it nginx:latest /bin/bash
c189193d23c440dc0f3ffaeba5d9eb4264df27efd62be1df1d2a232d6a308ee3

#查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   About a minute ago   Created                                 infallible_ishizaka
'//状态为Created'

#启动容器
[root@localhost ~]# docker start c189193d23c4 
c189193d23c4
#查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   4 minutes ago       Up About a minute   80/tcp              infallible_ishizaka
'//状态为UP  对内端口号为80'

[root@localhost ~]# ifconfig      '//会生成一个新的网卡 充当着容器的网关   容器互联都依赖于docker0'
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:91ff:fe2a:3c5c  prefixlen 64  scopeid 0x20<link>
        ether 02:42:91:2a:3c:5c  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1768 (1.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
3.启动执行命令查看系统跟目录
  • 方法一
[root@localhost ~]# docker pull centos:7 
[root@localhost ~]# docker create -it centos:7 /bin/bash
#查看容器列表
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
869e0c852bb8        centos:7            "/bin/bash"              40 seconds ago      Created                                 gallant_shtern
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   16 minutes ago      Up 12 minutes       80/tcp              infallible_ishizaka
#启动容器
[root@localhost ~]# docker start 869e0c852bb8
869e0c852bb8

#关闭容器
[root@localhost ~]# docker stop 869e0c852bb8

#执行完成直接关闭 状态是Exited
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
869e0c852bb8        centos:7            "/bin/bash"              4 minutes ago       Exited (137) About a minute ago                       gallant_shtern
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   20 minutes ago      Up 17 minutes                     80/tcp              infallible_ishizaka

#删除容器   rm后面加id
[root@localhost ~]# docker rm 869e0c852bb8
869e0c852bb8

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   23 minutes ago      Up 20 minutes       80/tcp              infallible_ishizaka
  • 方法二
[root@localhost ~]# docker run centos:7 /bin/bash -c ls /      -c:执行命令

'//持续在后台执行'
[root@localhost ~]# docker run /centos7 /user/bin/bash -c "while true;do echo hello;done"

'//终止运行'
[root@localhost ~]# docker stop 
a3db11ea9c0d
4.进入容器
docker exec [选项]容器的ID/名称 /bin/bash

示例:

#启动容器
[root@localhost ~]# docker start 835fe0ae1a70

#进入容器   前提是UP状态!!
[root@localhost ~]# docker exec -it 835fe0ae1a70 /bin/bash
[root@835fe0ae1a70 /]# 

#离开容器
[root@835fe0ae1a70 /]# exit 
exit
5.容器导出
docker export 容器的ID/名称 > 文件名

示例

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
835fe0ae1a70        centos:7            "/bin/bash"              11 minutes ago      Up 10 minutes                           heuristic_davinci
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   59 minutes ago      Up 55 minutes       80/tcp              infallible_ishizaka


#把nginx容器导入到opt命名为mei
[root@localhost ~]# docker export c189193d23c4 > /opt/mei
[root@localhost ~]# ll -h /opt
-rw-r--r--. 1 root root 129M 9  20 12:18 mei    //导出成功
6.导入容器
cat 文件名| docker import -生成的镜像名称:标签

示例:

#会生成镜像,而不会创建容器
cat nginx-am|docker import - nginx:web
7.删除容器
docker rm [选项]容器的ID/名称

示例

[root@localhost ~]# docker stop 835fe0ae1a70     #不是不是运行状态才能删除
835fe0ae1a70
[root@localhost ~]# docker rm 835fe0ae1a70
835fe0ae1a70

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   About an hour ago   Up About an hour    80/tcp              infallible_ishizaka
8.批量删除
docker ps -a | awk '{print "docker rm "$1}'|bash
  • 基于镜像容器在,就删不掉镜像,除非把容器删掉,才能删除镜像
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
busybox             latest              6858809bf669        11 days ago         1.23MB
centos              7                   7e6257c9f8d8        5 weeks ago         203MB

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c189193d23c4        nginx:latest        "/docker-entrypoint.…"   About an hour ago   Up About an hour    80/tcp              infallible_ishizaka

[root@localhost ~]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (cannot be forced) - image is being used by running container c189193d23c4

#现在我们把容器删掉
[root@localhost ~]# docker rm c189193d23c4

#在删除
[root@localhost ~]# docker rmi 7e4d58f0e5f3

#查看镜像列表
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              6858809bf669        11 days ago         1.23MB
centos              7                   7e6257c9f8d8        5 weeks ago         203MB
9.创建交互式容器
#创建交互式容器
docker container run -it id		 "i表示交互式  t表示开启新的终端"
#创建守护式容器
docker run -d --name="nginx" nginx:1.14		"-d  表示守护式   如果没有这个镜像会自动Pull 拉取命令

#交互式的容器用于: 工具类: 开发,测试,临时性的任务()
#守护式容器用于: 服务器上 网络服务
#把容器的80端口映射到外部的8080端口提供外部访问
docker container run -d -p 8080:80 --name="nginx" nginx:1.14
docker container run -d -p 10.0.0.100:8081:80 --name='n3' nginx:1.14 "映射到外部801"
#演示
[root@localhost ~]# docker container run -d -p 8080:80  nginx:latest

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f6af8b72b306        nginx:latest        "/docker-entrypoint.…"   31 seconds ago      Up 30 seconds       0.0.0.0:8080->80/tcp   crazy_rosalind

mark
感谢观看,欢迎评论

引用\[1\]:Docker镜像命令思维导图是一篇文章,主要用来记录Docker命令的思维导图,方便回顾和复习使用。文章中提供了多个思维导图源文件,包括docker服务、docker整体、docker镜像、docker容器和补充的redis-cli命令。这些思维导图可以帮助用户回顾和学习Docker命令的使用。\[1\] 引用\[2\]:Docker使用思维导图及各种命令是一篇文章,介绍了Docker的架构和常用命令。文章中提供了Docker的架构图和常用命令的思维导图,包括搜索命令、下载镜像、列出镜像、删除本地镜像、保存镜像、加载镜像、构建镜像以及容器相关的命令。这些思维导图可以帮助用户更好地理解和使用Docker。\[2\] 根据提供的引用内容,可以看出这些思维导图主要是为了帮助用户回顾和学习Docker基本管理命令。这些思维导图提供了Docker的架构图、常用命令的概览以及具体命令的使用示例。用户可以根据自己的需求选择相应的思维导图来学习和使用Docker。 #### 引用[.reference_title] - *1* [Docker命令大全(思维导图)](https://blog.csdn.net/bzu_mei/article/details/127627898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Docker及其使用思维导图](https://blog.csdn.net/hliq5399/article/details/106021348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值