centos7下docker的安装、配置及使用

1、安装

1.1、卸载旧的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
1.2、安装依赖
[root@docker ~]# yum install -y yum-utils
1.3、设置镜像仓库
国外镜像仓库,比较慢
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
推荐使用阿里国内源安装docker
[root@docker ~]#  yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.4、更新yum软件包
[root@docker ~]# yum makecache

安装docker相关的内容(最新版) docker-ce社区版 docker-ee企业版

[root@docker ~]# yum install docker-ce docker-ce-cli containerd.io
1.5、指定版本安装
查看版本
[root@docker ~]# yum list docker-ce --showduplicates | sort -r
指定版本
[root@docker ~]# yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
1.6、启动docker
[root@docker ~]# systemctl start docker
1.7、验证是否启动成功
[root@docker ~]# docker version
1.8、卸载docker
卸载依赖
[root@docker ~]# yum remove docker-ce docker-ce-cli containerd.io
删除资源路径
[root@docker ~]# rm -rf /var/lib/docker
1.9、配置阿里云镜像加速
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://krmu1x5v.mirror.aliyuncs.com"]
}
EOF
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker
运行一个容器的流程

在这里插入图片描述

底层原理

Docker是一个Client - Server结构的系统,Docker的守护进程运行在主机上,通过Socket客户端访问 DockerServer接收到Docker-Client的指令, 就会执行这个命令
在这里插入图片描述

2、镜像管理

在这里插入图片描述

