Docker 笔记

Docker

docker # 查看 docker 用法,包括命令列表
docker image # 查看 docker image 用法,包括命令列表
docker <COMMAND> --help # 查看 docker 命令帮助

# docker 的命令基本结构是:
# docker [OPTIONS] COMMAND COMMAND [OPTIONS]
# 例如:
# docker image --help
# docker image ls --help
# docker image ls -a


docker version # 查看 docker 版本
docker info # 查看 docker 信息

Docker Tips

加速

# 编译镜像源
vim /etc/docker/daemon.json

# 使生效
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像源

{
    "registry-mirrors": [
        "https://7x52jhpv.mirror.aliyuncs.com",
        "https://dockerproxy.com",
        "https://mirror.ccs.tencentyun.com",
        "https://registry.hub.docker.com"
    ]
}

阿里云镜像

https://dockerproxy.com/docs

Docker Hub 源使用帮助 — USTC Mirror Help 文档

轻量应用服务器 安装 Docker 并配置镜像加速源-最佳实践-文档中心-腾讯云

镜像

获取镜像

# docker pull [选项] [仓库地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:18.04
docker image pull redis:latest
docker image pull quay.io/bitnami/nginx # https://quay.io/ 也是一个镜像仓库


# 查看本地镜像详情(镜像需要先下载到本地)
docker image inspect 镜像

查看本地镜像列表

docker images
docker image ls
  • -a 查看所有

删除本地镜像

# docker image rm [选项] <镜像1> [<镜像2> ...]
# 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要
# 短 ID 一般取前3个字符以上,只要足够区分于别的镜像就可以了
docker rmi
docker image rm 镜像

## 删除所有未使用的镜像
docker image prune

# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f
  • -f 强制删除

如果一个镜像正被某些容器使用,则无法删除

从容器创建镜像

docker container commit [选项] <容器> [镜像[:TAG]]
docker container commit 123 pish163/my-nginx:1.0.0

导出镜像

# 导出镜像到一个文件中,文件可用于传输
docker image save <镜像> <镜像> <镜像> -o <文件>
docker image save nginx:1.20.0 -o nginx.image

导入镜像

# 从文件中获取镜像,这种方式的优点是不需要联网
docker image load -i <文件>
docker image load -i ./nginx.image

构建镜像(dockerfile)

docker image build -t <镜像名称> <Dockerfile目录>
docker image build -t hello .

构建好镜像后,可以通过 docker image ls 查看

其它命令

# 查看镜像的各个分层
docker image history 镜像

容器

从镜像启动

# 使用 run 来启动镜像时,若镜像不存在,则 Docker 将自动下载
# 比如说,可以直接运行 "docker container run nginx" 就可以自动下载并运行 nginx
# docker run 将创建一个新容器
# 也可以先执行 docker create xxx 创建容器
docker run -it ubuntu:18.04 bash
docker container run -it ubuntu:18.04 /bin/bash
docker container run ubuntu:18.04 /bin/echo 'Hello world' # 输出一个 “Hello World”,之后终止容器

docker container run --name centos -it centos bash
docker container run -itd --name redis-test -p 6379:6379 redis
docker container run --name some-redis -d -p 6379:6379 redis
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
  • -i 交互式操作,让容器的标准输入保持打开
  • -t 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
  • -d 后台运行容器(守护态运行)
  • -p 指定端口映射,格式为:主机(宿主)端口:容器端口
  • –name=“nginx-lb”: 为容器指定一个名称,若不指定则使用随机名字
  • –rm 不保存容器,也就是说容器运行结束后会自动自行删除,如果一个容器运行时只是执行一个命令后自行退出,那么很适合加上 --rm 参数,如果一个容器的运行总是通过镜像运行,也就没必要保存容器了,可以在运行结束后自动删除
  • -v 为容器的某一个指定 volume 指定一个名称或路径,例如: -v name:/app 就是将 volume “/app” 指定名称为 “name”,-v ${pwd}:/app 就是为 volume “/app” 指定存储路径为当前目录
  • –netowrk 指定要使用的网络
  • 放在镜像名后的是 命令,如果希望有个交互式 Shell,可以用 bash

容器运行后,在 windows 下,按 ctrl+c 虽然会即出 shell,但容器仍在运行中,linux 和 mac 则会退出容器。

命令中,镜像名之后可以指定容器启动后要运行的命令,若不指定,则会运行镜像所配置的默认命令。

挂载主机目录/文件

# 读写
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share centos:centos7

# 只读
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share,readonly centos:centos7
  • 挂载目录或文件使用相同命令,可使用目录路径或文件路径

