虚拟化实现之 docker(二)

本文详细介绍了Docker虚拟化技术,包括其与KVM的区别、核心组件如namespace和cgroup的作用,以及Docker的安装、镜像管理、容器操作、网络配置、数据卷管理和私有仓库设置等实战内容。通过学习,读者将掌握Docker的基础知识和实际操作技巧。
摘要由CSDN通过智能技术生成

官网:https://docs.docker.com/v18.03/
在这里插入图片描述
Linux容器是与系统其他部分隔离开的一系列进程,从另一个系统镜像rootfs运行,并由该镜像提供支持进程所需的全部文件。
容器镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

1:chroot,ldd
2:lxc namespace(6大命名空间)和cgroup
3:docker和kvm区别,docker镜像基础操作,docker容器日常操作,commit制作镜像,dockfile来自动构建镜像
在这里插入图片描述
cgroup 和 namespace 是最重要的两种技术。cgroup 实现资源限额, namespace 实现资源隔离。

cgroup
cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。相信你已经猜到了:前面我们看到的–cpu-shares、-m、–device-write-bps 实际上就是在配置 cgroup。
/sys/fs/cgroup
namespace
在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使 host 上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。
Linux 实现这种方式的技术是 namespace。namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。
Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User
1:docker的安装

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y

2: docker的主要组成部分
docker是传统的CS架构分为docker client和docker server,向mysql一样
命令:docker version

[root@controller ~]# docker version 
Client:
 Version:	17.12.0-ce
 API version:	1.35
 Go version:	go1.9.2
 Git commit:	c97c6d6
 Built:	Wed Dec 27 20:10:14 2017
 OS/Arch:	linux/amd64

Server:
 Engine:
  Version:	17.12.0-ce
  API version:	1.35 (minimum version 1.12)
  Go version:	go1.9.2
  Git commit:	c97c6d6
  Built:	Wed Dec 27 20:12:46 2017
  OS/Arch:	linux/amd64
  Experimental:	false

###设置docker远程执行

systemd详解:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

####在linux-node1:
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.0.0.11:2375
systemctl daemon-reload
systemctl restart docker.service
ps -ef检查
####在linux-node2:
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y

docker -H 10.0.0.11 info

docker主要组件有:镜像、容器、仓库
3:启动第一个容器
docker run -d -p 80:80 nginx

4:docker的镜像管理
搜索镜像
docker search
获取镜像
docker pull
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com

##配置docker镜像加速
vi /etc/docker/daemon.json
{
“registry-mirrors”: [“https://registry.docker-cn.com”]
}

##第三方docker镜像仓库,使用方法:
docker pull index.tenxcloud.com/tenxcloud/httpd:latest

查看镜像
docker images
删除镜像
docker rmi 例子:docker image rm centos:latest
导出镜像
docker save 例子:docker image save centos > docker-centos7.4.tar.gz
导入镜像
docker load 例子:docker image load -i docker-centos7.4.tar.gz

5:docker的容器管理
docker run -d -p 80:80 nginx

启动容器
docker run image_name
docker run -it image_name CMD

停止容器
docker stop CONTAINER_ID
杀死容器
docker kill container_name
查看容器
docker ps
docker ps -a
进入容器
*** docker exec
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
docker attach
docker attach [OPTIONS] CONTAINER
nsenter(安装yum install -y util-linux)

删除容器
docker rm

总结:docker容器内的第一个进程必须一直处于前台运行的状态,否则这个容器,就会处于退出状态!

6:docker容器的网络访问

指定映射
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort
-p hostPort:containerPort:udp
-p 81:80 –p 443:443
随机映射
docker run -P

7:docker的数据卷管理
文件存储详解 https://www.cnblogs.com/CloudMan6/p/7127843.html
数据卷(文件或目录)
-v /data
-v src:dst
数据卷容器
–volumes-from

8:手动将容器保存为镜像
退出时,使用[ctrl + D],这样会结束docker当前线程,容器结束,可以使用[ctrl + P][ctrl + Q]退出而不终止容器运行
如下命令,会在指定容器中执行指定命令,[ctrl+D]退出后不会终止容器运行
docker commit

9:dockerfile自动构建docker镜像
dockerfile主要组成部分:
基础镜像信息 FROM:centos:6.8
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(COPY文件,会自动解压)
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)

