本文记录了一个实际的Dokcer应用场景从创建、上传直到部署的详细过程,Docker为我们提供了一个新的软件发布方式,只要将应用以及相关的依赖打包成Docker镜像,并上传到镜像仓库之后,我们就可以快速拉起一个定制服务,毫无拖泥带水,从而极大的简化了部署。

本文还简单的介绍了腾讯云的容器服务,通过容器服务,我们可以上传自定制Docker镜像,可以在腾讯云主机或其他国内网服务器上快速拉起应用服务,加快了业务部署节奏,并降低了运维成本。

当然,最重要的还是我们通过这个实践,可以熟悉Docker的基本知识和基础使用方法。

实践背景


为了学习Docker,我们先结合实际需求,设计这样一个场景case:假设有一个个人网站,想使用Nginx反向代理方案,能够在国内外快速搭建多个类似于CDN的节点,提供集群式的WEB访问服务。
我想到的方案如下:

  • 常规部署方案:    购买云主机->环境初始化->部署Nginx->配置反向代理->DNS解析
  • Docker部署方案:购买云主机->yum 安装docker->拉取自定义镜像并执行->DNS解析
  • 腾讯云容器方案: 腾讯云容器服务->创建服务->DNS解析

很明显,使用Docker部署方案,整个过程会变得简单快捷,也更易自动化。当然,若不是对IDC有特殊要求的话,腾讯云的容器服务当选为最佳方案。
下面简单记录下我从Docker镜像的创建、上传到部署的实践过程。
实验环境:

  • 腾讯云:CentOS Linux release 7.2.1511 (Core)
  • 阿里云:CentOS Linux release 7.2.1511 (Core)
  • Docker version 1.12.6, build 88a4867/1.12.6
  • Docker 镜像版本:Centos 官方最新版
  • Nginx 版本:Tengine 2.2.0
  • 其他略..

制作镜像



1、安装配置Docker

  1. # 安装docker
  2. yum install -y docker
  3. # 配置腾讯云镜像加速(官方的龟速)
  4. vim /etc/sysconfig/docker
  5. #新增如下参数:
  6. OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'
  7. #重启docker服务:
  8. systemctl restart docker

复制代码

2、制作基础镜像

  1. 拉取 centos官方基础镜像
  2. docker pull centos
  3. 查看当前镜像
  4. docker images

复制代码

  1. [root@MyServer docker]# docker images
  2. REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
  3. docker.io/centos                                        latest              328edcd84f1b        4 weeks ago         192.5 MB

复制代码

运行并进入镜像:

  1. docker run -ti docker.io/centos:latest /bin/bash

复制代码

此时,终端已经进入了镜像里面,现在我们可以根据自己的需求安装额外的组件,比如我这次需要用到crontab任务计划服务、进程守护supervisor等,那么直接在这个终端开始操作:

  1. [root@0d7f7b8769d9 /]# yum install -y epel-release crontabs
  2. [root@0d7f7b8769d9 /]# yum install -y python-pip
  3. [root@0d7f7b8769d9 /]# pip install --upgrade pip
  4. [root@0d7f7b8769d9 /]# pip install supervisor

复制代码

注意: 上面的PS提示符中的 0d7f7b8769d9 就是本次启动的 CONTAINER ID ,在下面的commit即将用到。
完成必要组件安装之后,按下 Ctrl +D 退出系统,接着使用 docker commit 命令创建新镜像,比如命名为 nginx-proxy-base,版本latest:

  1. docker commit 0d7f7b8769d9 centos/nginx-proxy-base:latest

复制代码

执行完成后,可以使用 docker images 查看刚创建的镜像:

  1. [root@MyServer ~]# docker images
  2. REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
  3. centos/nginx-proxy-base                                 latest              676fcfff6d3c        About an hour ago   366 MB

复制代码

到此,我们就创建了一个自定义的Docker基础镜像(Ps:基础镜像类似一个VM虚拟机的快照,方便后续步骤都可以从这个基础上重新制作。)
制作服务镜像


