Docker 基础

目录


Docker安装

Centos7上安装Docker

# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce -y
# systemctl start docker

测试安装是否成功

# docker run hello-world

执行上条命令后显示如下,表示安装成功

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/

Docker离线安装

步骤1 准备一台能够上外网,且最小化安装的centos7服务器。
步骤2 配置Docker yum源配置文件。
步骤3 使用downloadonly和downloaddir选项只下载Docker及其依赖包到本地目录。

# yum install --downloadonly --downloaddir=/docker_rpm docker-ce createrepo -y
# ls /docker_rpm
audit-libs-python-2.8.1-3.el7.x86_64.rpm      libsemanage-python-2.5-11.el7.x86_64.rpm
checkpolicy-2.5-6.el7.x86_64.rpm              libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm
container-selinux-2.55-1.el7.noarch.rpm       pigz-2.3.3-1.el7.centos.x86_64.rpm
createrepo-0.9.9-28.el7.noarch.rpm            policycoreutils-python-2.5-22.el7.x86_64.rpm
deltarpm-3.6-3.el7.x86_64.rpm                 python-deltarpm-3.6-3.el7.x86_64.rpm
docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm  python-IPy-0.75-6.el7.noarch.rpm
libcgroup-0.41-15.el7.x86_64.rpm              setools-libs-3.3.8-2.el7.x86_64.rpm
libseccomp-2.3.1-3.el7.x86_64.rpm

步骤4 将docker的rpm包拷贝到需要安装docker的内网服务器上,如 /docker_loacl_yum/目录下
步骤5 移动并备份/etc/yum.repos.d/目录下的配置文件,再创建docker.repo。

# vi /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=file:///docker_local_yum
enable=1
gpgcheck=0

步骤6 安装createrepo,然后创建软件仓库清单数据文件。

# rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:deltarpm-3.6-3.el7               ################################# [100%]

# rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:python-deltarpm-3.6-3.el7        ################################# [100%]

# rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:createrepo-0.9.9-28.el7          ################################# [100%]

# createrepo /docker_local_yum/
Spawning worker 0 with 8 pkgs
Spawning worker 1 with 7 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

步骤7 离线安装Docker

# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: docker
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors

# yum makecache
Loaded plugins: fastestmirror
Determining fastest mirrors
docker                                                                                                     | 2.9 kB  00:00:00     
(1/3): docker/filelists_db                                                                                 | 6.5 kB  00:00:00     
(2/3): docker/other_db                                                                                     |  11 kB  00:00:00     
(3/3): docker/primary_db                                                                                   |  12 kB  00:00:00     
Metadata Cache Created

# yum install docker-ce -y
# systemctl start docker
# docker version 安装完成
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:20:16 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:23:58 2018
  OS/Arch:      linux/amd64
  Experimental: false

卸载Docker

# yum remove docker-ce -y
# rm -rf /var/lib/docker

Docker容器管理

创建容器

容器创建流程:
这里写图片描述
docker create 创建容器,容器处于停止状态

# docker create centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
469cfcc7a4b3: Pull complete 
Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16
Status: Downloaded newer image for centos:latest
176a263e7b834fd585cf35828401f121b89c434581bd9475d0609d093660216e
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
176a263e7b83        centos              "/bin/bash"         14 minutes ago      Exited (0) 3 minutes ago                       sad_bardeen

解释:

176a263e…是容器的ID,每一个容器拥有独一无二的标识。
docker ps -a 查看所有容器,包含未启动的容器


docker run 创建容器,容器处于运行状态
交互型容器
进入容器shell环境,在容器中使用exit命令或者其它终端使用docker stopdocker kill,容器会变成停止状态。

[root@docker ~]# docker run -i -t --name=inspect_shell centos /bin/bash
[root@5d7a8ac72a16 /]#

解释:

-i选项:打开容器标准输入
-t选项:建立命令行终端
- -name选项:为容器指定名称,没有该选项时docker会随机取名
centos:为centos镜像创建容器
/bin/bash:在容器里执行/bin/bash