dockerfile其他指令:
COPY 复制文件
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令

参考其他的dockerfile
官方dockerfile或者时速云镜像广场

10:docker镜像的分层

11:.容器间的互联
docker run -d -p 80:80 nginx
docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash
ping web01

使用docker运行zabbix-server

docker run --name mysql-server -t \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -d mysql:5.7 \
      --character-set-server=utf8 --collation-server=utf8_bin

docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest

docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest

docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

12:docker registry

##普通的registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

docker push index.tenxcloud.com/google_containers/busybox

##带basic认证的registry
mkdir /opt/registry-var/auth/ -p
htpasswd  -Bbn oldboy 123456  >> /opt/registry-var/auth/htpasswd
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

13:docker-compose(单机版的容器编排工具)

yum install -y python2-pip
pip install docker-compose
##pip 加速

##详细指令
http://www.jianshu.com/p/2217cfed29d7
cd my_wordpress/
vi docker-compose.yml
version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

#启动
docker-compose up
#后台启动
docker-compose up -d

14:重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always

方法二:“live-restore”: true
docker server配置文件/etc/docker/daemon.json参考
{
“registry-mirrors”: [“http://b7a9017d.m.daocloud.io”],
“graph”: “/opt/mydocker”,
“insecure-registries”:[“10.0.0.11:5000”],
“live-restore”: true
}

15:Docker Machine安装docker

16:docker私有仓库registry
1)启动registry容器
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry

2)修改/etc/docker/daemon.json配置文件
{
“registry-mirrors”: [“https://registry.docker-cn.com”],
“insecure-registries”: [“10.0.0.11:5000”]
}

3)重启docker服务
systemctl restart docker

4)为镜像打标签
docker tag centos:6.8 10.0.0.11:5000/oldboy/centos:6.8

5)push推送镜像
docker push 10.0.0.11:5000/oldboy/centos:6.8
17.docker企业级镜像仓库harbor
第一步:安装docker和docker-compose

第二步:下载harbor-offline-installer-v1.3.0.tgz

第三步:上传到/opt,并解压

第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11
harbor_admin_password = 123456

第五步:执行install.sh

17.docker版本升级
1、停止docker服务并备份文件
service docker stop
mv /usr/bin/docker /usr/bin/docker_bak
2. 彻底卸载docker
查询安装过的包
yum list installed | grep docker
分别删除安装的软件包
yum -y remove ***
#yum remove docker-1.13.1-53.git774336d.el7.centos.x86_64
yum remove docker-client-1.13.1-53.git774336d.el7.centos.x86_64
yum remove docker-common-1.13.1-53.git774336d.el7.centos.x86_64
删除容器和镜像等
rm -rf /var/lib/docker ###可以保留镜像mv /usr/bin/docker /usr/bin/docker_bak
3安装docker
方法一:
yum安装
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

#添加Docker软件包源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#关闭测试版本list(只显示稳定版)
sudo yum-config-manager --enable docker-ce-edge
sudo yum-config-manager --enable docker-ce-test

#更新yum包索引
yum makecache fast
指定版本安装
yum list docker-ce --showduplicates|sort -r
yum install docker-ce-18.03.1.ce -y
方法二:
下载地址
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
[root@bwyf2 tools]# yum -y install docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
4.启动docker
systemctl start docker.service
5 docker info 报错
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决办法:
vi /etc/sysctl.conf
添加以下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
最后再执行
sysctl -p

扩展:k8s的安装方法
kubernetes 二进制安装
kubeadm 安装
minikube 安装
yum 安装
go编译安装