有了前面的基础镜像之后,我们可以在此基础之上添加应用程序或自定义配置,打包为服务镜像。以本文背景需求为例,为了方便后续维护,Nginx我采用纯静态编译方式,制作成绿色便携版本。
因此,我们先在宿主机上静态编译一个符合需求的Nginx(仅展示关键步骤,依赖组件自行搞定):

  1. # 把所有依赖都静态编译进去
  2. ./configure  --prefix=/usr/local/nginx \
  3. --with-http_v2_module \
  4. --with-http_ssl_module \
  5. --with-http_gzip_static_module \
  6. --with-http_realip_module \
  7. --with-pcre=../pcre-8.39  \
  8. --with-zlib=../zlib-1.2.11 \
  9. --with-http_sub_module \
  10. --with-openssl=../openssl-1.0.2j \
  11. --add-module=../ngx_cache_purge-2.3 \
  12. --add-module=../ngx_http_substitutions_filter_module
  13. # 安装
  14. make && make install

复制代码

安装后得到 /usr/local/nginx 目录,接着我们按照实验需求修改Nginx各项配置,比如反向代理:

  1. server {
  2. listen 80;
  3. server_name demo.domain.com;
  4. access_log /data/wwwlogs/demo.domain.com.log;
  5. index index.html index.htm index.php;
  6. location  / {
  7. proxy_pass http://xxx.xxx.xxx.xxx;
  8. proxy_set_header  X-Forwarded-For $remote_addr;
  9. proxy_redirect off;
  10. proxy_set_header Host demo.domain.com;
  11. }
  12. }

复制代码

全部配置OK后,运行nginx,确保可以正常工作。
编写Dockerfile


①、创建一个目录,比如:

  1. mkdir -p /data/docker-nginx-proxy
  2. cd /data/docker-nginx-proxy

复制代码

②、创建 supervisor配置文件,注意必须非daemon模式,所以此处crond会带上-n参数:

  1. [supervisord]
  2. nodaemon=true
  3. [program:crond]
  4. command=crond -n
  5. [program:nginx]
  6. command=/usr/local/nginx/sbin/nginx

复制代码

③、继续创建其他所需文件,比如 crontab.list:

  1. 0 3 * * * /usr/local/nginx/sbin/nginx -s reload > /dev/null 2>&1

复制代码

④、将前面的nginx目录拷贝过来:

  1. cp -rf /usr/local/nginx .

复制代码

⑤、编写Dockerfile文件:
vim Dockerfile

  1. FROM  centos/nginx-proxy-base:latest
  2. MAINTAINER <ge@zhangge.net>
  3. # 将所需文件复制到镜像指定路径
  4. ADD nginx /usr/local/nginx
  5. ADD supervisord.conf /etc/supervisord.conf
  6. # 定义一些命令(因为Docker是分层的,这里建议将多个命令通过&&连接,写到一个RUN里面来减少Docker层数)
  7. # 指定时区,解决Dcoker时间和宿主机时间差异问题
  8. RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  9. echo Asia/Shanghai > /etc/timezone && \
  10. ln -sf /usr/local/nginx/sbin/nginx /bin/ && \
  11. echo 'daemon off;' >> /usr/local/nginx/conf/nginx.conf && \
  12. crontab /etc/crontab.list
  13. # 运行 supervisor,这里注意CMD只能用一次
  14. CMD ["/usr/bin/supervisord"]

复制代码

附:dockerfile 常用指令,可以按实际需求自行添加:

  1. FROM:指定基础image
  2. MAINTAINER:用来指定镜像创建者信息
  3. ADD:从src复制文件到container的dest路径
  4. RUN:在容器里面执行命令
  5. CMD:设置container启动时执行的操作,只能是一条,多条则只执行最后一条
  6. EXPOSE:指定容器需要映射到宿主机器的端口,也可以再run的时候指定
  7. ENV:用于设置环境变量
  8. VOLUME:指定挂载点,使容器中的一个目录具有持久化存储数据的功能