从容器启动

docker start -i 容器
docker restart

docker container start -i 容器
docker container restart 容器
  • -i 交互式操作,让容器的标准输入保持打开

Attach(前台) 与 Detach(后台)

windows 下,attach 模式是不完整的,容器的输出会输出到本地 shell,但是在本地 shell 进行 ctrl+c 的话,只会即出本地 shell,容器仍然在运行。

所以在 windows 下,要停止容器,需要使用 docker stop 命令。

linux 和 max 则是完整的 attach 模式,只要容器是在前台运行,ctrl+c 就会结束容器

# 添加 --detach 或 -d 参数即可以 detach 模式运行,即后台运行
# 以后台模式运行时,容器的输出并不会输出到本地 shell
# 这种模块下本地 shell 不会被容器占用
docker run --detach -p 80:80 nginx

# 将容器转换为前台
# 这时本地 shell 被容器占用,输入 ctrl+c 可以停止容器(仅linux和mac)
docker attach 容器

# 如果容器在后台运行,可以执行以下命令来临时查看其输出日志
# -f 参数可以保持日志输出,直到 ctrl+c 退出
docker container logs 容器
docker container logs -f 容器

进入容器

# 将本地标准输入、输出和错误流附加到运行的容器
# 如果容器没有以交互操作方式启动(比如启动时使用 -d 参数),可使用此命令进入容器
# 进入后,在容器中执行 exit 容器将退出,输出是容器的输出,输入则输入给容器
# 注意,-d 相当于 --detach,与这里的 attach 是相反的模式
docker attach 容器

# 当容器是在后台运行时,可以使用如下命令在运行中的容器中执行命令
# 因为使用了 -it 选项并执行 sh,所以会保存 sh 的打开状态,相当于从后台模式回到了前台模式
# 注意,进入后,在容器中执行 exit 时只是退出了 `/bin/sh`,容器将仍然保持运行
docker exec -it 容器 /bin/sh

退出容器

# 容器自身的虚拟终端,退出容器
exit

# 容器自身的虚拟终端,不退出容器,保留在后台运行
ctrl+q+p

docker stop 容器 容器 容器 
docker kill 容器 容器 容器 
docker container stop 容器 容器 容器 

# 停止所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container stop $(docker container ls -aq)

查看容器列表

# 查看已经在运行的容器
docker ps -a 
docker container ls -a

# 列出所有容器的 ID
# 借助该命令,可以进行批量容器操作
# 例如 `docker container stop $(docker container ls -aq)`
# 例如 `docker container rm $(docker ps -aq)`
docker container ls -aq
  • -a 列出所有容器(包括未运行的容器)

在容器列表中,会包含容器的 ID 和容器的名称,ID 或名称都可以指代容器,而且在使用 ID 时,可以只输入 ID 的前 n 个字母

删除容器

# 如果容器正在运行,则需要带上 -f 参数
docker rm 容器 容器 容器 容器
docker container rm 容器 容器 容器 容器

# 删除所有停止运行的容器
docker container prune

# 删除所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container rm $(docker container ls -aq)

# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f

容器重命名

docker rename 容器 新的容器名

常用模式

docker container run -it busybox sh # 前台方式启动容器
exit # 退出容器

docker container run -d nginx # 后台运行
docker container exec -it 容器 sh # 取得交互

其他命令

# 查看容器详情,例如启动命令、镜像、连接的网络
docker container inspect 容器

数据卷(volume)

Data Volume

方式一:在 dockerfile 中可以通过 VOLUME ["路径"] 来指定数据卷,例如 VOLUME [ "/data" ]。这时,容器中向 /data 读写数据时将会同步到宿主机中(即使启动时没有指定 -v 选项)。宿主机中有专门的目录来存储其数据。如果启动容器时没有指定 -v 选项,则会自动创建一个名称随机的卷。注意,没有指定 -v 参数时,每次启动都会创建新的卷。

方式二:启动容器时,可以使用 -v 参数为容器中的某个路径指定数据卷,不管这个路径有没有使用 VOLUME 进行声明。-v 可以为数据卷指定一名字,格式为 -v name:/path

当然,VOLUME-v 结合使用也没问题,例如 -v local-data:/data,这时,容器中 /data 的数据就会存储到宿主机中的 local-data 数据卷中。

volume 命令

# 查看所有数据卷
docker volume ls

# 查看数据卷详情
# 详情中包括数据卷中宿主机中的挂载路径,如 `/var/lib/docker/volumes/xxxxx/_data`
docker volume inspect 名称