18.监控
1.sysdig 是一个轻量级的系统监控工具,同时它还原生支持容器。通过 sysdig 我们可以近距离观察 linux 操作系统和容器的行为。
Linux 上有很多常用的监控工具,比如 strace,tcpdump,htop, iftop,lsof …
而 sysdig 则是将这些工具的功能集成到一个工具中,并且提供一个友好统一的操作界面。

2 Prometheus 是一个非常优秀的监控工具。准确的说,应该是监控方案。Prometheus 提供了监控数据搜集、存储、处理、可视化和告警一套完整的解决方案。
详解:https://www.cnblogs.com/CloudMan6/p/7692765.html
Prometheus Server
Prometheus Server 负责从 Exporter 拉取和存储监控数据,并提供一套灵活的查询语言(PromQL)供用户使用。
Exporter
Exporter 负责收集目标对象(host, container…)的性能数据,并通过 HTTP 接口供 Prometheus Server 获取。
可视化组件
监控数据的可视化展现对于监控方案至关重要。以前 Prometheus 自己开发了一套工具,不过后来废弃了,因为开源社区出现了更为优秀的产品 Grafana。Grafana 能够与 Prometheus 无缝集成,提供完美的数据展示能力。
Alertmanager
用户可以定义基于监控数据的告警规则,规则会触发告警。一旦 Alermanager 收到告警,会通过预定义的方式发出告警通知。支持的方式包括 Email、PagerDuty、Webhook

19日志管理方案
详解:https://www.cnblogs.com/CloudMan6/p/7770916.html
Docker 会将容器日志记录到 /var/lib/docker/containers//-json.log,那么只要我们能够将此文件发送给 ELK 就可以实现日志管理。
要实现这一步其实不难,因为 ELK 提供了一个配套小工具 Filebeat,它能将指定路径下的日志文件转发给 ELK。同时 Filebeat 很聪明,它会监控日志文件,当日志更新时,Filebeat 会将新的内容发送给 ELK。

20.Docker Swarm 管理的是 Docker Host 集群
详解:https://www.cnblogs.com/CloudMan6/p/7845365.html

21.企业应用
一.制作一个只支持sshd服务的镜像
1):启动一个容器,并修改
docker run -it -p 1022:22 centos:6.8 /bin/bash
yum install openssh-server -y
echo ‘root:123456’|chpasswd
/etc/init.d/sshd start
测试:ssh远程登录

2):将修改后的容器,保存为镜像
docker commit friendly_swartz centos6-ssh

3)测试新镜像,sshd是否可用
docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
ssh root@10.0.0.11 -p 1122
二.制作了一个支持sshd和httpd双服务的镜像
1):启动一个容器,并修改
docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
yum install httpd -y
/etc/init.d/httpd start

vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
2):将修改后的容器,保存为镜像
docker commit 11bf5984784a centos6-httpd

3)测试新镜像,检测sshd和httpd是否可用
docker run -d -p 1222:22 -p 80:80 centos6-httpd:latest /init.sh

使用Dockerfile完成kodexplorer网盘项目

三 . 制作jenkins镜像
Jenkins启动

docker run -t -p 9090:8080 -p 8083:8083 -p 50000:50000 --name jenkins --restart always -v /home/jenkins:/var/jenkins_home -v /home/maven/:/home/maven/ -v /usr/java/jdk1.7.0_80:/usr/java/jdk1.7.0_80 -v /etc/localtime:/etc/localtime -u 0 jenkins:1