复制代码

构建镜像


命令为:docker build -t="[name]:[tag]" ./ ,比如:

  1. docker build -t="centos/nginx-proxy:v1" ./

复制代码

Build完成后,再执行docker images就可以看到刚刚创建的镜像:

  1. [root@MyServer docker-nginx-proxy]# docker images
  2. REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
  3. centos/nginx-proxy                                      v1                  f2ed91429b31        31 seconds ago      370.8 MB
  4. centos/nginx-proxy-base                                 latest              676fcfff6d3c        About an hour ago   366 MB

复制代码

接着,可以下测试镜像是否能正常运行,命令语法大致如下:

  1. docker run -v [宿主目录]:[镜像目录] -ti -p [宿主端口]:[镜像端口] 镜像名称:版本

复制代码

若加上 -d 参数,docker将会后台运行,这里我们想看下刚刚创建的镜像是否正常, 所以采用前台运行模式,命令如下:

  1. docker run -v /data/docker:/data/wwwlogs -ti -p 80:80 centos/nginx-proxy:v1

复制代码

执行过程:

  1. [root@MyServer docker-nginx-proxy ~]# docker run -v /data/docker:/data/wwwlogs -ti -p 443:443 -p 80:80 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest
  2. /usr/lib/python2.7/site-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  3. 'Supervisord is running as root and it is searching '
  4. 2017-09-03 06:34:59,613 CRIT Supervisor running as root (no user in config file)
  5. 2017-09-03 06:34:59,615 INFO supervisord started with pid 1
  6. 2017-09-03 06:35:00,617 INFO spawned: 'nginx' with pid 7
  7. 2017-09-03 06:35:00,622 INFO spawned: 'crond' with pid 8
  8. 2017-09-03 06:35:01,689 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
  9. 2017-09-03 06:35:01,689 INFO success: crond entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

复制代码

可以看到,镜像能够正常运行,接着我们还可以继续测试下启动的Nginx是否能够正常提供服务,这里就不详细介绍了。

三、私有仓库


前文已经制作了一个带有Nginx反向代理服务的Docker镜像,此时还只能在本地使用,若是要让其他服务器也能用到这个镜像,我们可以使用 docker registry 创建一个私有仓库,步骤如下:
1 、拉取私有仓库registry

  1. docker pull registry

复制代码

此时,执行docker images应该可以看到4个镜像:

  1. [root@MyServer docker-nginx-proxy]# docker images
  2. REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
  3. centos/nginx-proxy                                      v1                  f2ed91429b31        About an hour ago   370.8 MB
  4. centos/nginx-proxy-base                                 latest              676fcfff6d3c        2 hours ago         366 MB
  5. docker.io/centos                                        latest              328edcd84f1b        4 weeks ago         192.5 MB
  6. docker.io/registry                                      latest              9d0c4eabab4d        3 months ago        33.17 MB

复制代码

2、拉起仓库

  1. docker run -d -p 5000:5000 -v /data/images:/tmp/registry docker.io/registry

复制代码

3、推送镜像
第一步查看镜像列表时,拿到需要推送的镜像的ID,比如 f2ed91429b31
①、先打tag,语法如下:
docker tag [image id] [仓库地址]/[命名空间]/[镜像名称]:[版本]
②、然后push,语法如下:
docker push [仓库地址]/[命名空间]/[镜像名称]
执行过程如下所示:

  1. [root@MyServer docker-nginx-proxy]# docker tag f2ed91429b31 localhost:5000/centos/nginx-proxy:latest
  2. [root@MyServer docker-nginx-proxy]# docker push localhost:5000/centos/nginx-proxy
  3. The push refers to a repository [localhost:5000/centos/nginx-proxy]
  4. 158fae47d4e2: Pushed
  5. 4a5dcec3edb7: Pushed
  6. ae9a40cbe568: Pushed
  7. 7abc8eb8fc0f: Pushed
  8. d8a5f0f5adc1: Pushed
  9. 7dc25a4e14aa: Pushed
  10. c7ee46ed4410: Pushing [===>                                               ] 9.669 MB/153.1 MB
  11. b362758f4793: Pushing [======>                                            ] 26.78 MB/192.5 MB