mysql 示例

在 mysql 中,就有一个数据卷 VOLUME [/var/lib/mysql],可以使用如下方式进行启动:docker run -d -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2

执行 docker volume inspect mysql-data,得到如下信息:

[
    {
        "CreatedAt": "2023-10-31T17:50:37+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
        "Name": "mysql-data",
        "Options": null,
        "Scope": "local"
    }
]

Bind Mount(直接挂载)

使用 -v 时,除也可以指定的一名称之外,还可以直接指定一个路径,例如:

docker run -d -v /root/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2

以上命令中,使用了 -v 宿主路径:容器内路径 的方式挂载数据,这时会自动将宿主机中的路径挂载到容器的指定路径上,这时,使用 docker volume ls 将无法查看到这个数据卷。但可以通过 docker container inspect 容器 命令来查看窗口详情,其中会有 “Mounts” 信息。

网络

docker 的网络(仅手动创建的网络)可以用容器名称进行 ping 操作

查看

# 查看当前的所有网络
docker network ls

# 查看某个网络的详情
# 可查看到网络的网段、网关地址、已接入的所有节点等
docker network inspect xxx

创建

# 创建一个网络
# -d 参数用于指定驱动,还可以配置子网、网关等参数
docker network create -d bridge xxxx

创建网络后,在启动容器时,可以使用 --network xxxx 参数来指定要连接的网络

手动创建的网络具有类似 dns 的功能,在连接的容器之间可以用容器名 ping 通过。注意,docker 自动创建的默认网络则没有这种功能。

连接

# 容器已经创建后,可以通过以下命令来为容器连接新的网络
docker network connect [网络名] [容器名]

# 断开连接
docker network disconnect [网络名] [容器名]

备忘

安装 ifconfig

yum provides ifconfig
yum whatprovides ifconfig
# 结果如下

net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
Repo        : base
Matched from:
Filename    : /sbin/ifconfig
# 表明 ifconfig 工具在 net-tools 包中

yum install net-tools

redis

docker pull redis:latest                                # 获取镜像
docker run -itd --name redis -p 6379:6379 redis:latest  # 启动容器(后台)
docker exec -it redis /bin/bash                         # 进入虚拟终端
redis-cli                                               # 启动 redis 客户端

Docker

docker # 查看 docker 用法,包括命令列表
docker image # 查看 docker image 用法,包括命令列表
docker <COMMAND> --help # 查看 docker 命令帮助

# docker 的命令基本结构是:
# docker [OPTIONS] COMMAND COMMAND [OPTIONS]
# 例如:
# docker image --help
# docker image ls --help
# docker image ls -a


docker version # 查看 docker 版本
docker info # 查看 docker 信息

Docker Tips

加速

# 编译镜像源
vim /etc/docker/daemon.json

# 使生效
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像源

{
    "registry-mirrors": [
        "https://7x52jhpv.mirror.aliyuncs.com",
        "https://dockerproxy.com",
        "https://mirror.ccs.tencentyun.com",
        "https://registry.hub.docker.com"
    ]
}

阿里云镜像

https://dockerproxy.com/docs

Docker Hub 源使用帮助 — USTC Mirror Help 文档

轻量应用服务器 安装 Docker 并配置镜像加速源-最佳实践-文档中心-腾讯云

镜像

获取镜像

# docker pull [选项] [仓库地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:18.04
docker image pull redis:latest
docker image pull quay.io/bitnami/nginx # https://quay.io/ 也是一个镜像仓库


# 查看本地镜像详情(镜像需要先下载到本地)
docker image inspect 镜像

查看本地镜像列表

docker images
docker image ls
  • -a 查看所有

删除本地镜像

# docker image rm [选项] <镜像1> [<镜像2> ...]
# 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要
# 短 ID 一般取前3个字符以上,只要足够区分于别的镜像就可以了
docker rmi
docker image rm 镜像

## 删除所有未使用的镜像
docker image prune

# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f
  • -f 强制删除

如果一个镜像正被某些容器使用,则无法删除

从容器创建镜像

docker container commit [选项] <容器> [镜像[:TAG]]
docker container commit 123 pish163/my-nginx:1.0.0

导出镜像

# 导出镜像到一个文件中,文件可用于传输
docker image save <镜像> <镜像> <镜像> -o <文件>
docker image save nginx:1.20.0 -o nginx.image

导入镜像

# 从文件中获取镜像,这种方式的优点是不需要联网
docker image load -i <文件>
docker image load -i ./nginx.image

构建镜像(dockerfile)

