40.Docker

目录

一、Docker。

(1)认识Docker。

(1.1)什么是Docker。

(1.2)Docker和虚拟机的区别。

(2)镜像、容器、DockerHub、Docker架构。

(3)安装Docker(CentOS中安装)。

(3.1)CentOS安装Docker的前提。

(3.2)卸载(可选)。

(3.3)安装docker。

(3.3.1)首先需要大家虚拟机联网,安装yum工具:

(3.3.3)下载docker。

(3.4)启动docker。

(3.4.1) 关闭防火墙(这里是练习才关)。

(3.4.2)通过命令启动docker。

(3.5)镜像加速器。

(3.6) docker-ce.repo 文件和 daemon.json 文件的区别。

(4)Docker基本操作。

(4.1)镜像操作。

(4.1.1)镜像名称。

(4.1.2)镜像操作命令。

(4.1.3)案例—拉取nginx镜像。

(4.1.4)案例—save与load。

(4.1.5) 案例—拉取Redis镜像。

(4.1.6)总结。

(4.2)容器操作。

(4.2.1)容器相关命令。

(4.2.2)案例—创建运行Nginx容器。 

(4.2.3)案例—修改Nginx容器的HTML文件内容。 

(4.2.4)案例—创建并运行Redis容器,在Redis容器文件添加内容。

(4.2.5)总结。 

(4.3)数据卷(容器数据管理)。

(4.3.1)数据卷命令。 

(4.3.2)数据卷挂载。

(4.3.3)目录挂载、文件挂载。

(4.3.4)案例—创建nginx容器,修改容器内的html目录的文件内容。

(4.3.5)总结。

(4.3.6) 三种挂载的区别。

(4.3.6.1) 数据卷挂载 或 目录挂载。

(4.3.6.2)文件挂载。

(5)Dockerfile自定义镜像。

(5.1)镜像结构。

(5.2)Dockerfile语法。

(5.3)案例—构建新镜像(运行一个java项目的镜像)。

(5.4)案例—基于镜像创建新镜像。

(5.5)总结。

(6)DockerCompose。

(6.1)CentOS7安装DockerCompose。

(6.1.1)安装 docker-compose 需要以下3个步骤:

(6.1.2)Base自动补全命令(使用时有提示)。

(6.1.3)案例。

(6.1.4)总结。 

(7)Docker镜像仓库。

(7.1)简化版镜像仓库。

(7.2)带有图形化界面版本。

(7.3)配置Docker信任地址。

(7.4)在私有镜像仓库推送或拉取镜像。

(7.5)docker pull registry拉取镜像超时的原因。


一、Docker。

(1)认识Docker。

(1.1)什么是Docker。

1、Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包,Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行,从而跨平台运行。

2、系统应用:封装内核指令为函数,便于程序员调用用户程序基于系统函数库实现功能

3、内核:提供访问计算机硬件的指令。

4、不同发行版本系统:函数库可能有所差异,但都是基于linux内核。


(1.2)Docker和虚拟机的区别。

(2)镜像、容器、DockerHub、Docker架构。

(3)安装Docker(CentOS中安装)。

企业部署一般都是采用Linux操作系统,而其中又数CentOS发行版占比最多,因此我们在CentOS下安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。

Docker CE 分为 stable test 和 nightly 三个更新频道。

官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。

(3.1)CentOS安装Docker的前提。

Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。

(3.2)卸载(可选)。

提示:就算没有旧版本的Docker,执行这个命令就是跟没执行一样。

如果之前安装过旧版本的Docker(不清楚的可以执行一遍),可以使用下面命令卸载:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

注意:“\”反斜杠的作用就是换行(命令太长,可以考虑换行)。

(3.3)安装docker。

(3.3.1)首先需要大家虚拟机联网,安装yum工具:
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

注意:yum-utils:这是一个实用工具集,提供了一些扩展的 yum 命令和功能,例如 yum-config-manager 等,可以用于仓库管理、软件包清理等操作。

(3.3.2)更改本地镜像源。

yum makecache fast:命令是将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度。

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

sed 命令和 yum-config-manager 命令的组合用法是对 Docker 的 YUM 仓库进行配置更改,具体如下:

第一条命令:

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这个命令中,--add-repo 参数用于指示 yum-config-manager 添加一个新的仓库。后面跟着的 URL https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 是要添加的仓库文件的地址。

通过执行这个命令,系统将会在 /etc/yum.repos.d/ 目录下创建一个名为 docker-ce.repo 的新文件,并将指定的仓库文件内容添加到该文件中。这个仓库文件包含了 Docker 相关的软件包和官方更新的信息。

添加仓库后,你就可以使用 YUM 命令来安装、更新和管理 Docker 相关的软件包。YUM 将会根据仓库文件中的配置信息,从指定的镜像源服务器上下载所需的软件包,并进行安装或更新操作。