复制代码

完成后,执行docker images就可以看到刚刚提交的镜像了:

  1. [root@MyServer docker-nginx-proxy]# docker images
  2. REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
  3. localhost:5000/centos/nginx-proxy                       latest              f2ed91429b31        About an hour ago   370.8 MB
  4. centos/nginx-proxy                                      v1                  f2ed91429b31        About an hour ago   370.8 MB
  5. centos/nginx-proxy-base                                 latest              676fcfff6d3c        2 hours ago         366 MB
  6. docker.io/centos                                        latest              328edcd84f1b        4 weeks ago         192.5 MB
  7. docker.io/registry                                      latest              9d0c4eabab4d        3 months ago        33.17 MB

复制代码

③、测试拉取:
现在可以在本机(本机可以先删除在拉取)或另找一台服务器进行docker pull拉取测试。
比如,先在宿主机上删除这个镜像:

  1. [root@MyServer docker-nginx-proxy]# docker rmi localhost:5000/centos/nginx-proxy
  2. Untagged: localhost:5000/centos/nginx-proxy:latest
  3. Untagged: localhost:5000/centos/nginx-proxy@sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c3024d01e6ea3ec3f1a5d7c152

复制代码

此时,docker images 列表已经消失,再执行 docker pull 就又回来了。

  1. [root@MyServer docker-nginx-proxy]# docker pull localhost:5000/centos/nginx-proxy
  2. Using default tag: latest
  3. Trying to pull repository localhost:5000/centos/nginx-proxy ...
  4. sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c3024d01e6ea3ec3f1a5d7c152: Pulling from localhost:5000/centos/nginx-proxy
  5. Digest: sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c3024d01e6ea3ec3f1a5d7c152
  6. Status: Downloaded newer image for localhost:5000/centos/nginx-proxy:latest

复制代码

4、离线方案


当私有仓库无法使用时(比如存在网络限制),我们还可以将镜像保存为一个tar包,方便离线使用,使用也非常简单:
①、export / import 方案
使用 docker ps -a 查看当前正在运行的docker镜像列表,得到对应的 CONTAINER ID,执行如下语句可以将运行中的镜像导出到指定tar包:

  1. docker export [CONTAINER ID] > centos-nginx-proxy-latest.tar

复制代码

有了tar包之后,就可以使用 import 来导入:

  1. cat centos-nginx-proxy-latest.tar | docker import - centos/nginx-proxy:v1

复制代码

②、save / load 方案
使用 docker images 查看本地已有镜像列表,得到对应的IMAGE ID,然后执行如下语句可以将本地已存在镜像保存到指定tar包:

  1. docker save  [IMAGE ID] > centos-nginx-proxy-latest.tar

复制代码

后面则可以使用 load 来加载tar包镜像:

  1. docker load < centos-nginx-proxy-latest.tar

复制代码

两种方案的区别:

  • export 只能导出正在运行的镜像,而 save 可以直接导出本地镜像;
  • export 导出的镜像文件一般会小于 save 保存的镜像(本文实践数据:相差38MB);
  • export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag <LAYER ID> <IMAGE NAME>,而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

容器服务