后台型容器
容器创建启动后,运行在后台,使用docker stopdocker kill来停止容器

# docker run --name daemon_while -d centos /bin/bash -c "while true;do echo hello;sleep 1; done"
c0f22db41e5b4ab9b393c9e206e454b6e83b0623e227346aeb4e1765b15a679c
# docker  ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c0f22db41e5b        centos              "/bin/bash -c 'while…"   50 seconds ago      Up 48 seconds                           daemon_while

解释:

-d选项:后台守护模式

依附容器

docker attach将终端依附到docker startdocker restart启动的交互式容器上,使其可以继续交互式操作。

[root@docker ~]# docker run -i -t --name attach_test centos /bin/bash
[root@788479b2649d /]# exit
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
788479b2649d        centos              "/bin/bash"         34 seconds ago      Exited (0) 7 seconds ago                       attach_test
[root@docker ~]# docker start attach_test
attach_test
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
788479b2649d        centos              "/bin/bash"         About a minute ago   Up 13 seconds                           attach_test
[root@docker ~]# docker attach attach_test
[root@788479b2649d /]#

查看容器

docker ps查看正在运行的容器

# docker  ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c0f22db41e5b        centos              "/bin/bash -c 'while…"   About an hour ago   Up About an hour                        daemon_while

解释:

CONTAINER ID:容器ID。64位的十六进制数,这里只显示了12位,一般使用前几位就可以标识该容器。
IMAGE:创建容器时使用的镜像。
COMMAND:容器最后运行的命令。
CREATED:创建容器的时间。
STATUS:容器的状态。UP时间(运行时间)、Exited(0)停止状态,后面的数字标识错误码,0为正常退出。
PORTS:对外开放的端口。
NAMES:容器名。和容器的ID一样可以标识容器,同样必须是唯一的。

-a 选项 查看所有状态的容器信息
-l 选项 查看最近创建的容器
-n=2 表示查看最近创建的两个容器

启停容器

docker start启动停止状态的容器
docker stop终止运行状态的容器

# docker stop daemon_while
# docker start daemon_while
# docker run --restart=always --name docker_restart -d centos /bin/bash -c "while true;do echo hello;sleep 1;done"

解释:

–restart选项:检查容器退出码决定是否需要重启容器,always不论返回多少都会重启;on-failure返回值非0时重启容器;on-failure:3表示收到非0的返回码后,最多尝试重启容器3次

删除容器

docker rm删除停止状态的容器,使用-f选项可以强制删除运行状态的容器。

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c0f22db41e5b        centos              "/bin/bash -c 'while…"   About an hour ago   Up 9 minutes                            daemon_while
# docker rm daemon_while
Error response from daemon: You cannot remove a running container c0f22db41e5b4ab9b393c9e206e454b6e83b0623e227346aeb4e1765b15a679c. Stop the container before attempting removal or force remove
# docker rm -f daemon_while
daemon_while

删除所有容器

# doker rm `docker ps -a -q`

解释:

-q选项 列出容器的ID,不显示容器的其它信息

查看容器日志

docker logs将容器输出到标准输出的数据作为日志输出到运行该指令的终端上。

# docker run -d --name daemon_logs centos /bin/bash -c 'for((i=0;1;i++));do echo $i;sleep 1;done;'
3c505af5b09c4aee5041d1289ab7e7894fd113906d152819e677b97c41f8e3f4
# docker logs -f -t --tail=5 deamon_logs
2018-06-05T01:58:57.433320584Z 91
2018-06-05T01:58:58.439360511Z 92
2018-06-05T01:58:59.443168270Z 93
2018-06-05T01:59:00.444004989Z 94
2018-06-05T01:59:01.447599614Z 95
2018-06-05T01:59:02.451474698Z 96
2018-06-05T01:59:03.455503486Z 97
2018-06-05T01:59:04.458988731Z 98
2018-06-05T01:59:05.471867807Z 99

解释:

-f选项 动态显示日志
-t选项 显示日志的产生时间
- -tail=n选项 显示最后的n条日志数据

