2021-06-24

docker

​ Docker提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定的主机上同时运行多个容器。容器是轻量级的,包含运行应用程序所需的所有内容,因此不需要依赖主机上当前安装的内容。您可以轻松地在工作时共享容器,并确保与您共享的每个人都获得相同的容器,该容器以相同的方式工作。

使用docker可以做什么

  1. 快速、一致地交付应用程序

    Docker通过允许开发人员在标准化的环境中使用本地容器(这些容器为您提供应用程序和服务)来简化开发生命周期。容器非常适合于连续集成和连续交付的工作流。

  2. 快速部署和扩展

    Docker基于容器的平台允许高度可移植的工作负载。Docker容器可以在开发人员的本地笔记本电脑、数据中心的物理或虚拟机、云提供商或多种环境中运行。

    Docker的可移植性和轻量级特性还使得动态管理工作负载、根据业务需求以近乎实时的方式扩展或删除应用程序和服务变得非常容易。

  3. 在同一硬件上运行更多工作负载

    Docker重量轻,速度快。它为基于虚拟机管理程序提供了一个可行的、经济高效的替代方案,因此您可以使用更多的计算能力来实现业务目标。Docker非常适合高密度环境和中小型部署,在这些环境中,您需要用更少的资源做更多的工作。

docker架构

​​在这里插入图片描述

​ Docker使用client-server体系结构。The Docker client 与 the Docker daemon通信,后者负责构建、运行和分发Docker containers。The Docker client 与 the Docker daemon可以在同一系统上运行,也可以将The Docker client 连接到远程的the Docker daemon。The Docker client 与 the Docker daemon使用REST API 通过UNIX套接字或网络接口进行通信。其中一个 Docker client为Docker Compose,它允许您处理由一组容器组成的应用程序。

  1. The Docker daemon

    ​ 侦听Docker API请求并管理Docker Objects,如images, containers, networks, and volumes。其还可以与其他Docker daemon一起管理Docker服务。

  2. The Docker client

    ​ 是许多Docker用户与Docker交互的主要方式。当您使用诸如docker run之类的命令时, Docker client将这些命令发送给docker,由docker执行这些命令。 Docker client可以与多个Docker daemon通信。

  3. Docker registries

    ​ 为存储docker Images的,docker hub就是一个公共的任何人都可以用的存储docker images的一个仓库,默认情况下,docker都从docker hub上拉去镜像。当然我们也可以创建一个自己的仓库。

  4. Docker objects

    • Images(镜像)

      ​ 为创建一个docker 容器的一个只读的模板,通常一个镜像是基于另外一个对象,并做了一些自定义创建的,比如我们自己开发的java程序,我们需要将其打包为一个镜像,则需要基于jdk做一次镜像构建,让他运行我们的java程序。

    • Containers(容器)

      ​ 容器为一个运行的镜像实例,可以使用对应的docker api 进行容器的创建、删除、启动等等操作。默认情况下,容器与其他容器及其主机的隔离相对较好。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。