上述私有仓库其实已经可以满足整个实验背景需求,我们可以在购买其他云主机之后,就可以通过私有仓库外网地址快速拉起一个Nginx反向代理服务了。
但是,我们都知道国内的云主机都是小水管,而按流量收费的模式也比较昂贵。此时,本文的主角才姗姗来迟:腾讯云-容器服务。
简单来说,腾讯云的容器服务,就是给我们提供了一个在云端的Docker私有仓库,我们可以将制作好的镜像,推送到腾讯云私有镜像仓库,然后就可以在腾讯云或国内外其他云主机上快速拉起自定义的Docker镜像服务了,非常非常方便!而且,最重要的是...该服务目前免费。
下面简单分享一下腾讯云容器服务的使用方法。
1、创建仓库
①、开通镜像服务
打开腾讯云-容器服务: https://console.qcloud.com/ccs
按照页面提示填写相关信息并设置仓库密码:
 
得到腾讯云私有仓库地址:
 
即:ccr.ccs.tencentyun.com/myspace/nginx-proxy
③、重置密码
如果忘记密码的话,可以使用【重置密码】功能来设置新的密码:

 
2、上传镜像


①、仓库认证
username 填写你登录腾讯云的账号,一般是QQ号码

  1. docker login --username=[username] ccr.ccs.tencentyun.com

复制代码

②、推送镜像
和前文推送镜像到本地私有仓库一样,先查看镜像ID,然后如下先打tag,然后推送:

  1. docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[tag]
  2. docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[tag]

复制代码

比如:

  1. docker tag f2ed91429b31 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest
  2. docker push ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest

复制代码

成功后,就可以在腾讯云容器页面查看到刚刚提交的镜像版本了:
 
3、拉取镜像


最后,我们就可以在需要部署Nginx反代服务的云主机上进行拉取操作了。
比如,我在阿里云主机上拉取这个镜像:
①、安装docker:yum install docker
②、启动docker:systemctl restart  docker.service
③、登录腾讯云仓库

  1. docker login --username=xxxxx http://ccr.ccs.tencentyun.com/myspace/nginx-proxy

复制代码

④、拉取镜像
docker pull ccr.ccs.tencentyun.com/myspace/nginx-proxy

  1. [root@iZbp1ct9hsppxrazdvn54mZ ~]# docker pull ccr.ccs.tencentyun.com/myspace/nginx-proxy
  2. Using default tag: latest
  3. Trying to pull repository ccr.ccs.tencentyun.com/myspace/nginx-proxy ...
  4. latest: Pulling from ccr.ccs.tencentyun.com/myspace/nginx-proxy
  5. 74f0853ba93b: Downloading [===========================>                       ] 39.11 MB/72.25 MB
  6. e7fa91cce4c4: Downloading [================================>                  ] 37.65 MB/57.14 MB
  7. c7319b8f7fbc: Download complete
  8. faf8180992b4: Download complete
  9. 79327b915b74: Download complete
  10. 702ede4e59c4: Download complete
  11. 77e09cc85e34: Download complete
  12. 8a265e81261a: Download complete

复制代码

⑤、运行镜像
这里我们正式执行,所以加上 -d 参数:

  1. docker run -v /data/docker:/data/wwwlogs -dti -p 443:443 -p 80:80 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest

复制代码

搭建完毕: 整个过程不到5分钟,非常方便!

