docker的常用命令行:
    1.常用的帮助命令
        1.1.查看docker的信息以及版本号
            docker info 查看docker的信息
            docker version 查看docker的版本号
        1.2.docker的启动,重启,停止,状态
            service docker start/restart/stop/status

    2.镜像的常用命令
        2.1.什么是镜像
            docker中的镜像并不只是一个你们想想系统(window,centos,OS X...),
            而且这些镜像是只读的,可以通过镜像(相当于iso文件)来创建多个容器
            也可以通过容器来制作镜像

        2.2.列举出所有的本地镜像
            docker images
                所拥有的参数:
                    --no-trunc:显示完整的镜像信息
                    -a:列举出本地的所有镜像(包含不完整镜像和损坏镜像)
                    -q:只显示镜像的id(只显示完整镜像的id)
                    -qa:显示所有的镜像id(包含不完整镜像和损坏镜像)
                        eg:
                            delete from user where user_id in (
                                select user_id where user
                            );
                    --digests:显示镜像的摘要信息
                        自己也可以制作镜像上传到dockerhub上,上传的时候会写一些摘要信息
                        这些摘要信息默认是不显示(也可以选择不写)

            REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
            REPOSITORY:镜像的名称
            TAG:镜像的版本号
            IMAGE ID:镜像的唯一标识id(相当于数据库中的主键,绝对不允许重复)
            CREATED:是从dockerhub中下载下来的时间
            VIRTUAL SIZE:镜像所占用的硬盘大小

        2.3.搜索镜像
            可以从dockerhub上搜索自己想要的镜像
            docker search 所要搜索的镜像名
                所拥有的参数:
                    --no-trunc:显示完整的镜像信息
                    !!!-s:列举出点赞数不小于多少的镜像信息
                        eg:
                            找到点赞数不小于20的tomcat的镜像
                            docker search -s 20 tomcat

            NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
            NAME:
                镜像的名称
            DESCRIPTION:上传镜像到dockerhub所编写的描述,可以选择不写
            STARS:镜像的点赞数
            OFFICIAL:是官网提供的镜像
            AUTOMATED:是喜爱者自己编写的镜像上传(也就是说是非官方提供的镜像)

            2.4.拉取(下载)镜像
                docker pull 镜像名:版本号
                如果拉取镜像的时候不指定版本号,则下载的就是最新版(latest)
                如果指定版本号拉取出来的就是对应的版本

            2.5.删除镜像
                docker rmi
                删除单个镜像:
                    可以根据id删除,也可以根据镜像的名称来删除
                    docker rmi 镜像的id
                    这个时候发现当某一个镜像正在被使用的时候,无法删除
                    docker rmi -f 镜像的id(强制删除,就算打开了也可以直接删除)

                删除多个镜像:
                    docker rmi -f(强制删除) 镜像名 镜像名 镜像名...

                删除所有镜像:
                    eg:
                        使用SQL语句删除某一张表下的所有数据
                        如果想要删除所有数据,就必须要先知道所有数据的id主键
                        delete from user where id in (select id from user);
                    如果优化SQL语句(至少要5条)
                    -qa:查看所有镜像的id
                    再通过镜像的id删除所有的镜像
                    docker rmi -f $(docker images -qa)

            2.6.把docker上已经存在的镜像保存到本机硬盘上(开发完毕之后,把所有的环境制作成镜像,保存到本机硬盘上)
                docker save -o centos:6.10(把镜像保存在本机上所显示的名称) seven:6.10(所要保存到本机硬盘的镜像名称)
                这个文件就会保存在当前所在目录

            2.7.把本机硬盘上的镜像导入到docker中(运维把开发完毕的镜像导入到甲方服务器的docker中)
                两种实现方式:
                    效果一模一样,只是命令不一样(其他的没有任何区别)
                    1.docker load --input 本机硬盘上的镜像名称(是否可以支持同时导入多个,自己尝试)
                    2.docker load < 本机硬盘上的镜像名称

        3.容器命令(重点,程序员所必须要会的命令)
            3.1.通用镜像来创建一个容器(一个镜像可以创建多个容器)
                docker run 镜像名称:版本号
                    所拥有的参数:
                        --name="":给容器起一个名字(不是必要参数,如果不指定,则docker会随机一个名字)
                        -d:后台运行(以守护式进程的形式启动)
                            (下面再聊)
                        -i:以交互的形式来启动容器(一般不会单独存在,经常和-t连用)
                        -t:重新打开一个新的终端(一定不会单独存在,一定要和-i连用)
                        -P:为容器随机端口号
                        -p:为容器自己指定端口号
                    笔试题经常会出现一个判断题:
                        oracle和mysql不区分大小写!  不对
                            select * from user;
                            SELECT * FROM USER;

            3.2.显示所有正在运行的容器
                docker ps
                    所拥有的参数:
                        -a:显示所有的容器信息(包含已经停止和正在运行的所有容器)
                        -q:只显示容器的id
                        -qa:显示所有容器的id(包含已经停止和正在运行的所有容器)
                        -l:(最常用的一个命令)
                            显示出你最近所创建过的一个容器
                        -n:(最常用的一个命令)
                            显示最近所创建的第n个容器
                            docker ps -n 3

                CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
                CONTAINER ID:容器的唯一标识符
                IMAGE:这个容器是由哪一个镜像创建的
                COMMAND:是一个命令行标识
                    windows:bat
                    linux:sh
                    "bin/bash":是让容器运行的命令行(是固定的,而且只能用于Linux)
                CREATED:该容器被创建的时间
                STATUS:该容器的状态
                PORTS:指的是容器的端口号,如果没有则不显示
                NAMES:容器的名称,可以通过--name属性来进行自己指定

            3.3.退出容器
                退出容器有两种:
                    exit:退出容器并且停止容器(容器的状态直接从Up-->Exist)
                    ctrl+p+q:退出容器并且让容器在后台继续运行

            3.4.启动容器
                启动的情况下要去启动状态已经是Exist的容器
                docker start 容器的名字/容器的id

            3.5.重启容器
                docker restart 容器的名字/容器的id
                有两层含义:
                    如果容器的状态为Exist,则是把关机的容器重新启动起来
                    如果容器的状态为Up,则是直接重启容器

            3.6.停止容器
                只能停止当前状态为Up的容器
                docker stop 容器的名称/容器的id

            3.7.强制停止容器
                docker kill 容器的名称/容器的id
                    不推荐使用,实在太粗暴了!

            3.8.删除容器
                删除单个容器:
                    docker rm 容器的名称/容器的id
                删除多个容器:
                    docker rm 容器的id 容器的id..(容器的名称也可以)
                删除所有的容器:
                    也有两种形式:
                        1.docker rm -f(强制删除) $(docker ps -qa)
                        2.docker ps -qa | xargs docker rm -f(强制删除)

            !!!3.9.以守护式进程启动容器(使用非常广泛)
                docker run -d centos:6.10--->只会把这个容器创建出来,但是并不会直接启动
                如果不需要的时候,则就不会占用服务器的资源,如果一旦需要了直接启动唤醒即可

                使用场景:
                    咱们的这个团队的项目非常非常大,需要非常多的中间件来把整个项目协调
                    明白(redis:200台,ES(1000台),zookeeper(171台)),也就是说一共需要1371台服务器才能把整个项目运行起来
                    这个时候docker就开始不断的创建容器了,当创建到1300台的时候发现服务器的资源被沾满了,剩余71台就无法启动了,可能就会导致整个项目出问题
                    但是并不是说所有的服务器都必须要处于一个启动状态,以ES为例,比如并发小于5000的时候只需要启动大概100台就够了,所以这个时候我就会把这些所有的容器都以守护式的进程启动,使用到哪一个容器直接唤醒,这么一来的情况下就大大减少了服务器的资源

                3.10.查看容器的详细信息(数据卷的时候会使用)
                    docker inspect 容器的id

                !!!!3.11.重新以交互式的形式进入到容器里面(1.容器必须要是Up状态,2.必须是在后台已经成功启动,也就是说使用docker ps直接可以查看到)
                    1.docker exec -it 容器的id(一般情况下,简单的查看命令使用这个命令)
                        他并不会直接打开一个新的终端,而是直接返回你想要的结果
                        需求:
                            查看centos6.10 id为d0c3c1d827db容器中根目录下是否有文件夹
                            cd /
                            ll(这个命令并不是centos自带的,是一些插件包所提供) ls ls -l
                            如果安装的是一个非常纯净的centos系统,则没有这个命令(ls -l代替)
                            docker exec -it d0c3c1d827db(容器的id) ls -l
                            docker exec -it d0c3c1d827db(容器的id):
                                进入到这个容器里面
                            ls -l:所需要在容器中执行的操作

                    !!!2.docker attach 容器的id
                        进入容器,重新以新的终端打开(可以让你直观的直接去操作)

            4.docker的实例(实际运行)
                4.1.运行tomcat
                    -P:docker随机端口号
                    -p:指定端口号
                    4.1.1.从dockerhub中拉取tomcat8.5的镜像到本地仓库
                        docker pull tomcat:8.5
                    4.1.2.从tomcat镜像中启动容器
                        docker run -it -P tomcat:8.5

                        docker run -it -p 8081:8080 tomcat:8.5

                4.2.通过容器创建镜像(通过容器去创建一个镜像(好久没有操作了,下周讲springcloud的时候讲这个))
                    docker commit -a="作者的名字" -m="这个镜像的描述" 容器的id 通过该容器所生成的镜像名称:版本号

            5.数据卷(其实他的用处非常大)
                什么是数据卷?
                    把容器中的数据自动的持久化到本机硬盘上,称之为数据卷(也称之为数据共享)

                需求:
                    在本机Linux上有一个文件夹(/home/hostData)
                    在docker中的centos6.10也有一个文件夹(/home/containerData)
                    现在我要做的是让hostData和containerData做数据共享
                    !! 以上的所有操作都不需要手动创建 !!
                    /**5.1.运行docker中centos6.10系统
                        docker run -it centos:6.10 */
                    5.2.直接执行命令实现数据共享
                        docker run -it -v /本机共享文件夹的路径(/home/hostData):/容器中共享文件夹的路径(/home/containerData) 镜像名:版本号
                    5.3.检测配置是否成功
                        docker inspect 8948a38d5bf1

                这里有面试题:(高频面试题)
                    如果我现在把容器停掉,去修改主机上的共享文件夹数据,容器再次启动的时候容器中共享文件夹是否会去改变数据?
                    会
                    这里使用的是双向监听:
                        主机会去一直监听容器的状态,当监听到容器宕机之后,这个时候去修改主机上数据(主机会记录我的数据已经改变),当主机再次监听到容器重启了,(在发送数据之前,先去检测容器中的数据和主机中的数据是否一致)这个时候会主动的发送数据给容器

                    验证:
                        1.停止容器
                            exit
                        2.去修改主机上的数据
                            vim 123.txt--->111111
                        3.重新启动容器
                            docker start 8948a38d5bf1
                        4.以新的终端重新进入容器
                            docker attach 8948a38d5bf1

        6.带权限的数据共享
            这个权限只能限制容器,不能限制主机
            适用场景:
                经常适用于读写分离
                (看图!)
            让centos6.10这个新创建的容器(containerData1)对于主机上的hostData1这个目录只有读,没有写的权限

            docker run -it -v /主机中共享文件夹的目录(/home/hostData1):/容器中的共享文件夹的目录(/home/containerData1):ro 镜像的名称:版本号

            检测是否配置成功:
                docker inspect 容器的id(1e911123a76b)
                看到以下信息为false说明权限配置成功:
                    "VolumesRW": {
                        "/home/containerData1": false
                    }

        7.docker实例
            7.1.使用docker部署mysql
                7.1.1.从dockerhub上把mysql5.7拉取下来
                    docker pull mysql:5.7
                7.1.2.通过mysql:5.7镜像去创建容器,并且把数据持久化到本机硬盘上(数据卷)
                    最终会持久化mysql配置相关的数据
                    -v /home/mysql/conf:/etc/mysql/conf.d
                        指定主机上/home/mysql/conf和容器中/etc/mysql/conf.d目录做数据共享

                    -v /home/mysql/logs:/logs

                    -v /home/mysql/data:/var/lib/mysql

                    docker run --name=mysql -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

            7.2.docker部署redis
                7.2.1.先从dockerhub上把redis5.0.3拉取下来
                    docker pull redis:5.0.3
                7.2.2.创建和运行容器,并且持久化配置数据到本机硬盘上(数据卷)
                    (虽然redis的默认端口号是6379,但是最好不要去使用redis的默认端口号)
                    (这是开发细节)
                    docker run --name=redis01 -p 6380:6379 -v /home/redis/data:/data -v /home/redis/conf/redis:/usr/local/etc/redis/redis.conf -d redis:5.0.3
                7.2.3.如何检测redis配置成功
                    docker exec -it 容器的id redis-cli

报错:(记录到笔记本上去)
    FATAL: kernel too old(说明内核太老了,需要升级)
    1.换系统(centos7.2以上即可)
        比较简单,但是需要把之前配置所有的东西全部整一遍(反而更耽误事)
    2.给centos6.10升级内核
        2.1.首先先更新nss
            yum update nss
        2.2.重新安装和导入新的RPM秘钥
            第一种形式:
                使用绿色版进行安装(如果网络不好的时候使用这个安装比较好)
            第二种形式:
                直接使用rpm版本来进行安装
                    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
        2.3.安装noarch(内核必要的类库)
            rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
        2.4.更新内核
            2.4.1.升级到最新版(kernel-ml)
                虽然是最新版,但是不一定稳定
                yum --enablerepo=elrepo-kernel -y install kernel-ml
            2.4.2.升级到最稳定的长期支持版本(里程碑版本)(推荐使用)
                yum --enablerepo=elrepo-kernel -y install kernel-lt
        2.5.更新内核启动顺序
            vim /etc/grub.conf
            default=1--->0
        2.6.重启服务器
            reboot