docker image build -t <镜像名称> <Dockerfile目录>
docker image build -t hello .

构建好镜像后,可以通过 docker image ls 查看

其它命令

# 查看镜像的各个分层
docker image history 镜像

容器

从镜像启动

# 使用 run 来启动镜像时,若镜像不存在,则 Docker 将自动下载
# 比如说,可以直接运行 "docker container run nginx" 就可以自动下载并运行 nginx
# docker run 将创建一个新容器
# 也可以先执行 docker create xxx 创建容器
docker run -it ubuntu:18.04 bash
docker container run -it ubuntu:18.04 /bin/bash
docker container run ubuntu:18.04 /bin/echo 'Hello world' # 输出一个 “Hello World”,之后终止容器

docker container run --name centos -it centos bash
docker container run -itd --name redis-test -p 6379:6379 redis
docker container run --name some-redis -d -p 6379:6379 redis
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
  • -i 交互式操作,让容器的标准输入保持打开
  • -t 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
  • -d 后台运行容器(守护态运行)
  • -p 指定端口映射,格式为:主机(宿主)端口:容器端口
  • –name=“nginx-lb”: 为容器指定一个名称,若不指定则使用随机名字
  • –rm 不保存容器,也就是说容器运行结束后会自动自行删除,如果一个容器运行时只是执行一个命令后自行退出,那么很适合加上 --rm 参数,如果一个容器的运行总是通过镜像运行,也就没必要保存容器了,可以在运行结束后自动删除
  • -v 为容器的某一个指定 volume 指定一个名称或路径,例如: -v name:/app 就是将 volume “/app” 指定名称为 “name”,-v ${pwd}:/app 就是为 volume “/app” 指定存储路径为当前目录
  • –netowrk 指定要使用的网络
  • 放在镜像名后的是 命令,如果希望有个交互式 Shell,可以用 bash

容器运行后,在 windows 下,按 ctrl+c 虽然会即出 shell,但容器仍在运行中,linux 和 mac 则会退出容器。

命令中,镜像名之后可以指定容器启动后要运行的命令,若不指定,则会运行镜像所配置的默认命令。

挂载主机目录/文件

# 读写
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share centos:centos7

# 只读
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share,readonly centos:centos7
  • 挂载目录或文件使用相同命令,可使用目录路径或文件路径

从容器启动

docker start -i 容器
docker restart

docker container start -i 容器
docker container restart 容器
  • -i 交互式操作,让容器的标准输入保持打开

Attach(前台) 与 Detach(后台)

windows 下,attach 模式是不完整的,容器的输出会输出到本地 shell,但是在本地 shell 进行 ctrl+c 的话,只会即出本地 shell,容器仍然在运行。

所以在 windows 下,要停止容器,需要使用 docker stop 命令。

linux 和 max 则是完整的 attach 模式,只要容器是在前台运行,ctrl+c 就会结束容器

# 添加 --detach 或 -d 参数即可以 detach 模式运行,即后台运行
# 以后台模式运行时,容器的输出并不会输出到本地 shell
# 这种模块下本地 shell 不会被容器占用
docker run --detach -p 80:80 nginx

# 将容器转换为前台
# 这时本地 shell 被容器占用,输入 ctrl+c 可以停止容器(仅linux和mac)
docker attach 容器

# 如果容器在后台运行,可以执行以下命令来临时查看其输出日志
# -f 参数可以保持日志输出,直到 ctrl+c 退出
docker container logs 容器
docker container logs -f 容器

进入容器

# 将本地标准输入、输出和错误流附加到运行的容器
# 如果容器没有以交互操作方式启动(比如启动时使用 -d 参数),可使用此命令进入容器
# 进入后,在容器中执行 exit 容器将退出,输出是容器的输出,输入则输入给容器
# 注意,-d 相当于 --detach,与这里的 attach 是相反的模式
docker attach 容器

# 当容器是在后台运行时,可以使用如下命令在运行中的容器中执行命令
# 因为使用了 -it 选项并执行 sh,所以会保存 sh 的打开状态,相当于从后台模式回到了前台模式
# 注意,进入后,在容器中执行 exit 时只是退出了 `/bin/sh`,容器将仍然保持运行
docker exec -it 容器 /bin/sh

退出容器

# 容器自身的虚拟终端,退出容器
exit

# 容器自身的虚拟终端,不退出容器,保留在后台运行
ctrl+q+p

docker stop 容器 容器 容器 
docker kill 容器 容器 容器 
docker container stop 容器 容器 容器 