Docker新手入门基础知识与实战教程相关推荐

  1. 炒股票新手入门基础知识 跟桥博士炒股票入门课程认识MSCI和纳斯达克指数

    炒股票新手入门基础知识学习,跟着桥博士<股票入门基础知识>课程来认识MSCI和纳斯达克指数,新手炒股入门,从认识股票知识开始. 1.炒股新手入门基础知识--股票指数MSCI 炒股票新手入门 ...

  2. java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】

    类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...

  3. 程序人生:黑帽seo新手入门基础教程

    黑帽搜索引擎优化新手入门基础教程 从原理来看,使用黑帽搜索引擎优化技术做排名,与白帽搜索引擎优化是一样的.从细化的操作来看,则有很大的不同.黑帽搜索引擎优化新手入门基础教程是概述的相关黑帽搜索引擎优化 ...

  4. css基础知识入门教程免费,DIVCSS入门基础知识教程.doc

    DIVCSS入门基础知识教程 HYPERLINK "/rumen/r319.html" DIV+CSS盒子模型 CSS盒子模型-什么是 HYPERLINK "/" ...

  5. Docker新手入门教程

    Docker新手入门教程 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接 ...

  6. 程序人生:黑帽seo新手入门基础教程 1

    黑帽搜索引擎优化新手入门基础教程 从原理来看,使用黑帽搜索引擎优化技术做排名,与白帽搜索引擎优化是一样的.从细化的操作来看,则有很大的不同.黑帽搜索引擎优化新手入门基础教程是概述的相关黑帽搜索引擎优化 ...

  7. 炒股入门初学者基础知识讲解,如何掌握新手炒股入门基础知识

    对一些刚入股市的新手来讲,要学习的股票术语和一些图标实在是太多了,很多的新手在炒股的时候不知道炒股的技巧是什么,毕竟万事开头难,所以大家要多了解一些基础的知识.下面为大家介绍下QR技术分析社区中关于炒 ...

  8. 好程序员web前端教程分享web前端入门基础知识

    好程序员web前端教程分享web前端入门基础知识,作为合格的Web前端工程师必须得掌握HTML.CSS和JavaScript.只懂其中一两个还不行,必须对这三门语言都要熟悉.下面我们一起来看一看吧! ...

  9. Axure教程 axure新手入门基础(1)

    axure新手入门基础(1) 名词解释: 线框图:一般就是指产品原型,比如:把线框图尽快画出来和把原型尽快做出来是一个意思. axure元件:也叫axure组件或axure部件,系统自带了一部分最基础 ...

  10. 大数据分析入门基础知识学什么?

    大数据分析入门基础知识学什么?做好数据分析要掌握多方面的知识和技能,软实力包括沟通能力.表达能力.设计能力等.学大数据分析需要掌握可视化分析.数据挖掘算法.预测性分析能力.语义引擎.数据质量和数据管理 ...

最新文章

  1. 判断两个树是否相等和判断tree1是否包含tree2 python实现
  2. Spring高级程序设计这本书怎么样
  3. hdu 4496 D-City 并查集
  4. 7天减排超万吨 特斯拉十一出行报告带来纯电出行全新视角
  5. fgets 和gets_C编程中的fgets()和gets()
  6. 解决SourceTree不断提示输入密码问题
  7. 监控mysql连接池信息_druid-带监控功能的数据库连接池
  8. 字符串队列c语言,c语言队列问题
  9. html css js php是否区分大小写 总结
  10. Android 显示软键盘输入法和强制隐藏软键盘输入法
  11. 代季峰对话张祥雨 | 自动驾驶感知新时代!新一代环视感知算法BEVFormer有哪些优势...
  12. 联想小新22H2版跳过联网方法最新方法
  13. 设计模式学习资料推荐
  14. 利用hive源码解析sql查了哪些表哪些字段
  15. 小波变换的前因后果(三)
  16. 今天终于知道了什么是X-window中字体hinting的含义了!
  17. MySql中的like和in走不走索引
  18. android通用ui库设计规范,难查的ANDROID APPUI设计规范总览
  19. 企业公众号菜单添加视频的完整教程(组图)
  20. 关于《Swift开发指南》背后的那些事

热门文章

  1. oracle数据数形转换db2,DB2数字类型转换成字符串类型,例:ORACLE与DB2
  2. python从键盘获取列表,python – 从5行中的列表列表中获取所有元素
  3. redis java 存储对象_安装redis 并把java对象存放在redis中
  4. mysql系统调试文字说明_mysql的配置说明
  5. php如何隐藏入口文件,php怎么隐藏入口文件
  6. 缓冲大小 设置_【设计】小知识点:各种水箱的选型设计(二)缓冲水箱
  7. 机器学习(一)绪论、算法总结
  8. 两台服务器安装redis集群_高性能分布式存储服务Minio安装配置入门
  9. nyoj20吝啬得过度(DFS)
  10. 基于时间片的高优先级调度_CFS调度器(1)-基本原理