[root@bwyf2 ~]# docker logs 3c8487ac3748   构建日志
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
Oct 31, 2018 8:02:07 PM Main deleteWinstoneTempContents
WARNING: Failed to delete the temporary Winstone file /tmp/winstone/jenkins.war
Oct 31, 2018 8:02:07 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Logging initialized @438ms
Oct 31, 2018 8:02:07 PM winstone.Logger logInternal
INFO: Beginning extraction from war file
Oct 31, 2018 8:02:09 PM org.eclipse.jetty.util.log.JavaUtilLog warn
WARNING: Empty contextPath
Oct 31, 2018 8:02:09 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: jetty-9.2.z-SNAPSHOT
Oct 31, 2018 8:02:10 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
Oct 31, 2018 8:02:10 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Started w.@47404bea{/,file:/var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
Oct 31, 2018 8:02:10 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Started ServerConnector@d966409{HTTP/1.1}{0.0.0.0:8080}
Oct 31, 2018 8:02:10 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Started @3500ms
Oct 31, 2018 8:02:10 PM winstone.Logger logInternal
INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled
Oct 31, 2018 8:02:11 PM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Oct 31, 2018 8:02:11 PM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Oct 31, 2018 8:02:12 PM jenkins.InitReactorRunner$1 onAttained
INFO: Prepared all plugins
Oct 31, 2018 8:02:12 PM jenkins.InitReactorRunner$1 onAttained
INFO: Started all plugins
Oct 31, 2018 8:02:12 PM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Oct 31, 2018 8:02:13 PM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Oct 31, 2018 8:02:13 PM hudson.model.AsyncPeriodicWork$1 run
INFO: Started Download metadata
Oct 31, 2018 8:02:14 PM jenkins.util.groovy.GroovyHookScript execute
INFO: Executing /var/jenkins_home/init.groovy.d/tcp-slave-agent-port.groovy
Oct 31, 2018 8:02:14 PM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Oct 31, 2018 8:02:14 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@71aff985: display name [Root WebApplicationContext]; startup date [Wed Oct 31 20:02:14 CST 2018]; root of context hierarchy
Oct 31, 2018 8:02:14 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
INFO: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@71aff985]: org.springframework.beans.factory.support.DefaultListableBeanFactory@7caa4533
Oct 31, 2018 8:02:14 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7caa4533: defining beans [authenticationManager]; root of factory hierarchy
Oct 31, 2018 8:02:15 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@5d1a9ff8: display name [Root WebApplicationContext]; startup date [Wed Oct 31 20:02:15 CST 2018]; root of context hierarchy
Oct 31, 2018 8:02:15 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
INFO: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@5d1a9ff8]: org.springframework.beans.factory.support.DefaultListableBeanFactory@4b84491a
Oct 31, 2018 8:02:15 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4b84491a: defining beans [filter,legacy]; root of factory hierarchy
Oct 31, 2018 8:02:15 PM jenkins.install.SetupWizard init
INFO: 

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

28d36cce4a65417380314d1a34aa565e

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

Oct 31, 2018 8:02:21 PM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Oct 31, 2018 8:02:22 PM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Oct 31, 2018 8:02:22 PM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running
Oct 31, 2018 8:02:22 PM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
--> setting agent port for jnlp
--> setting agent port for jnlp... done
Oct 31, 2018 8:02:25 PM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tools.JDKInstaller
Oct 31, 2018 8:02:25 PM hudson.model.AsyncPeriodicWork$1 run
INFO: Finished Download metadata. 11,323 ms

  docker cp 3c8487ac3748:/var/jenkins_home/secrets/initialAdminPassword ./

四.实例nginx镜像
配置目录:
/home/kaifa/nginx-docker-demo/conf
站点目录:
/home/kaifa/nginx-docker-demo/html
启动路径
/home/kaifa/nginx-docker-demo
启动命令
docker run -d -p 192.168.70.239:80:80 -p 443:443 --net=yu --ip=192.168.70.111 --restart=always --volume “ P W D / h t m l " : / u s r / s h a r e / n g i n x / h t m l − − v o l u m e " PWD/html":/usr/share/nginx/html --volume " PWD/html":/usr/share/nginx/htmlvolume"PWD/conf”:/etc/nginx/conf -v /etc/localtime:/etc/localtime nginx
实时查看docker容器日志
$ sudo docker logs -f -t --tail 行数 容器名

docker run -d --privileged -p 6379:6379 redis:latest
docker run -d --privileged -p 5672:5672 -p 15672:15672 docker.io/rabbitmq:management

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值