# 停止所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container stop $(docker container ls -aq)

查看容器列表

# 查看已经在运行的容器
docker ps -a 
docker container ls -a

# 列出所有容器的 ID
# 借助该命令,可以进行批量容器操作
# 例如 `docker container stop $(docker container ls -aq)`
# 例如 `docker container rm $(docker ps -aq)`
docker container ls -aq
  • -a 列出所有容器(包括未运行的容器)

在容器列表中,会包含容器的 ID 和容器的名称,ID 或名称都可以指代容器,而且在使用 ID 时,可以只输入 ID 的前 n 个字母

删除容器

# 如果容器正在运行,则需要带上 -f 参数
docker rm 容器 容器 容器 容器
docker container rm 容器 容器 容器 容器

# 删除所有停止运行的容器
docker container prune

# 删除所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container rm $(docker container ls -aq)

# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f

容器重命名

docker rename 容器 新的容器名

常用模式

docker container run -it busybox sh # 前台方式启动容器
exit # 退出容器

docker container run -d nginx # 后台运行
docker container exec -it 容器 sh # 取得交互

其他命令

# 查看容器详情,例如启动命令、镜像、连接的网络
docker container inspect 容器

数据卷(volume)

Data Volume

方式一:在 dockerfile 中可以通过 VOLUME ["路径"] 来指定数据卷,例如 VOLUME [ "/data" ]。这时,容器中向 /data 读写数据时将会同步到宿主机中(即使启动时没有指定 -v 选项)。宿主机中有专门的目录来存储其数据。如果启动容器时没有指定 -v 选项,则会自动创建一个名称随机的卷。注意,没有指定 -v 参数时,每次启动都会创建新的卷。

方式二:启动容器时,可以使用 -v 参数为容器中的某个路径指定数据卷,不管这个路径有没有使用 VOLUME 进行声明。-v 可以为数据卷指定一名字,格式为 -v name:/path

当然,VOLUME-v 结合使用也没问题,例如 -v local-data:/data,这时,容器中 /data 的数据就会存储到宿主机中的 local-data 数据卷中。

volume 命令

# 查看所有数据卷
docker volume ls

# 查看数据卷详情
# 详情中包括数据卷中宿主机中的挂载路径,如 `/var/lib/docker/volumes/xxxxx/_data`
docker volume inspect 名称

mysql 示例

在 mysql 中,就有一个数据卷 VOLUME [/var/lib/mysql],可以使用如下方式进行启动:docker run -d -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2

执行 docker volume inspect mysql-data,得到如下信息:

[
    {
        "CreatedAt": "2023-10-31T17:50:37+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
        "Name": "mysql-data",
        "Options": null,
        "Scope": "local"
    }
]

Bind Mount(直接挂载)

使用 -v 时,除也可以指定的一名称之外,还可以直接指定一个路径,例如:

docker run -d -v /root/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2

以上命令中,使用了 -v 宿主路径:容器内路径 的方式挂载数据,这时会自动将宿主机中的路径挂载到容器的指定路径上,这时,使用 docker volume ls 将无法查看到这个数据卷。但可以通过 docker container inspect 容器 命令来查看窗口详情,其中会有 “Mounts” 信息。

网络

docker 的网络(仅手动创建的网络)可以用容器名称进行 ping 操作

查看

# 查看当前的所有网络
docker network ls

# 查看某个网络的详情
# 可查看到网络的网段、网关地址、已接入的所有节点等
docker network inspect xxx

创建

# 创建一个网络
# -d 参数用于指定驱动,还可以配置子网、网关等参数
docker network create -d bridge xxxx

创建网络后,在启动容器时,可以使用 --network xxxx 参数来指定要连接的网络

手动创建的网络具有类似 dns 的功能,在连接的容器之间可以用容器名 ping 通过。注意,docker 自动创建的默认网络则没有这种功能。

连接

# 容器已经创建后,可以通过以下命令来为容器连接新的网络
docker network connect [网络名] [容器名]

# 断开连接
docker network disconnect [网络名] [容器名]

备忘

安装 ifconfig

yum provides ifconfig
yum whatprovides ifconfig
# 结果如下

net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
Repo        : base
Matched from:
Filename    : /sbin/ifconfig
# 表明 ifconfig 工具在 net-tools 包中

yum install net-tools

redis

docker pull redis:latest                                # 获取镜像
docker run -itd --name redis -p 6379:6379 redis:latest  # 启动容器(后台)
docker exec -it redis /bin/bash                         # 进入虚拟终端
redis-cli                                               # 启动 redis 客户端
  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值