docker安装与卸载

  1. docker支持的环境

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wNjQ9Cpj-1624516368289)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210526143417221.png)]

  2. docker在线安装

    在新主机上首次安装 Docker EC 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。

    # step 1:安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2;

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2

    # Step 2: 添加软件源信息

    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    或者

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

    或者

    sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

    # Step 3: 更新并安装 Docker-CE

    sudo yum -y install docker-ce

    # Step 4: 开启Docker服务

    sudo service docker start

    #Step 5: 检查 Docker 成功否

    docker version

    #Step 6: 配置加速器

    vim /etc/docker/daemon.json //如果没有该文件,请新建。

    将这段内容复制进daemon.json

    {

    “registry-mirrors”: [“https://kdu301wo.mirror.aliyuncs.com”] #阿里云加速

    }

    systemctl daemon-reload 重新加载配置

    service docker restart 重启docker服务

    sudo systemctl enable docker 设置docker开机自启动

  3. docker离线安装

    # step 1:复制docker-ce-19.03.9.tgz安装文件至服务器,并使用解压命令进行解压:tar xzvf docker-ce-19.03.9.tgz

    # step 2:拷贝解压后docker文件下的所有文件至 /usr/bin/文件下: cp docker/* /usr/bin/

    # step 3:编辑docker.service文件内容为下面的内容:vim /etc/systemd/system/docker.service

    [Unit]
    
    Description=Docker Application Container Engine
    
    Documentation=https://docs.docker.com
    
    After=network-online.target firewalld.service
    
    Wants=network-online.target
    
     
    
    [Service]
    
    Type=notify
    
    ExecStart=/usr/bin/dockerd
    
    ExecReload=/bin/kill -s HUP $MAINPID
    
    LimitNOFILE=infinity
    
    LimitNPROC=infinity
    
    TimeoutStartSec=0
    
    Delegate=yes
    
    KillMode=process
    
    Restart=on-failure
    
    StartLimitBurst=3
    
    StartLimitInterval=60s
    
     
    
    [Install]
    
    WantedBy=multi-user.target
    

    # step 4:修改权限docker.service文件的权限:chmod +x /etc/systemd/system/docker.service

    # step 5:重新加载配置:systemctl daemon-reload

    # step 6:设置开机自启:systemctl enable docker.service

    # step 7:启动docker: systemctl start docker

    # step 8:运行docker version 查看docker的版本,验证docker是否安装成功

  4. docker卸载

    sudo yum remove docker
    docker-client
    docker-client-latest
    docker-common
    docker-latest
    docker-latest-logrotate
    docker-logrotate
    docker-engine

docker常用命令介绍

参考地址: https://docs.docker.com/engine/reference/run/

  1. 拉取镜像

    docker pull 镜像名称;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWXSMrgc-1624516368294)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210607193724146.png)]

  2. 查询所有的容器

    docker ps -a

在这里插入图片描述

  1. 查询启动的容器

    docker ps

在这里插入图片描述

  1. 启动容器

    docker start 容器名称/容器id

    在这里插入图片描述

  2. 停止容器

    docker stop 容器名称/容器id