第二条命令:

sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
  • 命令使用 sed 工具在 /etc/yum.repos.d/docker-ce.repo 文件中替换所有出现的 download.docker.com 地址为 mirrors.aliyun.com/docker-ce 地址。
(3.3.3)下载docker。

输入下载命令:稍等片刻,docker即可安装成功。

yum install -y docker-ce

-y:不需要向用户询问,所有询问都选yes。

docker-ce:ce为社区免费版本。

(3.4)启动docker。

(3.4.1) 关闭防火墙(这里是练习才关)。

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
(3.4.2)通过命令启动docker。

查看是否启动成功:

1、systemctl status docker 

2、docker -v(查看docker版本

systemctl start docker  # 启动docker服务
systemctl stop docker  # 停止docker服务
systemctl restart docker  # 重启docker服务

(3.5)镜像加速器。

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

配置镜像加速器:针对Docker客户端版本大于 1.10.0 的用户

通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://s7nqdrcs.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

提示:sudo命令,代表 "superuser do"(超级用户操作)。 

总共有四条命令:

第一条:创建docker目录。

第二条:创建daemon.json文件,并写入镜像仓库地址。

第三条:重新加载daemon.json文件。

第四条:重启docker。

daemon.json文件:(参考,并非复制系统的,这里只是展示书写格式)

{
    "registry-mirrors" : [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://cr.console.aliyun.com",
    "https://mirror.ccs.tencentyun.com"
  ]
}

当使用镜像加速器时,下载镜像的流程如下:如果有镜像加速器,那么不需要配置镜像源。

1、用户发起下载镜像的请求。
2、请求被发送到配置好的镜像加速器地址。
3、镜像加速器会首先检查自己的缓存中是否存在所需的镜像。如果存在,则直接从缓存中返回该镜像给用户。
4、如果镜像加速器的缓存中不存在所需的镜像,它会将请求转发到原始的镜像源(Registry)。
5、镜像源接收到请求后,会将相应的镜像发送给镜像加速器。
6、镜像加速器将镜像保存到自己的缓存中,并将镜像返回给用户。

(3.6) docker-ce.repo 文件和 daemon.json 文件的区别。

注意:镜像源与镜像加速器只需要配置其中一个即可(两种都配也行)。

docker-ce.repo 文件和 daemon.json 文件都与 Docker 相关,但它们在功能和用途上有所区别。

  1. docker-ce.repo 文件:配置镜像源的地方。

    • docker-ce.repo 是针对使用基于 Red Hat 兼容发行版(如 CentOS、Fedora)的系统而设计的。
    • 它是一个仓库配置文件,用于指定 Docker 的软件仓库源,即从哪里下载 Docker 软件包。
    • 在这个文件中,可以定义 Docker 的仓库 URL 和其他相关选项。
    • 该文件一般位于 /etc/yum.repos.d/ 目录下。
  2. daemon.json 文件:配置镜像加速器的地方。

    • daemon.json 是 Docker 守护进程的配置文件。
    • 它包含了一系列的配置选项,用于控制 Docker 守护进程的行为。
    • 在 daemon.json 文件中,可以配置各种选项,如镜像加速器、存储驱动、网络设置等。
    • 该文件一般位于 /etc/docker/ 目录下。

总结:

  • docker-ce.repo 文件是用来指定 Docker 软件仓库源的配置文件,用于安装和更新 Docker 软件包。
  • daemon.json 文件是用来配置 Docker 守护进程的配置文件,用于控制 Docker 运行时的行为和设置。

需要注意的是,docker-ce.repo 文件只在基于 Red Hat 兼容发行版的系统上使用,而 daemon.json 文件在所有支持的操作系统上均可使用。

(4)Docker基本操作。

(4.1)镜像操作。

(4.1.1)镜像名称。

(4.1.2)镜像操作命令。

(4.1.3)案例—拉取nginx镜像。

docker pull nginx

(4.1.4)案例—save与load。

注意:docker save --help(使用哪个命令,就查看文档使用) 

docker save -o nginx.tar nginx:latest  

docker rmi nginx:latest (删除镜像后,把压缩包镜像加载进来) 

docker load -i nginx.tar

(4.1.5) 案例—拉取Redis镜像。

docker pull redis

docker images(查看镜像是否已经拉取成功)

docker save -o redis.tar redis:latest

docker rmi redis:latest

docker load -i redis.tar 

(4.1.6)总结。

(4.2)容器操作。

(4.2.1)容器相关命令。

(4.2.2)案例—创建运行Nginx容器。 

docker run --name mn -p 80:80 -d nginx

docker ps

(4.2.3)案例—修改Nginx容器的HTML文件内容。 

docker exec -it mn bash

cd /usr/share/nginx/html

sed -i 's#Welcome to nginx#传智教育欢迎您#g' index.html(替换文档的内容)

sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html(替换文档的内容)

 exit(退出容器 )

docker ps(查看运行中的容器)

docker ps -a(all,查看所有容器)

docker rm mn (删除非运行中的容器)

docker rm mn -f (连运行中的容器也可以删除)

(4.2.4)案例—创建并运行Redis容器,在Redis容器文件添加内容。

docker run --name mr -p 6379:6379  -d  redis redis-server --appendonly yes

注:redis-server(启动服务端)

docker ps -a

然后去redis图形化界面远程连接这个redis服务器。

docker exec -it mr bash (docker exec -it mr redis-cli(这个直接进入redis-cli客户端))

redis-cli(进入客户端)

keys *(查看有没有记录)

set num 666(记录字符串数据)

exit(这次,退出客户端)

exit(再一次,退出redis)

(4.2.5)总结。 

(4.3)数据卷(容器数据管理)。

docker run -v <宿主机路径>:<容器路径> <镜像名称> 

(4.3.1)数据卷命令。 

docker volume --help(查看命令使用) 

docker volume create html(创建html数据卷)

docker volume ls(查看数据卷)

docker volume inspect html(查看数据卷在宿主机的具体位置)

docker volume prune -a(删除全部未使用的数据卷)

docker volume rm html(删除html数据卷)

(4.3.2)数据卷挂载。

注意:如果数据卷不存在,则自动创建。 

(4.3.3)目录挂载、文件挂载。

注意:挂载可以一次挂载多个目录或文件,-v参数是可以多次使用的。 

docker run --name mysql -e MYSQL_ROOT_PASSWORD=tan -p 3366:3306 -v /tem/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tem/mysql/data:/var/lib/mysql -d mysql:latest
-e :  环境
-v :挂载

(4.3.4)案例—创建nginx容器,修改容器内的html目录的文件内容。
docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx(创建容器时挂载)
docker ps -a
docker inspect html(效果与docker volume inspect html一样的,不清楚原因,html是数据卷)
cd /var/lib/docker/volumes/html/_data(切换到挂载点(与容器某个目录交互的目录))
cat index.html
vim index.html(改写文件内容)
cat index.html
最后一步:在浏览器访问,查看效果。

(4.3.5)总结。

(4.3.6) 三种挂载的区别。

注意:如果映射的容器目录没有,则会自动创建目录,完成挂载。 

        1、目录与数据卷很相似。

        2、挂载目录与容器目录只是目录内的变化,双方目录的名称都不会改变。

        3、文件也是一样,改变的是内容,不是文件名称。

(4.3.6.1) 数据卷挂载 或 目录挂载。

提示:但是在使用doker-compose构建容器的时候却可以挂载成功(有目录文件),不清楚原因。 

数据卷挂载 或 目录挂载(前提:挂载的路径):

1.数据卷没有目录文件时:容器的目录文件,数据卷目录都有。

2.数据卷有目录文件时:创建容器是exited状态(错误)。

        * 还未挂载过:不允许有目录文件,删了重新创建容器并挂载。(可能是系统原因吧)

        * 挂载过的目录,可以有目录文件,名字相同会覆盖内容。创建容器并挂载,就OK了。(容器已经删除的也算)

挂载过与未挂载过的区别:

(用户/用户组)root/root>>> polkitd/root(da/data/data1都是挂载过的目录)。 

(4.3.6.2)文件挂载。

文件挂载:

1.容器没有同名文件:文件添加到容器内。(前提:挂载的路径)

2.容器有同名文件:文件名不变,内容被挂载文件内容覆盖。(前提:挂载的路径)

(5)Dockerfile自定义镜像。

(5.1)镜像结构。

(5.2)Dockerfile语法。

(5.3)案例—构建新镜像(运行一个java项目的镜像)。

Dockerfile文件内容: 

 # 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar(/tmp/app.jar 是镜像内部的路径,./docker-demo.jar是宿主机的路径)

# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

1、构建新镜像。

docker build -t javaweb:1.0 . 

解析:

  • docker build:这是 Docker 命令的一部分,用于构建 Docker 镜像。
  • -t javaweb:1.0:即tag,这是构建镜像时为镜像指定的标签信息。-t 选项用于指定镜像的名称和标签,javaweb 是镜像的名称,1.0 是镜像的版本号或标签。
  • .:这是构建镜像的上下文路径。在此例中,. 表示当前目录(即 Dockerfile 所在的目录),Docker 将会在当前目录中查找 Dockerfile 文件并使用它来构建镜像。

2、基于这个镜像创建容器,即可访问。

docker run --name web -p 8090:8090 -d javaweb:1.0


(5.4)案例—基于镜像创建新镜像。

Dockerfile文件内容: 

# 指定基础镜像
FROM java:8-alpine
# 拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

1、构建新镜像。

docker build -t javaweb:1.0 . 

2、基于这个镜像创建容器,即可访问。

docker run --name web -p 8090:8090 -d javaweb:1.0

(5.5)总结。

(6)DockerCompose。

DockerCompose的详细语法参考官网:Overview | Docker Documentation 

(6.1)CentOS7安装DockerCompose。

(6.1.1)安装 docker-compose 需要以下3个步骤:

1、下载 docker-compose 的可执行文件,从官方网站或者其他适合你操作系统的渠道获取。

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

也可以直接将docker-compose文件上传到/usr/local/bin/目录里面。

2、将下载的可执行文件移动到一个系统路径可访问的目录下,例如 /usr/local/bin/docker-compose(如果不在这个路径,就需要执行这个步骤)。

3、赋予 docker-compose 可执行权限,可以使用命令 chmod +x /usr/local/bin/docker-compose 来实现。

# 修改权限
chmod +x /usr/local/bin/docker-compose

 4、验证安装是否成功,可以运行 docker-compose version 命令来检查版本信息,并且确认没有报错。

(6.1.2)Base自动补全命令(使用时有提示)。

自动补全命令功能: 

# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误(拒绝访问时,配置本地域名解析),需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
(6.1.3)案例。

注意:

1、使用DockerCompose部署时,所有服务之间都可以用服务名互相访问。 

2、ip地址都用服务名代替:我的理解是,创建容器的时候自动获取(当前主机)IP地址,然后再把服务名代替。

1.上传cloud-demo多微服务到虚拟机。

2. cd /tmp/cloud-demo

3.docker-compose --help(查看帮助文档)

4.docker-compose  up -d (up:创建并启动容器 -d:后台运行)

5.docker-compose logs -f(查看日志)

6.docker-compose logs -f userservice(查看某个服务日志)

7.到浏览器进行访问

注意:如果其他服务先启动成功,而nacos还未启动成功,那么其他服务去nacos注册的时候就会报错。

docker-compose restart gateway userservice orderservice(重启服务,多个服务之间空格) 


$PWD 命令:它会返回当前所在的工作目录的完整路径 。

docker-compose.yml文件:

version: "3.2"

services:
  nacos:
    image: nacos/nacos-server
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
  mysql:
    image: mysql:5.7.25
    environment:
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "$PWD/mysql/data:/var/lib/mysql"
      - "$PWD/mysql/conf:/etc/mysql/conf.d/"
  userservice:
    build: ./user-service
  orderservice:
    build: ./order-service
  gateway:
    build: ./gateway
    ports:
      - "10010:10010"

 


(6.1.4)总结。 

DockerCompose有什么作用?

帮助我们快速部署分布式应用,无需一个个微服务去构建镜像和部署。

注意:services下面,mysql与web都是微服务,即配置了两个微服务的指令,可配置多个。 

(7)Docker镜像仓库。

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

(7.1)简化版镜像仓库。

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

搭建方式比较简单,命令如下:镜像要提前下载好。

docker run -d \
    --restart=always \
    --name registry	\
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    registry

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

(7.2)带有图形化界面版本。

注意:下面的内容需要放到docker-compose.yaml文件里面,然后执行该文件。

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=传智教育私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

(7.3)配置Docker信任地址。

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

注意:如果不止一个,需要用“,”隔开,里面的IP地址要改成自己的ip地址。 

(7.4)在私有镜像仓库推送或拉取镜像。

(7.5)docker pull registry拉取镜像超时的原因。

修改DNS:很重要的一步,因为大部分 pull 失败的原因都是这个

vim /etc/resolv.conf
        nameserver 8.8.8.8
        nameserver 8.8.4.4

/etc/resolv.conf 是一个配置文件,用于指定要用于域名解析的 DNS 服务器。在这个文件中,nameserver 关键字后面的 IP 地址表示要使用的 DNS 服务器。

具体来说:

  • nameserver 8.8.8.8 表示要使用 IP 地址为 8.8.8.8 的 DNS 服务器。
  • nameserver 8.8.4.4 表示要使用 IP 地址为 8.8.4.4 的 DNS 服务器。

当你在浏览器中输入一个域名时,操作系统会查询 /etc/resolv.conf 文件以确定要使用哪个 DNS 服务器进行解析。当 /etc/resolv.conf 文件中指定了多个 nameserver 时,系统将按照顺序逐个尝试这些 DNS 服务器进行域名解析。系统会从第一个 nameserver 开始尝试解析域名,如果无法连接或没有响应,则会继续尝试下一个 nameserver,直到找到可用的 DNS 服务器或尝试完所有的服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值