2.1、镜像命令
镜像打包(save打包的直接是一个镜像)
docker save -o image > name.tar
2.2、解压镜像
docker load -i < name.tar
2.3、运行一个容器导出镜像(export导出的是一个文件系统)
docker export 容器id > name.tar
2.4、导入镜像
docker import name.tar image(name)
2.5、docker images 查看本机的所有镜像
[root@docker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        10 months ago       13.3kB


REPOSITORY   镜像的仓库源
TAG          镜像的版本
IMAGE ID     镜像的ID
CREATED      镜像的创建时间
SIZE         镜像的大小


参数解释
-a  //显示所有镜像
-q  //只显示镜像ID
2.6、docker search 搜索镜像
[root@docker ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10202               [OK]                


通过收藏来过滤
[root@docker ~]# docker search mysql --filter=STARS=3000
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   10202               [OK]                
mariadb             MariaDB is a community-developed fork of MyS…   3753                [OK]                
2.7、docker pull 下载镜像
docker pull 镜像名
[root@docker ~]# docker pull mysql
Using default tag: latest    //如果不写tag,默认是latest
latest: Pulling from library/mysql
852e50cd189d: Pull complete    //分层下载,docker image的核心,联合文件系统
29969ddb0ffb: Pull complete 
a43f41a44c48: Pull complete 
5cdd802543a3: Pull complete 
b79b040de953: Pull complete 
938c64119969: Pull complete 
7689ec51a0d9: Pull complete 
a880ba7c411f: Pull complete 
984f656ec6ca: Pull complete 
9f497bce458a: Pull complete 
b9940f97694b: Pull complete 
2f069358dc96: Pull complete 
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093  //签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest   //真实地址

docker pull mysql  等价于  docker pull docker.io/library/mysql:latest
指定版本下载:docker pull mysql:5.7
2.8、docker rmi 删除镜像
删除指定镜像
[root@docker ~]# docker rmi -f dd7265748b5d
删除所有镜像
[root@docker ~]# docker rmi -f ${docker images -q}	

3、容器管理

3.1、帮助命令
docker version  #显示docker版本信息
docker info     #显示docker的系统信息
docker --help   #帮助命令

帮助文档地址:https://docs.docker.com/reference

3.2、新建容器并启动
docker run [可选参数] image
参数说明
--name="name"   容器名
-d              后台方式运行
-it             使用交互方式运行,进入容器查看内容
-p              指定容器端口
-P              随机指定端口

测试
[root@docker ~]# docker run -it  centos /bin/bash
[root@b1a0d2d2e983 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
退出容器
[root@b1a0d2d2e983 /]# exit
3.3、列出所有运行的容器
docker ps 命令参数
-a     列出所有容器
-n=?  列出最近创建的容器
-q     只显示容器的ID

[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b1a0d2d2e983        centos              "/bin/bash"         5 minutes ago       Exited (0) 5 minutes ago                       hopeful_gauss
85edd6ac145b        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                         keen_chaum
[root@docker ~]# docker ps -a -n=1
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b1a0d2d2e983        centos              "/bin/bash"         5 minutes ago       Exited (0) 5 minutes ago                       hopeful_gauss
[root@docker ~]# docker ps -aq
b1a0d2d2e983
85edd6ac145b
3.4、退出容器
exit      直接退出容器并停止
Ctrl+p+q  退出容器并使容器正常运行
3.5、启动和停止容器
docker start 容器id       //启动容器
docker restart 容器id    //重启容器
docker stop 容器id      //停止正在运行的容器
docker kill 容器id     //强制停止正在运行的容器	
3.6、删除容器
docker rm 容器id                  //删除指定容器,不能删除正在运行的容器
docker rm -f  容器id             //删除指定容器,强制删除正在运行的容器
docker rm -f ${docker ps -aq}   //删除所有容器
docker ps -aq |xargs docker rm  -f //删除所有容器
常用其他命令
3.7、后台启动容器
docker run -d 镜像名
[root@docker ~]# docker run -f centos
常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
3.8、查看日志
docker logs -f -t --tail 行数  容器名
-tf  //显示日志
--tail  //显示日志条数
编写一个脚本启动一个容器查看日志
[root@docker ~]# docker run -d centos /bin/bah -c "while true;do echo liuchao;sleep 1;done"
[root@docker ~]# docker logs -f -t --tail 10 0929e13e8731
2020-11-24T09:20:31.671866039Z liuchao
2020-11-24T09:20:32.675777689Z liuchao
2020-11-24T09:20:33.684273188Z liuchao
2020-11-24T09:20:34.693939430Z liuchao
2020-11-24T09:20:35.698329347Z liuchao
2020-11-24T09:20:36.702976783Z liuchao
2020-11-24T09:20:37.710027107Z liuchao
2020-11-24T09:20:38.719628930Z liuchao
3.9、查看docker容器中进程信息
命令
docker top 容器id
[root@docker ~]# docker top 0929e13e8731 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                10308               10290               0                   17:20               ?                   00:00:00            /bin/bash -c while true;do echo liuchao;sleep 1;done
root                10538               10308               0                   17:22               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
3.10、查看镜像的元数据
docker inspect 容器id
3.11、进入当前正在运行的容器
docker exec -it 容器id /bin/bash
docker attach 容器id	

docker exec    //进入容器后开启一个新的终端,可以进行操作
docker attach  //进入容器正在运行的字段,不会启动新的进程
3.12、从容器内拷贝文件到宿主机
docker cp 容器id:容器内路径 主机路径

[root@docker ~]# docker cp 0929e13e8731:/home/test /home
3.13、commit镜像
命令
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

[root@docker ~]# docker commit -m="添加tomcat的webapps应用" -a="liuchao" 0929e13e8731 tomcat:1.0
3.14、容器日志存放路劲
ls /var/lib/docker/containers/容器id
--restart=always 加此参数会开机自启容器

4、容器数据卷

微信截图_20191018095711.png

4.1、Volume数据卷形式
管理卷(以nginx为例)
docker volume create nginx-vol 创建管理卷
docker volume ls 查看
docker volume inspect nginx-vol 查看详细信息
4.2、用卷创建一个容器
docker run -d -it --name=nginx-text --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
4.3、清理
docker stop nginx-vol 停止容器
docker rm -f nginx-vol 删除容器
docker volume rm nginx-vol 删除管理卷
4.4、匿名挂载和具名挂载
-v 容器路径              //匿名挂载
[root@docker ~]# docker run -d -P --name nginx -v /etc/nginx nginx

-v 卷名:容器路径         //具名挂载
[root@docker ~]# docker run -d -P --name nginx -v juming-nginx:/etc/nginx nginx

-v  宿主机路径:容器路径   //指定路径挂载
[root@docker ~]# docker run -d -P --name nginx -v /nginx:/etc/nginx nginx

通过 -v 容器路径,ro 、rw改变读写权限
ro   readonly  //只读
rw  readwrite  //可读可写
//一旦设置了容器权限。容器对我们挂载出来的内容就有限制了
[root@docker ~]# docker run -d -P --name nginx -v juming-nginx:/etc/nginx:ro nginx
[root@docker ~]# docker run -d -P --name nginx -v juming-nginx:/etc/nginx:rw nginx

//只要看到ro就说明这个路径只能通过宿主机来操作,容器内无法操作!
4.5、数据卷容器(匿名挂载)
命令
docker run -d --name 名字 -p 映射端口 --volumes-from 要同步的容器名 镜像名
--volumes-from
例子:两个mysql之间实现数据共享
docker run -d  --name mysql01 -p 3306:3306  -v /etc/mysql/conf.d  -v  /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7

docker run -d  --name mysql02 -p 3307:3306  --volumes-from mysql01  -e MYSQL_ROOT_PASSWORD=123 mysql:5.7

结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的

https://docs.docker.com/storage/volumes/ 官方文档

5、DockerFile

参考文章:https://www.cnblogs.com/panwenbin-logs/p/8007348.html

在这里插入图片描述

5.1、FROM:指定基础镜像,必须为第一个命令
格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM mysql:5.6
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
5.2、MAINTAINER: 维护者信息
MAINTAINER <name>
示例:
    MAINTAINER Jasper Xu
    MAINTAINER sorex@163.com
    MAINTAINER Jasper Xu <sorex@163.com>
5.3、RUN:构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
5.4、ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir
5.5、COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
5.6、CMD:构建容器后调用,也就是在容器启动时才进行调用。
格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:
   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
5.7、ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM centos
    ENTRYPOINT ["ls", "-al"]
注:
   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
5.8、LABEL:用于为镜像添加元数据
格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
5.9、ENV:设置环境变量
格式:
    ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
	ENV MYPATH /usr/local
	WORKDIR $MYPATH
5.10、EXPOSE:指定于外界交互的端口
格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
注:
  EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
5.11、VOLUME:用于指定持久化目录
格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
	1 卷可以容器间共享和重用
	2 容器并不一定要和其它容器共享卷
	3 修改卷后会立即生效
	4 对卷的修改不会对镜像产生影响
	5 卷会一直存在,直到没有任何容器在使用它
5.12、WORKDIR:工作目录,类似于cd命令
格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
    WORKDIR b  (这时工作目录为/a/b)
    WORKDIR c  (这时工作目录为/a/b/c)
注:
  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
5.13、USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group
 示例:
  USER www
 注:
  使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
5.14、ARG:用于指定传递给构建运行时的变量
格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www
5.15、ONBUILD:用于设置镜像触发器
格式:
  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
  当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
6、创建一个centoos镜像,使创建出的容器有vim、ifconfig命令
6.1、vim centos-dockerfile
FROM centos
MAINTAINER liuchao
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash 
6.2、构建镜像
docker build -f centos-dockerfile -t mycentos:1.0 .
6.3、如果构建报如下错误
Errors during downloading metadata for repository 'AppStream':
  - Curl error (28): Timeout was reached for http://mirror.centos.org/centos/8/AppStream/x86_64/os/repodata/4cac32b46dd60ec129Less than 1000 bytes/sec transferred the last 30 seconds]

解决方法:查看yum源、如果yum源不好使,请下载阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo

运行  yum makecache  生成缓存 或 yum clean all

再重启docker服务
systemctl restart docker

7、Docker网络

网络.png

7.1、四种模式
host模式:使用 --net=host 指定。

none模式:使用 --net=none 指定。

bridge模式:使用 --net=bridge 指定,默认设置。

container模式:使用 --net=container:NAME_or_ID 指定。
7.2、下面分别介绍一下Docker的各个网络模式
7.2.1、Bridge

相当于Vmware中的NAT模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式

一个ens33对应一个veth-pair
下载插件yum -y install bridge-utils.x86_64
使用brctl show 详细查看
bridge.png

7.2.2、Host

相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口

7.2.3、Container

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信

7.2.4、None

该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
overlay
在docker1.7代码进行了重构,单独把网络部分独立出来编写,所以在docker1.8新加入的一个overlay网络模式。Docker对于网络访问的控制也是在逐渐完善的

7.3、容器互联(–link)
7.3.1、示例在这里插入图片描述
7.3.2、两个容器不能通过容器名互通
解决方法:
#新建一个容器并加上--link参数
[root@docker ~]# docker run -d --name tomcat3 --link tomcat2 -P tomcat
d8498bfeb4610294bc066d03e940cb449881c9d41cef3d05eaf175e4be9bc158

#验证
[root@docker ~]# docker exec -it tomcat3 ping tomcat2
PING tomcat2 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.137 ms
64 bytes from tomcat2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.056 ms
7.3.3、自定义网络

查看所有网络

[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8fdcd2ccc6c3        bridge              bridge              local
57cfc8362982        host                host                local
75a95d496e33        none                null                local
7.3.4、创建一个网络
[root@docker ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynetwork
7.3.5、查看网络信息
[root@docker ~]# docker network inspect mynetwork
[
    {
        "Name": "mynetwork",
        "Id": "be633771b60b81c42f13fa351cc6fd43a871443ce96e870a18a12e39325cadfb",
        "Created": "2020-11-27T16:13:34.949552367+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
7.3.6、删除网络
[root@docker ~]# docker network rm mynetwork
mynetwork
7.3.7、连接一个容器到一个网络
[root@docker ~]# docker network connect 网络名 容器名
可参考文档:https://www.cnblogs.com/zuxing/articles/8780661.html
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值