在这里插入图片描述

  1. 停止所有的容器

    docker stop $(docker ps -aq)

  2. 重启容器

    docker restart 容器名称/容器id

  3. 删除容器

    docker rm 容器名称/容器id

  4. 删除所有的容器

    docker rm $(docker ps -aq)

  5. 进入容器

    docker exec -it 容器名称/容器id /bin/bash

  6. 查看容器运行日志

    docker logs -f 容器名称/容器id //查看docker 容器日志、从第一行读

    或者

    docker logs -f 容器名称/容器id --tail 行号 //查看docker 容器日志,从最后1000行开始读

  7. 查询镜像

    docker images

  8. 删除镜像

    docker rmi 镜像名称

  9. 删除所有镜像

    docker rmi $(docker images -q)

  10. docker创建容器示例

    docker run

    例如: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7.29

    run命令的常用参数介绍(参考地址:https://docs.docker.com/engine/reference/commandline/run/)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 根据dockerFile构建镜像

    docker build [OPTIONS] PATH | URL | -

    build命名的参考地址:https://docs.docker.com/engine/reference/commandline/build/

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    举例: 使用当前目录的 Dockerfile 创建镜像,标签为 archive-moudle:1.0。

    docker build -t archive-module:1.0 .

  2. 容器与宿主机之间的文件拷贝

    (1)容器至宿主机: docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

    例如: docker cp redis:/var/lib/redis /opt/redis

    (2)宿主机至容器:docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

其他

  1. 目录挂载:运行某容器示例,对于映射到宿主机的配置文件,在启动容器时,提前在宿主机上进行创建,如果映射的配置文件不存在,会导致启动失败;首次创建容器时,可能不知道对应的配置文件中有哪些信息,可以选择在创建容器实例时,不进行文件的映射,启动成功后,使用docker cp命名将配置文件拷贝至宿主机在进行文件映射;

  2. 当需要在容器的配置文件中需要使用到文件路径时,配置的一定是容器内的路径,不是映射到宿主机的路径;如mysql,默认将数据存储在var/lib/mysql/data,我们将其映射到宿主机的/home/mysql/data,此时mysql的my.cnf里面配置的数据存储路径应该是var/lib/mysql/data

  3. 对于准备创建的容器,如何知道他的运行参数有哪些?如:mysql端口为3306

    (1)自身的配置文件,如mysql的运行时的数据存储目录,日志目录,端口等都在my.cnf中;

    (2)访问dockerhub(https://registry.hub.docker.com/),查看关于要使用的镜像的说明

    在这里插入图片描述
    在这里插入图片描述

docker-compose

 docker-compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

docker-compose的安装

  1. 在线安装

    #step 1 :安装docker-compose

    curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose

    #step 2 :设置用户权限

    chmod +x /usr/local/bin/docker-compose

    #step 3 :查看docker-compose是否安装成功

    ​ docker-compose --version

  2. 离线安装

    (1)进入下面的网址下载对应版本的docker-compose文件:

    https://github.com/docker/compose/releases

    (2)将下载的docker-compose文件上传到 /usr/local/bin/ 文件夹下并将其重命名为docker-compose;

    (3)修改此文件的权限,增加可执行:chmod +x /usr/local/bin/docker-compose

    (4)运行 docker-compose --version

docker-compose.yml使用示例

version: '3'
services:
  mysql:
    hostname: mysql
    image: mysql:5.7.29   #指定容器运行的镜像
    # network_mode: "host" # 设置网络模式:network_mode: "bridge",network_mode: "host"
    container_name: mysql # 指定容器名称,如果不设置此参数,则由系统自动生成
    restart: always # 设置容器自启模式
    environment:  #环境变量设置
      - TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
      - MYSQL_ROOT_PASSWORD=root # 设置root密码
      - MYSQL_USER='root'
      - MYSQL_PASS='ruianxin@123'
    volumes:  #将主机的数据卷或着文件挂载到容器里
       - /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
       - ./mysql/data:/var/lib/mysql/data # 映射数据库保存目录到宿主机,防止数据丢失
       - ./mysql/my.cnf:/etc/mysql/my.cnf # 映射数据库配置文件
    ports:
        - 3306:3306

  redis:
    container_name: redis
    image: redis:6.0-rc3
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
      - ./redis/data:/data
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
    environment:      # -e  环境变量
      - TZ=Asia/Shanghai     # 设置时区为 上海
    ports:
      - 6379:6379
    command: ["redis-server","/usr/local/etc/redis/redis.conf"] #容器启动时运行的命令

  nginx:
    container_name: nginx
    restart: always
    image: nginx:1.17.10
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 8090:80
      - 443:443
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/log:/var/log/nginx
      - ./nginx/web:/usr/share/nginx/html
     # - ./nginx/ssl:/etc/nginx/ssl

docker-compose.yml的版式介绍

  1. 版式参考地址:https://docs.docker.com/compose/compose-file/compose-file-v3/

  2. 常用的版式指令截图介绍:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

docker-compose常用命令介绍

参考地址: https://docs.docker.com/compose/reference/

  1. docker-compose up [option]

    构建、(重新)创建,启动服务;

    (1)docker-compose up -d //表示在后台运行容器;(这个常用,在yml所在目录运行,构建或启动yml文件中配置的容器服务)

    (2)docker-compsoe up //运行容器

  2. docker-compose stop //停止正在运行的容器,可通过docker-compose start 启动

  3. docker-compose stop 容器名称

  4. docker-compose start //启动容器

  5. docker-compose start 容器名称 //启动容器

  6. docker-compose restart // 重启;

  7. docker-compose restart 容器名称 // 重启;

  8. docker-compose rm //删除停止的容器

  9. docker-compose rm 容器名称 //删除容器

  10. docker-compose ps //查看运行容器

dockerFile

什么是 DockerFile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

名词介绍

  1. 上下文目录/上下文路径: 是指 docker 在构建镜像,想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。(上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢)

dockerFile指令

参考地址:https://docs.docker.com/engine/reference/builder/

docker指令

  1. FROM

    当前镜像是基于哪个镜像进行构建

在这里插入图片描述

  1. RUN

    构建镜像时需要运行的命令

在这里插入图片描述

  1. EXPOSE

    当前容器对外暴露的端口号,例如mysql的3306;

    示例:EXPOSE 80/udp 或者EXPOSE 8080/TCP

    说明:没有指定协议时,默认为TCP

    在这里插入图片描述

  2. WORKDIR

    指定在创建容器后,终端默认登录进容器时的工作目录;

  3. ENV

    设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

    示例: 使用PORT指定端口为8090 ——ENV PORT=8090 或者ENV PORT 8090

    可以使用ENV PORT=8090 PATH=/home/docker 实现一次指定多个变量,当然也可以写多个ENV指令

    后续使用: + 变 量 名 例 如 : +变量名 例如: +PORT

    在这里插入图片描述

  4. COPY

    复制指令,从上下文目录中复制文件或者目录到容器里指定路径

    示例: COPY home/docker/a.text /var/lib

  5. ADD

    ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似

    ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

    ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

  6. VOLUME

    在这里插入图片描述

  7. CMD

    类似于 RUN 指令,用于运行程序(为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。),但二者运行的时间点不同:

    CMD 在docker run 时运行。

    RUN 是在 docker build。

    示例:CMD [“java”,"-jar",“sys_module.jar”]

    注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

    在这里插入图片描述

dockerFile的使用—demo

# 环境
FROM  williamyeh/java8:latest

# 拷贝jar
ADD archive-module-1.0.0.jar /data/sysplat-boot/java/archive-module-1.0.0.jar
ADD logback-spring.xml /data/sysplat-boot/java/config/logback-spring.xml
ADD application-dm.yml /data/sysplat-boot/java/config/application-dm.yml
# 设置暴露的端口号
#EXPOSE 8761
# 执行命令
ENTRYPOINT ["java","-Xms256m", "-Xmx1024m","-Xss256m", "-jar", "-Dlogging.config=/data/sysplat-boot/java/config/logback-spring.xml","-Dspring.config.location=/data/sysplat-boot/java/config/application-dm.yml","/data/sysplat-boot/java/archive-module-1.0.0.jar"]

(1) 使用docker build 进行打包

docker build -t archive-module:1.0 .
在这里插入图片描述

(2)使用docker images 查看镜像,此时新增的镜像文件包括from的基础进行以及我们自己打包的镜像

在这里插入图片描述

镜像打包完成后,就可以进行常规的镜像操作,包括镜像上传、运行容器等。

(3)运行容器

docker run --name=archive-module -d -p 8080:8080 archive-module:1.0

docker镜像上传私服

  1. 对于docker私服,首先要准备好docker私服的端口,在进行docker部署的时候,提前将端口进行映射;docker默认使用的https请求,但是我们使用的nexus是http请求,可以在docker()将我们的地址加入安全配置中,采用http请求。

    执行 vim /etc/docker/daemon.json 修改对应的文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utEQWXVS-1624516368334)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210614173611039.png)]

