docker2018整理资料

Docker进阶

 

Docker相关网站:

         https://hub.docker.com              官方镜像网站

        

         https://download.docker.com/linux/centos/   docker-yum

 

   https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/   清华大学开源镜像站

 

  • Dokcer简介

 

docker容器发行版本:

 

Moby:  继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品

docker-ce:  docker公司维护的开源项目,是一个基于moby项目的免费的容器产品

docker-ee:  docker公司维护的闭源产品,是docker公司的商业产品

 

  • 功能目录章节

docker简介(一)

功能目录章节(二)

docker-ce版本安装方法(三)

Docker操作命令(四)

         docker容器命令格式说明

         docker容器命令选项参数说明

         docker容器常用子命令使用方法

                  1. 将docker容器制作成一个新镜像 (命令docker commit

                   2. 修改docker容器镜像名称或标签信息(命令docker tag

                   3. 删除docker镜像(命令docker rmi

                   4. 查看docker本地镜像(命令docker images

                   5. 搜索docker hub公共镜像资源(命令docker search

                   6. 从docker hub公网下载docker容器镜像(命令docker pull

                   7. 查看docker镜像内容参数信息(命令docker inspect

                   8. 登录docker hub(命令docker login

                   9. 上传自制docker镜像到docker hub网上(命令docker push

                   10. 退出docker hub登录(命令docker logout

                   11. 打包本地docker镜像导出成文件(命令docker save

                   12. 将打包的docker镜像文件导入到本地镜像仓库(命令docker load

                   

         Docker 容器相关命令使用

                    1. 调用docker镜像运行docker容器(命令docker run

                         2. 进入到已运行docker容器交互命令行页面(命令docker exec

Docker操作命令(五)

         关于docker容器的四种网络模式说明

         查看docker容器默认的网络模式(命令 docker network ls

                    1. Docker容器使用host模式方法

                    2. Docker容器使用none模式方法

                    3. Docker容器使用默认bridge网络模式方法

                                     . 使用bridge模式发布docker容器端口到公网访问

                                     . 使用bridge网络模式但是修改bridge网络模式默认IP网段

                                    . 为docker容器自建新的bridge网桥划分自定义网络用于容器网络

                                           . 新建docker容器网桥

                    4. Docker容器使用container网络模式方法

                                               . 创建docker容器时,主动配置ip地址,不选择自动分配

                              5. docker程序远程管理其他物理主机docker程序

                             6. 设置docker容器默认启动时候支持外网tcp远程以及本地使用

 

Docker容器存储篇(六)

         应用场景说明

         实现同一台物理主机上两台web docker容器共享同一份代码文件

         多个磁盘目录需要挂载到docker容器系统

         指定跟从指定的机器挂载相同

         查看docker容器镜像详细信息格式

 

         搭建docker私有仓库(七)

                   方式一搭建服务器本地私有仓库(无web管理页面)

         客户端往私有docker本地仓库中上传或下载方法

         方式二使用docker容器搭建私有仓库(web页面管理后台)

 

         Docker系统资源限制(八)

         查看docker容器性能资源消耗

         查看docker容器中的运行程序

         容器资源限制参数

         限制docker容器的使用内存最大值

         限制docker容器的可使用CPU核心数

                   明确指定docker容器只运行使用本地物理主机的第几核CPU

                   按照权重进行CPU资源分配

                  

DockerFile制作容器镜像文件参数详解(九)

         Dockerfile的基本结构

         Dockerfile文件常用指令说明

         Dockerfile文件常用指令语法详解

         制作容器镜像

Docker排错篇(十)

         docker容器开机启动项无法开机启动时

 

 

 

Docker-CE的安装方法(三)

首先条件:docker-CE版本只能在CentOS7以上版本安装

cd  /etc/yum.repos.d

 

wget https://download.docker.com/linux/centos/docker-ce.repo

yum install -y epel-release

-----------------------------------------------------------------

由于docker hub官方镜像站点在国外,国内访问速度较低,所以yum源调用国外docker hub会相对速度较低时,可以考虑更换国内其他docker hub的站点,如清华大学

 

vim /etc/yum.repos.d/docker-ce.repo

 

:%s#download.docker.com#mirror.tuna.tsinghua.edu.cn/docker-ce#g

 

https://mirror.tuna.tsinghua.edu.cn/docker-ce/    //清华大学

 

 

    ln -sv /data_disk/vdb1/docker_run   /var/lib/docker

千万不要把docker_run 或 /var/lib/docker目录权限改动,容器会出现各种故障

    可以将docker程序的运行目录存放到挂载磁盘中

 

yum  -y install docker-ce

 

 

 

 

  • Docker操作命令:

 

格式:   docker   [选项]   命令

 

[选项] Options: 如下:

        

--config 路径: 指定客户端配置文件的配置字符串位置(默认 /root/.docker )

-D  --debug:   调试启用调试模式,输出debug信息

-H  --host list:  主机列表要连接的守护进程套接字

-l  --log-level string:  设置日志级别(debug,info,warn,error,fatal”)(默认为“info”)

-V  --version:打印版本信息并退出

--tlscacert string :由该CA签名的信任证书(默认值为“/root/.docker/ca.pem”)

--tlscert string  : TLS证书文件的路径(默认为“/root/.docker/cert.pem”

--tlskey string  : TLS密钥文件的路径(默认为“/root/.docker/key.pem”)

 

 

 

 

[管理命令] Management Commands:

Builder     管理构建

Config      管理Docker配置

Container   管理容器

Engine         管理Docker引擎

Image      管理镜像

Network     管理网络

Node            管理群集节点

Plugin      管理插件

Secret          管理docker密码

Service        管理服务

Stack       管理Docker堆栈

Swarm         管理群集

System        管理Docker系统

Trust            管理对Docker映像的信任

Volume        管理卷

 

 

 

 

[命令] Commands 如下:

Attach     将本地标准输入、输出和错误流附加到正在运行的容器

Build           从Dockerfile构建图像

Commit      将容器做成一个新镜像

Cp                在容器和本地文件系统之间复制文件/文件夹

Create     创建新容器

Diff              检查对容器文件系统上文件或目录的更改

Events        从服务器获取实时事件

Exec      在正在运行的容器中运行命令

Export       将容器的文件系统导出为tar存档

History       显示镜像的历史记录

Images       列表出镜像

Import        从tarball(源码包)导入内容以创建文件系统映像

Info             显示系统范围的信息

Inspect    返回Docker对象的低级信息

Kill               杀死一个或多个正在运行的容器

Load            将其他docker服务器save打爆的docker镜像文件加载到当前服务器

Login           登录Docker Hub

Logout        注册登录

Logs            获取容器的日志

Pause         暂停一个或多个容器中的所有进程

Port            列出容器的端口映射或特定映射

Ps                列表容器

Pull              docker hub处中提取镜像或存储库

Push      将镜像或存储库推送到docker hub

Rename     重命名容器

Restart      重新启动一个或多个容器

rm          删除一个或多个容器

rmi              删除一个或多个镜像

run              在新容器中运行命令

save            将一个或多个镜像使用tar打包存档成文件拷贝到其他服务器上使用  load解压

search     Docker Hub中搜索镜像

start                     启动一个或多个停止的容器

stop            停止一个或多个正在运行的容器

stats                    显示容器资源使用统计信息的实时流

tag              创建引用源镜像的修改目标镜像标签内容

top              显示容器的运行进程

unpause     取消暂停一个或多个容器中的所有进程

update       更新一个或多个容器的配置

version       显示Docker版本信息

wait            阻止,直到一个或多个容器停止,然后输出其退出代码

 

 

 

 

docker 容器常用子命令使用方法:

 

1将docker容器做一个新的镜像  docker commit  (自制docker镜像 docker commit)

        

命令格式:

         Docker commit  --help   //可以查看docker commit子命令的使用参数

         -a  名称 :   设置镜像作者名称

    -c  list     :   设置镜像运行的容器默认执行命令 -c [“/bin/httpd”,”-f”,”-h” /data/html]

         -m 文字:    提交时的说明文字

         -p       :       在commit时,将容器暂停,防止在做镜像时容器程序有新数据产生

         命令使用格式:

                   Docker commit  [选项]  做成镜像的容器名  [仓库库:标签名]

 

docker commit -p -a "space.wu"  nginx1-test1  nginx:1.14

将正在运行的容器nginx1-test1 制作成镜像,存放在仓库名为nginx,标签1.14

 

 

 

 

 

2. 修改docker容器镜像名称或标签信息

 

命令格式:

         Docker tag 源镜像名[:标签]  目标镜像[:标签]

Docker tag 源镜像名[:标签]  仓库名/新镜名[:标签]

docker tag   nginx:1.14      space.wu/nginx:1.14.2

 

Docker tag  源镜像id  仓库名/新镜名[:标签]

docker tag  2c80c730f6d7  space/nginx:1.14.2

 

 

 

 

 

3. 删除docker镜像

 

命令格式:  (docker rm 是删除容器   docker rmi 删除镜像)

         Docker rmi   [选项]    镜像id或 [仓库名/镜像名:标签]

[选项:]

         -f :                 强制删除图像 

         --no-prune  不删除未标记的父级

 

 

 

 

4.  查看docker本地镜像

        

         命令格式:

                   Docker images  [选项]     //指定查看全部镜像

                   Docker images  [选项]   [仓库名/镜像名:标签]     //查看指定的镜像

 

         [选项]:

                   -a  --all :     显示所有图像(默认隐藏中间图像)

                   --digests :   查看摘要信息

        

 

 

 

5.  搜索docker hub公共镜像资源

命令格式:

                   Docker search  [选项]   镜像名称信息

--no-trunc                不截断输出(输出镜像描述的详细信息)

 --limit 数量     设置最大搜索数量(默认最多25条)

默认docker search 搜索内容会显示25条,使用 –limit 5 让其只线上5条

在镜像描述信息中,一般无法完全线上,使用 --no-trunc 线上显示详细信息

 

 

 

 

6.  从docker hub公网下载docker容器镜像

命令格式:

                   Docker pull   镜像名称[:tag标签]

[选项:]

         -a      下载存储库中的所有标记图像

使用  docker search 命令在docker hub上搜索需要下载的容器镜像

然后使用  docker pull 容器镜像   从docker hub上下载需要的镜像

 

 

 

 

7.  查看docker镜像内容参数信息

命令格式

                   Docker  inspect  [选项]  镜像名:标签 或 镜像id

 

 

 

 

8.  登录docker hub

命令格式

                   Docker login  [选项]   [docker hub Server服务器]

[选项]

            -u  帐号  : 使用-u 参数,输入帐号

            -p  密码  : 使用-p参数,输入密码 (默认不推荐使用,这样会暴露密码)

            Server    :  如果是自建或者其他第三方docker hub服务器时使用

 

 

 

 

9.  上传自制docker镜像到docker hub网上

命令格式:

                   Docker push  [选项镜像名[:标签]

[选项]

         --disable-content-trust 跳过镜像签名(默认为真)

cloud.docker.com  docker hub网站注册一个帐号,默认仓库名等于帐号名称无法修改

,然后输入space.wu 镜像名称   第三列为标签信息

 

上市与私人的区别在于,如果是私人则需要个人登录帐号才能下载,公共则对所有人开放

 

镜像仓库建立好以后,需要上传的镜像信息必须与仓库信息对应,如镜像为

969226301/space.wu   nginx:1.14.2  这可以成功

使用push上传一个与969226301/space.wu   nginx:1.14.2仓库格式不一致的镜像失败

使用docker tag命令修改需要上传docker hub镜像信息,使其信息与docker hub仓库信息一致,然后使用docker push成功完成上传;

 

 

 

 

10.  退出docker hub登录

命令格式:

                   Docker logout  [docker hub Server服务器]

 

 

 

 

 

11.  打包本地docker镜像存储为文件格式用于迁移到其他docker主机进行部署

命令格式:

                   Docker save  -o  打包的文件.gz  镜像名1   [镜像2]

[选项]

           -o  --output  文件路径   :  指定打包过后的docker镜像文件存放路径  

docker save -o /root/docker.gz   space.wu/nginx:1.14.2  mysql:5.6

将docker 镜像 space.wu/nginx:1.14.2   和  mysql:5.6 两个镜像一起打包存到一个docker.gz的文件存储到/root目录下

 

 

 

 

12.  将其他docker应用服务器的镜像打包文件附加到新的docker应用服务器

命令格式:

                   Docker  load  -i  导入的镜像打包文件.gz 

[选项]

           -i  --input  文件路径  :  指定导入docker镜像的包文件

           -q  --quiet  :  安静模式导入,不输出导入信息          

docker load -i /root/docker.gz

在一台新的服务器,使用docker load 命令解压并且导入其他docker的镜像文件

 

 

 

 

 

Docker 容器相关命令使用:

 

1调用docker镜像运行docker容器

命令格式:

                   Docker run  [选项]  使的镜像   [执行命令]

[选项]

--privileged=true使用该参数,container内的root拥有真正的root权限

-t      --tty   运行docker容器时,分配一个tty进程,用于用户登录交互

-i   --interactive :  即使容器并未连接,也保持stdin(标准输入打开)     

--name 容器名  :  为运行的容器设置一个名称

-d :  运行docker容器时,docker容器不占用前端交互窗口后台运行

--rm  : 临时运行docker容器时使用该参数,当docker容器stop关闭后,会自动删除docker容器

-v  :  将本地磁盘目录挂载到容器中   -v  本地磁盘路径:对应容器目录

-u  :  指定容器中使用已存在的用户身份

-P(大写P) : 自动发布容器对外公开的所有端口到随机端口

-p(小写p:  [物理主机ip:]端口:[容器ip:]端口 指定映射本地端口映射到容器主机

                             默认ip可以不填写,直接写映射的端口即可

-h :             设置新建的docker容器系统主机名称,非容器名

--network 网桥名 :  指定建立的docker容器连接的网桥,不指定为默认docker0网桥

--ip  ip地址明确手动指定docker容器ipip必须与docker所处网络模式网段一致,

                             并且保证该ip与同网段容器中未被使用的ip,(该参数必须在自建的docker

                             网桥上使用,默认docker0网桥无法使用自定义ip

-m  限制内存  :  限制容器最大使用内存量,单位分别为m为兆  g为千兆

--cpus 核心数  :    限制容器最大可使用CPU核心数,如本地物理主机为4核8G,服务器

                                        CPU性能消耗则可以达到百分之400,1核表示100%;

 

 

 

 

2.  进入到已运行docker容器交互命令行页面

 

方法一: docker exec : 在正在运行的容器中运行命  

         docker exec  [选项]   运行命令

  [选项]

-t      --tty   运行docker容器时,分配一个tty进程,用于用户登录交互

-i   --interactive :  即使容器并未连接,也保持stdin(标准输入打开)     

-u  :  指定容器中使用已存在的用户身份

-w     :  指定进入容器命令行交互界面的当前所在目录

docker  exec   -it   web_server  /bin/sh

关键字                      容器名      需要在容器中运行的命令

利用docker exec功能,在容器中新增一个tty和连接,并且启动一个sh命令行交互

 

 

 

 

 

方法二:  进入一个自带bash环境的容器内部命令行交互页面

命令格式:

         docker inspect --format "{{.State.Pid}}"  sql_server

         docker inspect  命令可用于查看容器详细信息

         --format "{{.State.Pid}}" 通过给定的模板格式化输出容器State.pid

         sql_server  容器名称

         nsenter --target  26750  --mount --uts --ipc --net --pid

         nsenter  使用其他进程的命名空间运行程序(命令工具)

         --target   指定获取命名空间的目标进程

         -m  --mount   输入装载命名空间

    -u  --uts       输入uts名称空间(主机名等)

         -i   --ipc       输入System v IPC命名空间

         -n  --net       输入网络命名空间

         -p  --pid       输入PID命名空间

         -w  --wd       设置工作目录

使用nsenter工具,指定sql_server容器的id进入容器的命令行交互式操作页面

 

 

 

 

每次输入命令比较麻烦,可通过脚本完成:

vim /bin/indocker.sh

#!/bin/bash

CNAME=$1

CPID=`docker inspect --format "{{.State.Pid}}" $CNAME`

nsenter --target $CPID --mount --uts --ipc --net --pid

 

 

 

 

 

 

Docker容器网络篇(五):

关于docker容器的四种网络模式说明:(除host模式外,其他3中为docker容器默认网络)

 

     host模式: 

相当于Vmware中的桥接模式,与宿主机在同一个网络中, 但没有独立IP地址,相当于与物理主机共用网卡;

 

    none模式:

        该模式关闭了容器的网络功能,一般用于跑批量处理任务时;

 

container模式:

此模式与host网络模式类似,host网络模式是网物理主机与docker容器主机共享使用同一个ip,而container模式则是让两个或者多个docker容器共享使用同一个网卡和ip;

   

    bridge模式:(docker容器默认模式)

系统在安装并且运行的docker容器以后,默认在物理服务器运行ifconfig命令查看本地网卡信息时,会出现一个额外新增的docker0网桥,该网桥类似于一个网络交换机,所有新建的docker容器在为明确使用—network设置网络模式时,默认都是直接接入该网络,然后默认分配的ip为docker0网卡的ip段;172.17.0.1/16

 

 

 

 

查看docker容器默认的网络模式:

docker network ls

 

 

 

  1. Docker容器使用host模式方法:

 查看当前云主机服务器公网上网ip地址作为外网物理主机时使用,然后使用ifconfig命令查看当前物理主机本地ip地址;

 

 

         查看物理主机本地网络状态,然后使用docker命令运行docker容器

命令格式:

运行docke 容器关键字  --name docker容器名  -it  --network=设置为host网络模式 映射本地80端口到容器

docker run --name  nginx_host_mode -it  --network=host -p 80:80   space.wu/nginx:1.14.2

 

 

 

运行完成容器后,在外网访问云服务器公网ip 80端口后成功打开docker容器内部网站

并且docker容器也输出了访问日志;

 

 

 

由于docker容器运行后是交互式页面,使用ctrl + c 退出后,容器自动关闭了,导致再次访问云主机外网ip 80流量无法转发到docker容器,网站无法打开;

 

 

使用docker start 命令运行创建的host网络模式的docker虚拟机,然后查看端口映射关系发现,访问物理主机外网80端口的已经成功接收;

 

 

 

使用docker exec -it 容器名 /bin/sh  运行容器的一个sh环境,然后进入到容器内部,使用ifconfig命令查看容器ip信息与物理主机一致;

 

 

 

  1. Docker容器使用none模式方法:

         docker run --name nginx_none_mode -it --network=none space.wu/nginx:1.14.2

         --network=none 模式定义nginx_none_mode模式为无网络模式;

 

        

 

 

 

         3.Docker容器使用默认bridge网络模式方法:

         Docker  run  -it  --name  nginx_bridge_mode  space.wu/nginx:1.14.2

         运行一台虚拟机,默认如果不使用—network 参数设置的容器,默认都是使用的bridge网络模式;

         使用:docker exec -it nginx_bridge_mode /bin/sh 命令进入容器

         ifconfig 查看容器ip地址,与物理主机docker0 IP在一个网段

         在bridge模式的docker容器中尝试使用ping命令ping外网,发现无法访问外网

         通过访问自己的docker容器ip和访问物理主机docker0网卡ip也能够正常访问

Docker容器:nginx_bridge_mode nginx程序;

 

         wget -O - -q url  使用wget访问网页,并且直接输出网页内容

 

         在docker物理主机服务器尝试访问docker容器ip以及docker0网卡ip,能够正常访问nginx 80端口,但是公网访问80端口由于没有做pat流量转发,bridge模式主机无法被公网访问;

 

 

 

 

 

 

         . 使用bridge模式发布docker容器端口到公网访问:

         关闭docker物理主机firewalld防火墙 以及 selinux防火墙

         编辑 /etc/sysctl.conf文件   将net.ipv4.ip_forward =0修改为1 开启转发功能

        

                  

                   使用sysctl -p 命令生效修改的linux转发功能生效;

 

 

docker run -it -d --name nginx_bridge_mode_wan8080_to_lan80  -p 8080:80 space.wu/nginx:1.14.2

-d 参数  用于设置容器运行起来后,后台运行不暂用前端窗口,省去ctrl +c

Docker start 命令过程,直接运行起容器不暂用命令窗口;

-p 参数  [物理主机ip:]端口:[容器ip:]端口 指定映射本地端口映射到容器主机

                    默认ip可以不填写,直接写映射的端口即可

iptables -t nat -vnL 查看防火墙nat转发映射表

使用bridge网络模式但是修改bridge网络模式默认IP网段:

         自定义docker0网卡网络属性信息: (推荐不使用容易造成docker程序无法启动)

         vim /etc/docker/daemon.json

        {

  "bip": "192.168.1.1/24",           //网桥ip

  "mtu": 1500,

  "default-gateway": "192.168.1.1",

  "dns": ["10.20.1.2","10.20.1.3"]

}

        

 

 

 为docker容器自建新的bridge网桥划分其他自定义网络用于容器网络:

 

         docker network  [功能参数]

        

         [功能参数:]

         create             新建一个docker容器网桥

         rm 名称           删除一个已创建的docker容器网桥

         ls                         查看现有的docker容器网桥

 

         prune                 删除所有未使用的网桥

         connect        将容器连接到指定的网桥

         disconnect        端口容器与网桥的连接

        

 

 

 新建docker容器网桥

 

格式:docker network create [选项]  网桥

         [create选项:]

                   -d     指定新建的网桥属于docker容器网络类型中的其中一种,默认bridge

         --subnet      指定新建的docker容器网桥网段

         --gatway     指定新建的网桥网段内的默认网关ip,一般指定为网桥ip

         --internal    限制对网络的外部访问

         --ip-range   设置该网桥自动分配的IP地址范围

        

使用docker network create 命令新建一个名为docker_lan_net的bridge网络模式的网桥

ip地址段为192.168.100.0/24  网桥ip为192.168.100.1 作为分配到该网桥容器的网关ip

 

 

 

 

                   docker run -it --name docker_lan_web1 --network docker_lan_net  -p 80:80 space.wu/nginx:1.14.2

新建一个docker_lan_web1的容器,--network指定网桥连接docker_lan_net  然后发布80端口,然后启动容器,然后使用exec进入到容器,查看容器ip已经nginx运行程序,然后在外部访问测试;

  

       4.Docker容器使用container网络模式方法:

 

先建立一台正常模式下发布80端口的docker容器主机

 

再建立另外一台nginx 容器与nginx-web1共用一个网卡IP时,提示由于80端口已经被占用,所以无法运行;

 

再次下载另外一个开机运行默认不占用80端口的docker镜像,然后设置容器名称为

docker-container  --network 指定为container模式与nginx-web1共享网卡ip

 

 

 

 

 .创建docker容器时,主动配置ip地址,不选择自动分配;

 

--ip  ip地址   使用--ip选项可在自建的网桥上创建docker容器时,手动指定固定的ip地址,该ip地址必须与网桥在一个网段,并且该网段内的其他docker容器未使用;

 

docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 dcoker_lan_net

创建一个命名为 dcoker_lan_net的网桥,网段为192.168.100.0/24段

 

 

 

运行一个名为test_web1的容器,--network 指定连接的网桥是自建的dcoker_lan_net网桥,并且指定自定义的固定ip地址为192.168.100.188

 

 

5. docker程序远程管理其他物理主机docker程序

在需要被远程docker管理的主机上,使用systemctl stop docker

然后使用手动命令行启动docker

dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

查看需要被远程管理的docker物理主机,发现2375端口已经被监听

 

 

 

在另外一台主机使用dcoker -H命令远程查看docker容器信息

 

 

 

docker start启动失败出现此类错误,提升使用docker status docker.service时,大多都是

/etc/docker/daemon.json文件中内容与 /lib/systemd/system/docker.service 中启动加载内容重合 如下:

 

 

 

 

 

6. 设置docker容器默认启动时候支持外网tcp远程以及本地使用

vim  /lib/systemd/system/docker.service  

注释默认docker.service 启动参数,然后手动将docker启动参数加入

 

 

 

 

然后启动docker服务时

提升需要daemon-reload,根据提示执行完成后,本地docker服务正常运行;

 

 

 

外网访问也正常;

 

 

 

 

 

 

Docker容器存储卷篇(六):

 

         利用Docker容器建立存储挂载点,解决docker容器停止或被删除后数据丢失风险;

 

    实现多台容器共同使用同一份公共资源数据,如多台web docker共享网站代码;

 

         利用Hadoop nfs mfs samba等网络文件系统,实现多台不同的docker物理服务器上运行相同业务类型的docker容器数据资源共享;

 

应用场景如下:

        

     前端负载均衡器 + 物理服务器 A  与 物理服务器B  + 磁盘存储服务器

 

     A 与 B 服务器各自都运行3台web容器,作为负载均衡器后端web站点

 

     为保证 A + B两台物理主机下的6台Web Docker容器代码文件一致性,可以采用

 

     利用linux存储目录挂载模式,将磁盘存储目录统一都挂载在两台物理主机的/data-disk目录下,实现两台docker物理服务器数据存储目录 /data-disk目录数据共享;

 

 

配置实例:(先实现同一台物理主机上两台web docker容器共享同一份代码文件

首先在本地物理主机 新建一个docker容器网站代码存储目录  /data-disk/docker

 

运行两台docker容器

docker run -it --name share_web1  -d -p 8081:80 -v /data-disk/docker:/docker_webdata space.wu/nginx:1.14.2

 

docker run -it --name share_web2  -d -p 8082:80 -v /data-disk/docker:/docker_webdata space.wu/nginx:1.14.2

选项:

-v   物理本地磁盘路径:挂载到容器中的磁盘目录

-d   运行完容器后不进入容器页面占用前端窗口

 

在物理主机的容器挂载目录下创建index.html文件,然后分别进入两台容器进行查看

 

 

在物理主机使用iptables -t nat -vnL 查看dnat端口转发情况;

 

 

 

 

 

 

.多个磁盘目录需要挂载到docker容器系统

         需求说明:

                   需要将两个或两个以上的目录挂载到docker容器主机中指定目录下对应

docker run -it -d --name "disk_web3" -p 8083:80 -v /data-disk/disk_web3/diska:/dataa -v /data-disk/disk_web3/diskb:/datab  space.wu/nginx:1.14.2

如果需要两个或者多个挂载目录,每次的对应挂载目录都使用一次-v 参数进行指定即可;

 

 

 

 

 

 

.如果同一台物理主机中,多台容器挂载目录都一致,并且挂载目录量较大时,可使用

--volumes-from 参数进行指定跟从指定的机器挂载相同选项;

docker run -it -d --name "from_web4" -p 8084:80 -v /data-disk/disk_web4/diska:/dataa -v /data-disk/disk_web4/diskb:/datab  space.wu/nginx:1.14.2

正常创建一台为from_web4的docker容器,然后为其挂载两个目录;

然后建立第二台to_web4的docker容器,让其赋值from_web4容器的挂载参数;

 

 

 

 

 

 . 查看docker 容器信息相关信息格式:

 

查看docker容器相关详细信息格式:

                      docker inspect [选项] 容器名

查看docker容器镜像详细信息格式:

                      docker image inspect [选项] 镜像名称

 

 

 

 

 

搭建docker私有仓库(七)

 

         方式一:   在本地搭建一个docker本地私有仓库(无web管理页面);

         方式二:   使用docker容器搭建私有仓库,从docker hub下载支持web页面管理后台;  

 

. 方式一搭建服务器本地私有仓库(无web管理页面)

yum -y  install  docker-registry

 

安装docker-registry仓库程序包

 

 

 

使用rpm -ql 命令查看docker私有仓库程序包安装后文件路径,其中config.yml为docker私有仓库本地配置文件,/var/lib/registry目录则为仓库存储目录

 

 

 

 

建立docker本地仓库镜像存储目录,然后挂载一个大磁盘作为大量docker镜像文件存储,然后编辑并设置docker本地仓库配置文件;

 

 

 

修改配置文件中的镜像存储目录以及docker本地仓库程序服务监听端口;

 

 

 

启动docker本地仓库服务程序  systemctl  start docker-registry

查看程序监听端口,已经docker本地仓库服务器IP地址;

 

 

 

客户端往私有docker本地仓库中上传或下载docker镜像需要如下操作:

做一个DNS域名解析到docker本地服务器;

 

 

"insecure-registries": ["dockerio.spacewu.com:8080"]

编辑docker容器配置文件,使用insecure-registries 参数,设置docker容器本地程序连接本地docker私有仓库时,不使用https协议;

 

 

 

 

docker tag space.wu/nginx:1.14.2  dockerio.spacewu.com:8080/space.wu/nginx:1.14.2

如果需要将本地docker镜像文件上传到私有docker仓库服务器,在使用push时,需要通过docker镜像名称相关信息,让docker程序判断文件是提交到dockerhub还是第三方docker仓库,故镜像名称格式为: 

                   dockerio.spacewu.com:8080/space.wu/nginx:1.14.2

             docker本地服务器域名:程序监听端口号/镜像名称/程序版本号

使用tag 文件修改需要上传到本地私有仓库的镜像名称标签

 

docker push dockerio.spacewu.com:8080/space.wu/nginx:1.14.2

然后docker push 完成nginx.1.14.2镜像提交到私有仓库;

 

在docker私有仓库服务器查镜像存储目录;

 

 

 

在其他docker物理主机中远程连接docker私有部署的镜像仓库(请确保iptables和firewall防火墙端口运行docker私有仓库程序端口开放)

yum -y install iptables-service

iptable -F

iptables -A INPUT -p tcp --dport 8080 -s 0.0.0.0/0  -j ACCEPT

systemctl  stop   firewalld.service

systemctl   disable   firewalld.service

在其他docker物理主机的hosts中写入docker私有仓库域名解析

 

 

编辑daemon.json文件,设置docker连接私有仓库时允许使用http协议

 

 

使用docker pull下载私有仓库的docker镜像

查看私有仓库下的镜像方法如下

 

 

 

 

在另外一台docker物理主机再次提交一个新版本的docker容器到本地仓库。

 

 

 

 

         .方式二:   使用docker容器搭建私有仓库,从docker hub下载支持web页面管理后台

 

官方安装说明文档,以保存中文版pdf存储

https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

 

程序包安装文件下载路径

https://github.com/goharbor/harbor/releases

 

 

yum install -y epel-release

wget https://download.docker.com/linux/centos/docker-ce.repo

:%s#download.docker.com#mirror.tuna.tsinghua.edu.cn/docker-ce#g

 

 

yum -y install docker-ce  docker-compose

修改hosts解析;

 

systemctl start docker.service

 

wget  https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.4.tgz

tar -xf harbor-offline-installer-v1.7.4.tgz

cd harbor

进入到harbor的解压目录,在docker-compose.yml文件中,定义了所有docker容器的配置信息,作为私有镜像仓库的容器存储目录默认磁盘不足,可以新增挂载盘到容器默认挂载点目录下;

 

编辑harbor.cfg文件,用于定制私有仓库的相关页面以及帐号密码信息,详情可查阅官网另存的pdf文件:

 

hostname = docker.spacewu.com      //设置docker仓库访问域名(其他服务器需要解析)

 

---------------------------------------------推荐相关帐号密码不需要修改------------------------------------

ui_url_protocol = http      //设置访问协议类型

db_password = space2018     //postgreSQL数据库密码  推荐不修改以防内部调用出错

redis_password = space2018    //redis服务器密码 推荐不修改以防内部调用出错

clair_db_password = space2018  //此处密码必须与postgreSQL设置参数一致 

max_job_workers = 10      //服务器最大复制工作数

customize_crt = off            //关闭证书验证

ssl_cert = /data/cert/server.crt           //如果站点支持https证书存放目录

ssl_cert_key = /data/cert/server.key               //如果站点支持https证书密钥存放目录  

harbor_admin_password = Abcd1234    //管理员初始密码(可以先不设置后去修改)

 

 

 

sh -x  install.sh  > install.log

使用install.sh 文件运行安装

 

systemctl stop firewalld.service    // 关闭系统防火墙

systemctl  disable firewalld.service   // 关闭系统防火墙开机启动关闭

setenforce 0   // 关闭系统防火墙

 

yum -y install iptables-service

iptables -F    如果iptables导致无法访问,可以尝试情况防火墙(推荐不操作)

 

使用设置的harbor_admin_password 帐号密码登录  默认admin/Harbor12345

 

使用管理员登录至私有仓库管理后台,创建私有仓库镜像上传下载相关帐号

 

 

创建一个帐号为spacewu的用户

 

用户创建完成

 

 

 

 

使用创建的用户登录docker私有仓库管理后台

 

 

 

选择创建docker镜像管理的项目仓库,点击新增;

 

 

 

 

为仓库名称命名为nginx-web,可选择设置公开或者不公开;

 

 

 

在一台docker容器的物理主机上设置域名解析,以及编辑/etc/docker/daemon.json文件,使用insecure-参数设置docker.spacewu.com域名不需要使用https协议

 

 

 

 

使用docker login命令登录docker.spacewu.com私有仓库

 

 

使用docker tag标签命令修改需要上传到私有仓库的容器标签名称,格式如下:

 

docker.spacewu.com/nginx-web/nginx/1.14.2

私有仓库服务器/项目仓库名/镜像名称:[版本信息]

 

 

使用docker push命令提交镜像文件到私有仓库,如果此处docker为登录认证docker私有仓库,则会报错,提交docker镜像时候版本标签可选择省略

 

 

 

 

 

上传完成后,可通过docker私有仓库管理后天,查看项目下的镜像;

 

 

 

 

在其他docker容器物理主机中下载docker本地私有仓库下的镜像文件,解决容器服务器解析问题,在/etc/docker/daemon.json文件中设置私有仓库无需https协议,然后如果不登录进行身份认证,pull或者push都会失败。

 

 

 

停止docker私有仓库服务命令: docker-compose pause

运行私有仓库服务器命令 docker-compose unpause

 

 

 

如果docker私有仓库无法私有,需要确认运行的所有docker私有仓库相关容器属于运行状态,可通过docker start   docker stop命令进行启动和停止

 

 

 

 

Docker系统资源限制(八)

 

. 查看docker容器性能资源消耗

         docker stats [容器名]

docker stats 命令可以查看当前物理主机下,所有docker容器的性能资源

 

 

 

. 查看docker容器中的运行程序

          docker top 容器名

使用docker top命令指定查看一台容器的内部运行的程序;

 

 

 

 

容器资源限制参数:

格式:  docker  run   [选项]

[ 选项:]

-m  限制内存  :  限制容器最大使用内存量,单位分别为m为兆  g为千兆

--cpus 核心数  :    限制容器最大可使用CPU核心数,如本地物理主机为4核8G,服务器

                                        CPU性能消耗则可以达到百分之400,1核表示100%;

--cpuset-cpus 值, : 明确指定容器只允许使用物理服务器中第几颗CPU,

                                               如当物理主机为4核8G配置时,--cpuset-cpus 0,3则表示该容器值                                         运行使用两个CPU,分别是0第一颗,3第四颗,意味着容器最大                                                     CPU只有2颗,内存消耗在200%左右,0-2 这表示 012三颗;

 

--cpu-shares 权重值     按照权重比例切分物理主机CPU资源,如物理主机4核8G配置

                                                3台容器 web1比例1024  web2比例512 web3比例2048,则表示                                        将物理主机CPU分为7份web3可以使用物理主机4核CPU的

                                                 7/4CPU资源,然后如果新增其他主机分配权重值,则继续按照此                                         比例分配。

 

 

限制docker容器的使用内存最大值,防止docker容器将物理主机服务器性能资源耗尽

docker run -d --name test_memory -it -m 512m space.wu/nginx:1.14.2

运行一台docker容器,-d后台运行不占用交互界面,命名为test_memory  -m 512m设置该容器最大可使用内存为512m

 

使用docker top 容器名,查看容器内部运行进程信息

 

 

 

使用docker stats [容器名]  查看容器性能消耗信息,其中MEM USAGE为目前容器使用内存,LIMIT为容器最大可使用内存,MEM%  为服务器已使用内存占可使用内存百分比;

 

 

 

 

限制docker容器的可使用CPU核心数,防止docker容器将物理主机服务器性能资源耗尽

docker run -d -it --name test_cpu --cpus 2  space.wu/nginx:1.14.2

运行一个容器,然后使用--cpus 2设置该容器最大只允许使用2核CPU,如果在满负载情况下CPU负载只能达到百分之200;

 

 

 

 

为演示当容器CPU性能消耗大于容器限制性能的实际效果,现通过stree容器进行压测模拟

下载镜像 lorel/docker-stress-ng:latest压测镜像

docker run  -it --name test_cpu1 --rm -d --cpus 2 lorel/docker-stress-ng:latest   stress --cpu 4

 

运行一个命名为test_cpu1的容器,--rm 容器使用完成后删除

--cpus 2分配容器最大只允许使用两核CPU,使用lorel/docker-stress-ng:latest镜像运行容器

stress --cpu 4 使用stress镜像中的stress压测程序,--cpu 4是程序消耗4核CPU压力进行运行 ,最后结果,发现服务器最大使用到198%接近2核CPU后无法上涨;

 

 

 

明确指定docker容器只运行使用本地物理主机的第几核CPU

运行容器test-cpu  --cpuset 0,1 指将物理主机的0和1的两核CPU 给予容器使用,一般不使用做法。

 

 

 

. 按照权重进行CPU资源分配:

分别建立两台主机share_cpu1 和share_cpu2  share_cpu1的CPU权重占比为512  share_cpu2 占比1024   docker将本地物理主机CPU资源分为3份,然后比重占比进行分配;

 最后CPU分配结果,share_cpu2分配的比重比share_cpu1多一倍,此服务器为2核CPU

docker本地物理主机CPU百分之100负荷中;

 

 

 

 

 

如果毕竟重要的docker容器,为防止docker物理主机资源耗尽后导致重要docker容器程序被杀死,则可以使用以下参数进行设置

--oom-kill-disable      禁用OOM杀死容器程序

--oom-score-adj     该值范围-1000 到1000 值越小,当系统资源不足时,优先杀死进程                                      被排名越靠后;

该实则以为着nginx_web容器就算使用内存超过限制的512m也不会被杀死。

 

 

 

 

DockerFile制作容器镜像文件参数详解(九)

     

. Dockerfile的基本结构

 

         一般分为四部分:

   1. 基础镜像信息

   2. 维护者信息

   3. 镜像操作指令和容器启动时执行指令

         4. ’#’ Dockerfile 中的注释

 

所有围绕着Dockerfile相关的文件以及程序,都必须要存放在dockerfile同级目录下   

 

Dockerfile文件常用指令功能说明:

序号

文件指令

功能说明

1

FROM

指定基础镜像,必须为第一个命令

2

MAINTAINER

指定作者

3

LABEL

为镜像指定元数据,功能是为镜像指定标签

4

ENV

设置容器环境变量

5

ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),但会wget自动下载

6

COPY

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

7

WORKDIR

工作目录,类似于cd命令

8

USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户,当服务不需要管理员权限时,可以通过该命令指定运行用户。

9

ONBUILD

当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

10

EXPOSE

指定于外界交互的端口,运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

11

VOLUME

用于挂载docker本地物理主机的目录挂载到容器中,作为持久化存储防止容器删除后数据丢失

12

ARG

用于指定传递给构建运行时的变量

13

RUN

构建镜像时执行的命令
(RUN是构件容器时就运行的命令以及提交运行结果)

14

CMD

构建容器后调用,也就是在容器启动时才进行调用
(CMD是容器构建成功以后,启动容器时执行的命令,在构件时并不运行)

Dockerfile文件常用指令语法详解

 

From  指定基础镜像,必须为第一个命令

 

语法一:  FROM  镜像全名:[标签]  

        

语法二:  FROM  镜像全名@[镜像哈希码]           //防止冒名顶替的假镜像

 

说明:   自定义作一个镜像时,必须有一个基础原有可使用的镜像,然后在此镜像中新增和部署自己所需环境,语法一和二后面的值都是可选项,如果不使用这两个值时,会使用latest最新版本的基础镜像。

 

 

 

MAINTAINER  指定作者,镜像创建者维护者信息

 

语法格式:  MAINTAINER  用户名

                            MAINTAINER  用户邮箱等       

 

说明:   用于提供说明镜像的创建者信息,多个使用可以提供不同信息内容描述;

 

 

 

 

LABEL  为镜像指定元数据,设置镜像标签

语法格式:  LABEL  关键字="值"  关键字2="值"

实例:            version="1.10"  maintainer="abc@163.com"

说明:   用于显示镜像相关标签信息,针对标签进行相关参数说明;

 

 

 

 

ENV   设置容器环境变量

语法格式:   ENV  PATH="/usr/local/httpd/bin:PATH"

实例:            ENV  webhome="/data/www"

 

说明: 设置的变量值会传递到容器内部被调用,或者DockerFile文件其他指令调用,     如后续指令中使用ADD COPY其他指令时,可以调用该变量的值;

 

 

ADD   将本地文件添加到容器中(指定的目录时,默认只拷贝目录下所有)

 

语法格式:  ADD 本地文件  存放到容器中的目录

 

实例:            ADD  ./httpd-2.4.tar.gz  /tmp/httpd/    默认会被解压

                           ADD http://a.b.com/httpd-2.4.tar.gz  /tmp/httpd/

 

说明:   使用add文件可以将服务器本地的文件拷贝到容器的指定目录中,并且如果

                  是压缩文件会被默认解压释放到指定的目录,而公网的软件,则会下载后存放

                  到指定目录。

 

 

 

 

COPY   将本地文件添加到容器中(指定的目录时,默认只拷贝目录下所有)

 

语法格式:  COPY  本地文件  存放到容器中的目录

 

实例:            COPY   /data/www  /data/www/

                           等于   COPY  /data/www/*  /data/www/

 

说明:   使用copy指令可以将本地文件拷贝到容器目录中

 

 

 

 

 

WORKDIR   工作目录,类似于cd命令

 

语法格式:  WORKDIR  /data/www

说明: 使用WORKDIR指令可以定义制作容器时,命令进入到哪个目录下进行下一步操作

 

 

 

USER   指定运行容器时的用户名或 UID

语法格式:  USER  用户名

 

说明:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户,当服务不需

           要管理员权限时,可以通过该命令指定运行用户,通过docker run运行容器时,

           可以通过-u参数来覆盖所指定的用户

 

 

ONBUILD         用于设置镜像触发器

语法格式:  ONBUILD  RUN  yum -y install lrzsz

实例:            ONBUILD  RUN  wget http://a.b.com/abc.tar.gz

 

说明: 在ONBUILD指令后的命令在打包做镜像或者做成的镜像运行容器时都不会被

            执行,但是当此镜像被其他制作镜像FROM参数调用时,则会执行ONBUOLD

            指令后的命令;

 

 

 

 

 

EXPOSE      指定于外界交互的端口

 

语法格式:   EXPOSE  端口号[/协议]

 

实例:    EXPOSE 80   

                    EXPOSE 80 443

                    EXPOST  10500/tcp 10010/udp

 

说明:   在部署的环境的容器中,需要开放程序端口对外时候,使用EXPOSE指令进行发布

 

 

 

 

 

 VOLUME         挂载本地目录到容器

语法格式:   VOLUME  /data

实例;    VOLUME  /data/www

 

说明:当使用这个参数制作的容器,在被运行时候,会自动在物理机本地将一个目录挂载到dokcer容器中的/data/www目录下,如果在docker容器中/data/www目录下原先已经存在站点文件,则会将这些文件复制存放到容器挂载的目录使用,当容器删除后,该目录的东西由于在本地物理主机有对应挂载点,数据将得到保存;

 

 

 

 

 

 

  ARG      为镜像build时设置默认值

 语法格式:  ARG  webpath=/data/www

 

 说明:当使用ARG定义的参数默认值,在进行build镜像时没有指定参数的新值,则默认使用ARG定义的值为默认参数;

 

 

 

     RUN  构建镜像时执行的命令

 

  语法格式:  RUN 系统执行命令  &&  系统执行命令2  && \ 换行然后命令3

  实例:RUN mkdir -p /data/www/html  &&  cp /root/html/a.html /data/www/html  

 

  说明:(RUN是构件容器时就运行的命令以及提交运行结果) 一般用于在容器制作前      部署环境使用,不建议写多个run运行多条命令;

 

 

 

  CMD  为构建的容器设置容器启动时运行的程序

  语法格式:  CMD  容器启动后执行命令  参数1  参数2

  实例:        /bin/httpd -f -h /data/www/html

 

 说明:CDM类似于centos6.X版本的rc.local文件,设置容器系统启动后默认执行程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. 制作容器镜像

制作容器命令格式:

        

         docker build  [选项] 自定义容器名  容器执行相关文件目录

 

选项:

                   -m  限制内存  :  限制容器最大使用内存量,单位分别为m为兆  g为千兆

 

                    --cpus 核心数  :  限制容器最大可使用CPU核心数,如本地物理主机为4核8G,                                                         耗则可以达到百分之400,1核表示100%;

                   -t  名称              :  自定义新建的容器镜像名称信息

准备一个基础容器镜像文件

 

 

创建一个用于建立新镜像的容器目录,然后在目录下创建一个Dockerfile文件

根据Dockerfile文件指令,对新容器镜像需求进行环境部署

 

 

 

 

使用docker build 命令镜像容器镜像制作 -t 自定义容器名称 指定Dockerfile镜像信息配置文件目录在当前目录下

 

镜像开始制作中,依次显示Dockerfile文件中指令

 

 

 

镜像制作根据dockerfile文件中指令对新镜像进行环境不是,部署完成后的镜像大小明显大于之前的基础镜像;

使用新制作的镜像运行docker容器,然后发现在制作docker镜像时,已使用的service httpd start运行httpd ,但镜像运行容器时,httpd服务依旧为被运行,手动运行httpd服务,查看到物理主机的镜像端口映射为32777:80

 

 

 

        

检查httpd开机启动状态和iftop工具是否已经在镜像制作时完成安装;

 

 

 

分别在docker物理主机和其他pc访问docker容器中的httpd服务。

 

 

 

 

 

 

docker排错篇(十):

 

         1.  docker容器开机启动项无法开机启动时

当使用docker start 容器名 无法启动容器时,一般是因为容器自启动项出了问题导致,可手动进行修改一个能够启动的,如图查看容器docker-censh-spider2容器默认开机运行的command命令是什么,然后通过docker inspect 容器名查看容器对应系统文件挂载目录;

 

 

通过查看容器详细信息可以找到容器运行系统文件存放位置

通过 --format "{{.GraphDriver.Data.UpperDir }}"  定位查找准确信息

 

 

 

然后在容器系统文件目录下找到该容器开机默认运行的程序,进行查看,然后修改为一个可以开机自动运行的项目即可,如 /bin/sh

 

 

 

 

docker容器启动没有反应查看日志方法:

 

docker logs  容器名称

 

 

 

 

 

使用docker容器搭建网站需要注意的三件事:

 

1.   vim /etc/idmapd.conf  

         设置挂载用户为apache,否则会造成session等目录无法读写

 

2.  /var/lib/docker  目录权限千万不能乱动

 

3.  docker容器下,必须使用ln -sv 将网站根目录对应上/data-disk/www

 

 

 

 

 

容器使用systemctl命令提示此错误时:

 

Failed to get D-Bus connection: Operation not permitted

 

原因:

运行docker容器时需要使用此参数:

--privileged=true     授权容器启动后,使用最高root权限

/usr/sbin/init  在启动容器命令最后添加该命令,类似于容器启动项设置为启动init

 

命令:

 

docker run -it -d --privileged=true ...***  镜像名   /usr/sbin/init

 

 

 

 

dockerlinux系统不支持中文处理方法:

 

yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common 
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 
export LC_ALL=zh_CN.utf8

rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

vim /etc/profile

export LANG="c.UTF-8"

source /etc/profile

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值