查看容器进程

docker top查看容器中正在运行的进程。

# docker top daemon_logs
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2615                2598                0                   09:57               ?                   00:00:01            /bin/bash -c for((i=0;1;i++));do echo $i;sleep 1;done;
root                3293                2615                0                   10:06               ?                   00:00:00            sleep 1

查看容器信息

docker inspect用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。

# docker inspect daemon_logs
[
    {
        "Id": "3c505af5b09c4aee5041d1289ab7e7894fd113906d152819e677b97c41f8e3f4",
        "Created": "2018-06-05T01:53:39.251068388Z",
        "Path": "/bin/bash",
        "Args": [
            "-c",
            "for((i=0;1;i++));do echo $i;sleep 1;done;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2615,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-06-05T01:57:26.090166473Z",
            "FinishedAt": "2018-06-05T01:55:24.555274393Z"
        },
...
使用-f或者--format可以查看指定部分的信息。
查看容器的运行状态:
# docker inspect --format='{{.State.Running}}' daemon_logs
true

查看容器的IP地址:
# docker inspect --format='{{.NetworkSettings.IPAddress}}' daemon_logs
172.17.0.2

容器内执行命令

docker exec在容器中创建任务。

# docker exec -d daemon_logs touch /tmp/test.txt

同样可以进入交互模式下的容器,再进行容器内的指令操作,使用-t和-i选项。

容器的导入和导出

docker import容器导入
docker export容器导出

导出容器到本地为tar包
# docker export daemon_logs > my_container.tar
# ls
 my_container.tar

将导出的tar包作为镜像导入
 # cat my_container.tar | docker import - imported
sha256:4a0e96dc710ce55e17cea03c84c6cd27522a2426262125acfc386ff39fe9832b

查看镜像
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
imported            latest              4a0e96dc710c        27 seconds ago      199MB
centos              latest              e934aafc2206        8 weeks ago         199MB

导入网络上的容器
#docker import url res:tag
url表示网络地址
res表示镜像
tag表示标记

容器网络基础

Dokcer启动后,会在宿主机上创建名为docker0的虚拟网络接口。创建的容器会获得该网段的IP。

# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:85ff:fea8:ef51  prefixlen 64  scopeid 0x20<link>
        ether 02:42:85:a8:ef:51  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3  bytes 258 (258.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

暴露网络端口
通过端口映射能实现容器对外提供服务的基础方法。

docker run 在创建并运行容器时
-P(大写)选项可以将宿主机的随机端口映射到容器中服务监听的端口
-p(小写)选项可以指定宿主机上的端口映射到容器中服务监听的端口
-p 选项的写法:
宿主机ip:宿主机端口:容器端口 将宿主机IP和端口映射到容器端口
宿主机ip::容器端口 将宿主机IP和随机端口映射到容器端口
宿主机端口:容器端口 将宿主机端口映射到容器端口
如果要映射的端口是多个,再次添加-p选项即可

# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
3d77ce4481b1: Pull complete 
73674f4d9403: Pull complete 
d266646f40bd: Pull complete 
ce7b0dda0c9f: Pull complete 
01729050d692: Pull complete 
014246127c67: Pull complete 
7cd2e04cf570: Pull complete 
Digest: sha256:72f2b4aa99235509146bd12054d1a93c1c869ba60212d21729118c93ca4305d3
Status: Downloaded newer image for httpd:latest

# docker run -d -P --name httpd-1 httpd
330d3885885800c574b39ea0ef5241d01b32e6a6eb0af667fc331b9a00237750

# docker ps 
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
330d38858858        httpd               "httpd-foreground"   29 seconds ago      Up 28 seconds       0.0.0.0:32788->80/tcp   httpd-1

# curl localhost:32788
<html><body><h1>It works!</h1></body></html>

# docker run -d -p 80:80 --name=httpd-2 httpd
007014c939f291a9586069d40b688750a9fd2978b21e2138b66bc032225ff851

# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
007014c939f2        httpd               "httpd-foreground"   8 seconds ago       Up 7 seconds        0.0.0.0:80->80/tcp      httpd-2
330d38858858        httpd               "httpd-foreground"   14 minutes ago      Up 14 minutes       0.0.0.0:32788->80/tcp   httpd-1
# docker port httpd-2 
80/tcp -> 0.0.0.0:80

# curl localhost
<html><body><h1>It works!</h1></body></html>

Docker镜像管理

查看

docker images查看本机上所有镜像

#docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
imported            latest              4a0e96dc710c        13 minutes ago      199MB
centos              latest              e934aafc2206        8 weeks ago         199MB

解释:

REPOSITORY:仓库名称。用于存放同一类型镜像。
TAG:镜像名称。用于区分不同镜像,如果未指定默认为latest。
IMAGE ID:镜像唯一标识。
CREATED:镜像创建时间。
SIZE:镜像大小

下载

docker run指定镜像创建容器时,现在本机上寻找该镜像,如果不存在,就会继续去Docker Hub上搜索符合条件的镜像下载到本地后再去创建容器。
Docker Hup上有很多用户或组织创建的镜像,对于已经存在的镜像,可以直接下载来使用,没有必要再去重复造轮子。
docker search可以在Docker Hub上搜索镜像

# docker search wordpress
NAME                                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
wordpress                                           The WordPress rich content management system…   2308                [OK]                
bitnami/wordpress                                   Bitnami Docker Image for WordPress              73                                      [OK]
appcontainers/wordpress                             Centos/Debian Based Customizable Wordpress C…   34                                      [OK]
tutum/wordpress                                     Out-of-the-box Wordpress docker image           28                                      
centurylink/wordpress                               Wordpress image with MySQL removed.             14                                      [OK]
etopian/alpine-php-wordpress                        Alpine WordPress Nginx PHP-FPM WP-CLI           13
...

解释:

NAME:镜像名称。由命名空间和仓库名组成,没有命名空间,说明该镜像属于Docker Hub的官方镜像。
DESCRIPTION:镜像的简要描述。
STARS:用户对镜像的评分。
OFFICIAL:是否为官方镜像。
AUTOMATED:是否使用了自动构建。

docker pull可以把镜像拉取到本地。镜像名必须是完整的(命名空间和仓库名),如果仓库有多个镜像,还需要指定TAG。

删除

docker rmi删除本地镜像。容器没有依赖镜像,才能删除掉,也可以使用-f强制删除镜像。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
imported            latest              4a0e96dc710c        38 minutes ago      199MB
centos              latest              e934aafc2206        8 weeks ago         199MB
# docker rmi imported
Untagged: imported:latest
Deleted: sha256:4a0e96dc710ce55e17cea03c84c6cd27522a2426262125acfc386ff39fe9832b
Deleted: sha256:702cc069a24c49b6282c5b8d219bbd1d253a59f5bad5e963206aa40d8421ba92
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              e934aafc2206        8 weeks ago         199MB

创建本地镜像

docker commit将容器提交到本地仓库中,形成一个全新的镜像。

[root@docker ~]# docker run -it centos
[root@bcd97f4c90fb /]# yum install net-tools -y
[root@bcd97f4c90fb /]# exit
[root@docker ~]# # docker commit -m="net-tools" --author="Harry" bcd97f4c90fb harry/net-tools:v1
sha256:987ebf14259adc0048fa8026f50da7e105502165719505ff845c54cc79776b53
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
harry/net-tools     v1              987ebf14259a        23 seconds ago      269MB
centos              latest              e934aafc2206        8 weeks ago         199MB

解释:

-m选项:描述镜像信息
- -author选项:作者
bcd97f4c90fb:容器ID
harry/net-tools:v1 仓库名/镜像名:版本名

数据卷

数据卷是提供容器使用的特殊目录,可以多个容器之间共享目录;可以宿主机和容器之间共享目录。

创建数据卷

# docker run -d -i -t -v /opt/data --name data centos /bin/bash
ff0745c73a79280a22da160d51884b98be372dced124fa8fb9c162a9e3929152

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ff0745c73a79        centos              "/bin/bash"         6 seconds ago       Up 6 seconds                            data

# docker inspect data | grep data
        "Name": "/data",
                "Source": "/var/lib/docker/volumes/fa78592f15675a00994e95598c8f7f1fe7610665e4b4ed2038bd8947c0b9558a/_data",
                "Destination": "/opt/data",
                "/opt/data": {}
# cd /var/lib/docker/volumes/fa78592f15675a00994e95598c8f7f1fe7610665e4b4ed2038bd8947c0b9558a/_data
# echo "hello" > test.txt

[root@docker ~]# docker attach data
[root@ff0745c73a79 /]# cat /opt/data/test.txt 
hello

挂载主机目录作为数据卷

# docker run -d -i -t --name localdata -v /opt/data/:/opt/data/ centos
cd /opt/data/

# echo "Hi" > test.txt

[root@docker ~]# docker attach localdata
[root@39a7388c8cd9 /]# cat /opt/data/test.txt 
Hi

创建的数据卷默认是可读写的,如果写成 -v /opt/data/:/opt/data/:ro则创建的是只读数据卷。除了目录,文件也一样的操作。如果挂载的对象容器中是存在的,则会覆盖。

数据卷容器

在创建容器时,使用volumes-from选项可以指定数据卷容器。

创建专门用于挂载的数据卷容器
# docker run -d -v /data --name data centos

创建容器时指定数据卷容器
# docker run -d --volumes-from=data --name db1 centos

查看到数据卷是一样的
# docker inspect db1 data  --format {{.Mounts}}
[{volume eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c /var/lib/docker/volumes/eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c/_data /data local  true }]
[{volume eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c /var/lib/docker/volumes/eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c/_data /data local  true }]

删除数据卷,需要先删除所有的容器,并且最后一个依赖的容器删除时要加-v。

数据的备份和恢复

备份

创建数据卷容器,模拟数据备份源。
# docker run -d -v /data --name data centos
# docker inspect data --format {{.Mounts}}
[{volume 46baadf2f40c7a8863b3d93f34c4142616c88256f33e1f541124cd48d80b6bdb /var/lib/docker/volumes/46baadf2f40c7a8863b3d93f34c4142616c88256f33e1f541124cd48d80b6bdb/_data /data local  true }]

模拟产生数据
# cp /etc/fstab /var/lib/docker/volumes/46baadf2f40c7a8863b3d93f34c4142616c88256f33e1f541124cd48d80b6bdb/_data

开始备份数据卷容器/data目录下产生的数据
# docker run --volumes-from data -v /backup:/backup centos tar cvf /backup/backup.tar /data

宿主机上看到备份
# ls /backup/
backup.tar

恢复

创建需要恢复的数据容器
# docker run -v /data --name data2 centos

利用data数据卷容器关联到本地备份的目录
# docker run --volumes-from data2 -v /backup/:/backup/ centos tar xvf /backup/backup.tar
# docker inspect data2 --format {{.Mounts}}
[{volume b3be616d962edb6c8e023d0db9a46214044142814d2dcb4e5149a4fa29227ed5 /var/lib/docker/volumes/b3be616d962edb6c8e023d0db9a46214044142814d2dcb4e5149a4fa29227ed5/_data /data local  true }]

查看到data2容器的数据卷中有了备份的文件
# ls /var/lib/docker/volumes/b3be616d962edb6c8e023d0db9a46214044142814d2dcb4e5149a4fa29227ed5/_data/
fstab

容器连接

link做连接的选项,写法:–link name:alias
name是源容器的名称
alias是连接的别名

建立数据库容器,容器命名为db
# docker run --name db --env MYSQL_ROOT_PASSWORD=123456 -d mariadb

建立wordpress容器与db容器连接
# docker run --name mybbs --link db:mysql -p 80:80 -d wordpress

可以使用浏览器访问宿主机的ip:80,进入bbs设置向导
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值