​ 如果私服需要登录,则使用docker login 命名登录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GhGzfiMN-1624516368335)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210614175722602.png)]

  1. 对镜像进行tag(标记本地镜像,将其归入某一仓库),使用命令:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

    示例: docker tag archive-module:1.0 192.168.0.223:5002/v1/archive-moudle:latest

在这里插入图片描述

  1. 上传镜像

    在这里插入图片描述

从docker私服拉取镜像并运行

  1. 拉取镜像

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXQ4ljy0-1624516368337)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210614175353132.png)]

  2. 运行容器

springboot项目打包成docker镜像

方式一:直接使用dockerfile文件

  1. 创建dockerfile文件

    在这里插入图片描述

  2. 执行docker build命令

    在上下文目录处执行docker build命令进行镜像构建

    docker build -t archive-modu

在这里插入图片描述

方式二:使用maven插件

docker管理工具Portainer

Portainer官方文档地址:(https://documentation.portainer.io/)

demo地址:http://demo.portainer.io/#!/1/docker/host 账户:admin 密码:tryportainer

安装Portainer

(1)docker-compose.yml文件

portainer:
    container_name: manage
    image: portainer/portainer-ce:alpine
    restart: always
    ports:
      - 9001:9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer_data:/data

(2)访问ip+端口(首次登录需要注册账户,给admin账户设置密码)
在这里插入图片描述

(3)版本不一致可能存在差异,选择要管理docker还是k8s

在这里插入图片描述

在这里插入图片描述

备注说明:——新版本的发布将在portainer/portainer-ce上
在这里插入图片描述

使用简单介绍

(1)docker的基本情況

在这里插入图片描述

(2)镜像仓库

对我们的镜像仓库进行管理——添加、修改、删除;在镜像管理模块,我们可以指定从在此处配置的镜像仓库中拉取镜像。

在这里插入图片描述

点击添加按钮,进行镜像仓库的配置阶段,包括名称、url地址,如果有账号密码设置,填写账号、密码,配置完成。
在这里插入图片描述

(3)镜像管理

展示当前容器内的镜像列表,提供对镜像的基本操作——增、删、导入、导出等功能

在这里插入图片描述
在这里插入图片描述

(4)容器管理

展示当前docker中所有的容器,提供对容器的操作——启动、停止、重启、移除等
在这里插入图片描述

点击容器,可以查看当前容器的详细情况:容器创建时间、容器网络、容器运行日志、容器资源的占用情况等,同时可对当前容器进行操作——启动、停止、重启等等。

在这里插入图片描述

容器日志:
在这里插入图片描述

资源占用情况:

在这里插入图片描述

(5)配置私服地址,上传docker镜像

  1. nexus配置私服信息

在这里插入图片描述

  1. Portainer中配置私服地址

在这里插入图片描述

  1. 进入镜像页面,点击要上传到私服的镜像

在这里插入图片描述

  1. 进行tag

在这里插入图片描述

  1. 上传私服

在这里插入图片描述

nexus作为docker仓库

docker安装私服nexus

version: '3'
services:
  nexus3:
    image: "sonatype/nexus3"
    container_name: nexus3
    restart: always
    ports:
      - "8181:8081"
      - "5001:5001"
      - "5002:5002"   #映射docker私服需要使用的端口
    environment:
      - CONTEXT_PATH=/
      - TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
    volumes:
      - ./nexus/nexus-data:/nexus-data

注意事项:

(1)如果启动报错,可能是因为挂载的目录没有权限,对挂载目录进行权限设置后,重新启动,则可以启动成功。

(2)用户的默认用户为admin,密码存储在挂载出来的数据目录的admin.password文件中,登录后,可根据提示进行密码的修改。

(3)对于docker私服,首先要准备好docker私服的端口,在进行docker部署的时候,提前将端口进行映射;docker默认使用的https请求,但是我们使用的nexus是http请求,可以在docker方将我们的地址加入安全配置中,采用http请求。

执行 vim /etc/docker/daemon.json 修改对应的文件

使用nexus配置docker私服

  1. 点击新建

在这里插入图片描述

  1. 选择仓库类型

    项目具体说明
    hosted本地存储。像官方仓库一样提供本地私库功能
    proxy提供代理其它仓库的类型
    group组类型,能够组合多个仓库为一个地址提供服务

在这里插入图片描述
在这里插入图片描述

  1. 填写信息

    (1)hosted类型的配置实例

在这里插入图片描述
在这里插入图片描述

(2)proxy配置实例
在这里插入图片描述
在这里插入图片描述

(3)group实例
在这里插入图片描述
在这里插入图片描述

微服务使用docker部署,服务注册时,ip、端口问题

Docker 资源汇总

Docker 资源

  • Docker 官方主页: https://www.docker.com
  • Docker 官方博客: https://blog.docker.com/
  • Docker 官方文档: https://docs.docker.com/
  • Docker Store: https://store.docker.com
  • Docker Cloud: https://cloud.docker.com
  • Docker Hub: https://hub.docker.com
  • Docker 的源代码仓库: https://github.com/moby/moby
  • Docker 发布版本历史: https://docs.docker.com/release-notes/
  • Docker 常见问题: https://docs.docker.com/engine/faq/
  • Docker 远端应用 API: https://docs.docker.com/develop/sdk/

Docker 国内镜像

阿里云的加速器:https://help.aliyun.com/document_detail/60750.html

网易加速器:http://hub-mirror.c.163.com

官方中国加速器:https://registry.docker-cn.com

ustc 的镜像:https://docker.mirrors.ustc.edu.cn

daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值