庐山真面目之十四微服务架构的Docker虚拟技术深入探究

一、我的开场白

     曾几何时,分布式的发展也影响了后来的微服务架构的实现方式。到了现在,只要涉及到互联网技术领域,就会设计一个概念,那就是微服务。微服务的发展也带动另外一个种技术的发展,那就是虚拟化和容器化的技术走向成熟。现在的技术人员,尤其是互联网的技术人员,大家讨论的一个话题就是微服务,容器化,这两个概念好像是一对孪生兄弟一样,提到他就比涉及另外一个。如果你做了互联网这么多年,到现在,不知道微服务或者是容器化,就是一种很丢脸的行为。有时候你不懂这些东西,都不敢和别人说你是做互联网开发的。
    为了迎合大家的品味,也让自己显得更有品味,今天我们就也来谈谈虚拟化,其实,我的这个说法是有些欠妥的,为什么,我们通常所说的虚拟容器,默认一般就是指Docker技术。我们既然也是俗人,当然不能免俗了。我们今天就谈谈Docker。大家不要拍砖,我也是刚进来的,属于胡说瞎扯,大侠们,别当真,或者我这些都不能入你们的法眼。

    说道Docker,它包括三个基本概念,分别是:镜像,容器和仓库,我们分别来介绍。

      镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。如果感觉很抽象,那就换个说法,它就是一个模板,这个模板是唯一的。

      容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是定义的静态类型,容器是根据镜像运行而生成的实体。容器可以被创建、启动、停止、删除、暂停的,当然还有其他的操作。
  
      仓库(Repository):仓库是保存东西的,保存什么的呢?答案就是用来保存镜像的。

    用我们的白话说,在仓库里面保存了很多镜像,类似模板,我们不能直接使用模板,需要从仓库里面取出模板,也就是镜像,然后,根据镜像,生成容器,容器是活的东西,有生命的。可以执行启动、停止等操作。Docker 使用客户端/服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

二、Docker简介

    在第一节里,我们简单的介绍了一下Docker 的组成,也就是三个重要的组件。可能大家还是云里雾里的,接下来,我们就比较详细的来说一下这个激动人心的技术Docker吧。

     1、身世之谜

        说到我们今天的主角Docker,它的来头可不小,出生名门,大家闺秀。它是Google公司推出的,出身名门,不错吧。它是干什么的呢?它是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者轻松打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,同时,也可以实现虚拟化。Docker 容器是使用沙箱机制实现隔离,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

        Docker 从 17.03 版本之后分为 CE(Community Edition:社区版) 和 EE(Enterprise Edition:企业版),我们用社区版就可以了。每个季度,企业版和社区不能都会发布一个稳定版本。社区版本提供4个月的支持,企业版本会提供12月的支持。
               从2017年第一季度开始,Docker版本号遵循YY.MM-xx格式,类似于Ubuntu等项目。例如:2018年6月第一次发布的社区版本为:18.06-ce。注意:2017年第一季度以前,Docker版本号遵循大版本号.小版本号的格式,采用新的格式前的最后一个版本是Docker1.13。
                 接下来,我们看看Docker hub,Docker Image,Docker Repository,Container和Client是如何协作的。
               

       大致流程如下:当我们使用docker pull命令的时候,它会首先从本地拉取镜像,如果本地没有相应的镜像,Docker就会去远程服务Docker hub上拉取相应的镜像。当镜像拉取到本地,我们就可以通过docker  run 命令创建容器。当然,这个容器是根据相应的镜像生成的。有了容器,我们的操作就很多了,可以启动容器,关闭容器,查看容器实例,查看容器日志,删除容器等操作。我们可以使用Docker Build命令生成自己的镜像,当然,也可以把我们自己的镜像通过Docker push命令推送到服务器。仓库(Repository)分为公用仓库和私有仓库。为了进行说明,我制作了一个表格,看起来更详细。

基础概念

详细说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板,比如:面向对象编程中我们声明的 Class。

Docker 容器(Container)

镜像是模板,容器是根据模板创建而成的,容器是独立运行的一个或一组应用。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。

Docker 服务器(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker Registry

Docker 仓库用来保存镜像,可以类比源代码管理,Docker Repository可以理解为源代码管理中的代码仓库。

Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Machine

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。


          2、Docker是如何实现隔离?

          
                  应用和应用之间的隔离在操作系统方面来说是通过Namespace(名称空间)资源隔离来实现的。我们只有实现了以下六个维度的隔离才能说应用A和应用B在物理意义上实现了隔离。接下来我们就从这六个方面来说Docker是如何实现隔离的。

                    1、PID(进程编号):它的内核版本是:2.6.24,这个内核版本是说,我们安装的操作系统必须大于或者等于这个版本,否则就不能实现该服务的隔离。就是应用程序A在它自己的运行环境中的进程编号是1,应用程序B在它自己的运行环境中的进程编号也可以是1,两个进程相互独立,互不干扰。

                    2、NET(网络设备、网络协议栈、端口等):它的内核版本是:2.6.29,这个内核版本是说,我们安装的操作系统必须大于或者等于这个版本,否则就不能实现该服务的隔离。网络设备,也就是网卡是相互独立的,网络协议栈也是相互独立的,我们用的最多的协议栈就是TCP协议栈,就是说,应用A可以有自己的一套TCP协议栈,应用B也有自己的一套TCP协议栈,当然端口,也要是相互独立的,应用A可以监听80端口,应用B也可以监听80端口。这样才可以叫在网络层面是隔离的。

                   3、IPC(信号量、消息队列、共享内存):内核版本:2.6.19,这个内核版本是说,我们安装的操作系统必须大于或者等于这个版本,否则就不能实现该服务的隔离。IPC理解起来,可能要麻烦点,它可以理解为进程之间的通信。这里说隔离,就是值应用不会共享信号浪、消息队列和共享内容。每个应用都有自己的信号量、消息队列和共享内存,避免互相干扰。

                   4、MOUNT(文件系统、挂载点):内核版本是:2.4.19,这个内核版本是说,我们安装的操作系统必须大于或者等于这个版本,否则就不能实现该服务的隔离。应用A和应用B都有自己相互独立文件系统,比如:有自己的根,有自己的文件系统树,有自己的Opt,有自己的bin。

                   5、UTS(主机名和主机域):内核版本是:2.6.19,这个内核版本是说,我们安装的操作系统必须大于或者等于这个版本,否则就不能实现该服务的隔离。两个实例应用运行在自己的容器中,他们会有自己的主机名和主机域,这是不干扰,相互独立的。

                     6、USER(操作进程的用户和用户组):内核版本是:3.8.x,这个内核版本是说,我们安装的操作系统必须大于或者等于这个版本,否则就不能实现该服务的隔离。在Linux操作系统中,一个应用运行起来了,必须依赖一个用户,要不依赖root用户,要不依赖普通用户。因为你要以用户特定身份提供服务,所以用户的空间也应该是独立。
              
            如果我们想要用好虚拟技术,CentOS版本必须在7以上,或者是Ubuntu,它的内核版本更高,Ubuntu Server 18,它的内核版本是4.10以上了。Docker是2013年出现的,它也是基于LXC技术是在2008年出现的,它也实现了六个维度的隔离,但是还是很不完善。后来Docker的出现,真正实现了六个维度隔离,并且统一了规范。
        

    3、Docker的应用场景

            Web 应用的自动化打包和发布。

            自动化测试和持续集成、发布。

            在服务型环境中部署和调整数据库或其他的后台应用。

            从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

    4、Docker 的优点

      Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

        1、快速,一致地交付您的应用程序

            Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

            容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
               您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
               他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
               当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
               测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。

        2、响应式部署和扩展

            Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
            Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。


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

            Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

    5、Docker 和虚拟机的区别

        5.1、虚拟技术发展史
              (1)、单独物理机【独栋别墅】
                     
                     有钱人就住自己的大别墅,有自己的草坪,独立的花园,漂亮的游泳池,当然,还有很多根本没时间住的房间,对于个人来说,当然很舒服,也是我们每个人向往的生活。但是,对于土地资源来说,利用率不高。对于网络环境来说,也是同样的道理。刚开始的时候,人们的系统都是部署在自己购买的独立的物理机中,这样的物理机有着一套完整的操作系统,安全系统,网络环境,还有很多用不到的功能,什么都有自己的独立的一套,完全没有重用的概念。每套系统就对应着这么一套完整的东西,包括硬件、软件和网络等资源,大系统是这样,小系统也是这样,这样下去肯定不行。

              (2)、虚拟机时代【高楼社区】
                     
                     虚拟技术发展的第二阶段就是虚拟机时代,这个时代,就和我们居住的社区一样,人们通过在城市买房子居住在高档社区里,这个时候比第一个阶段要好很多,可以共享很多,比如:门禁、保安、地基、物业等公共服务。但是,每个家庭还是一个独立的单元,有自己独立的卫生间,独立卧室,厨房、餐厅和网络等。这个时代的网络环境、服务器技术得到了高速发展,人们开始注意资源的利用率。虚拟机的技术也得到了很好的发展和使用,我们可以在一台大型机器上部署多台虚拟机,这个大型机器,就像我们居住的小区楼房,这样一来,提高了资源利用率,可以共用硬件、网络和其他一些基础设施,但是每个虚拟机内部还有一套完整的操作系统,服务组件等,这个时候的虚拟机使用起来,感觉和使用物理机的差别不大。

              (3)、Docker容器【胶囊公寓】
                    
                    虚拟技术发展的第三个阶段就是极简模式,也可以叫“胶囊公寓”模式。胶囊公寓这种居住方式在寸土寸金的大城市,比如:日本的东京,我国的香港还挺普遍的。在这样的公寓里,只提供一个人休息、睡觉的最基本的地方和功能,其他多余的功能一概没有,那个时候除了床、被子和灯光是你可以控制的,其他都是公用的。Docker容器技术就是这个时代的产物,为了提高资源的利用率,开始对虚拟机进行瘦身,进而诞生了容器技术,容器内部不在包含完整的操作系统,是一个极简版本的操作系统,能运行软件所必须的系统环境,除了精简的系统外,就是程序运行所依赖的必须环境,再者就是要部署的程序了。

        5.2、二者区别,看图理解吧!

                 
                 虚拟机就是我们社区的高楼,容器就是“胶囊公寓”
                 

       5.3、容器能给我们带来什么呢,当然有好处了,没有好处我们就不会使用它了!
       
         


三、Docker的常用命令

      1、我们先看我们系统的内核版本是否支持,最少要在3.8版本以上。

        命令:#uname –a

        [root@localhost ~]# uname -a
        Linux localhost.patrickliu 3.10.0-1062.12.1.el7.x86_64 #1 SMP Tue Feb 4 23:02:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

   
      2、查看CentOS7的版本。

        命令:#cat /etc/redhat-release

        [root@localhost ~]# cat /etc/redhat-release
        CentOS Linux release 7.7.1908 (Core)

 

      3、查看状态,必须是Disabled。

        命令:#getenforce

        [root@localhost ~]# getenforce
        Disabled

 

      4、我们要把防火墙先关掉。

        命令:#systemctl stop firewalld

        [root@localhost ~]# systemctl stop firewalld

 

      5、查看我们内存是否满足需求。

        命令:free –m

        [root@localhost ~]# free -m
                      total        used        free      shared  buff/cache   available
        Mem:            972         241         489           7         240         585
        Swap:          2047           0        2047 

 

      6、然后看看,我们的外网是否是通的。

        命令:#ping www.baidu.com 随便网址。

        [root@localhost ~]# ping www.baidu.com
        PING www.a.shifen.com (39.156.66.18) 56(84) bytes of data.
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=128 time=14.5 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=2 ttl=128 time=14.2 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=3 ttl=128 time=18.1 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=4 ttl=128 time=13.8 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=5 ttl=128 time=14.8 ms
        ^C

        --- www.a.shifen.com ping statistics ---
        5 packets transmitted, 5 received, 0% packet loss, time 13069ms
        rtt min/avg/max/mdev = 13.865/15.120/18.116/1.538 ms

 

            7、查看yum源是否安装。

                   命令:#cat /etc/yum.repos.d/

                           cat /etc/yum.repos.d/local.repo

                           rm /etc/yum.repos.d/local.repo

                [root@localhost ~]# ls /etc/yum.repos.d/
            CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo  microsoft-prod.repo
          CentOS-CR.repo         CentOS-Media.repo      docker-ce.repo
          CentOS-Debuginfo.repo  CentOS-Sources.repo    jenkins.repo        

 

    8、安装base源,它是基础源。

        命令:#curl –o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

        命令:#wget –O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo(重新下载CentOS-Base.repo文件,文件损坏的情况下)

          命令:#rm -f /etc/yum.repos.d/* (删除/etc/yum.repos.d/目录下的所有文件)

    9、安装epel源

        命令:#yum install epel-release –y

        [root@localhost ~]# yum install epel-release –y
        已加载插件:fastestmirror
        Determining fastest mirrors
         * base: mirrors.163.com
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        base                                                                    | 3.6 kB  00:00:00
        docker-ce-stable                                                        | 3.5 kB  00:00:00
        extras                                                                  | 2.9 kB  00:00:00
        jenkins                                                                 | 2.9 kB  00:00:00
        packages-microsoft-com-prod                                             | 3.0 kB  00:00:00
        updates                                                                 | 2.9 kB  00:00:00
        (1/5): extras/7/x86_64/primary_db                                       | 227 kB  00:00:03
        (2/5): docker-ce-stable/7/x86_64/primary_db                             |  58 kB  00:00:04
        (3/5): updates/7/x86_64/primary_db                                      | 6.5 MB  00:00:04
        (4/5): packages-microsoft-com-prod/primary_db                           | 335 kB  00:00:04
        (5/5): jenkins/primary_db                                               | 166 kB  00:00:06
        正在解决依赖关系
        --> 正在检查事务
        ---> 软件包 epel-release.noarch.0.7-11 将被 安装
        --> 解决依赖关系完
        依赖关系解决
        ===============================================================================================
         Package                    架构                 版本               源                    大小
        ===============================================================================================
        正在安装:
         epel-release               noarch               7-11               extras                15 k
        事务概要
        ===============================================================================================
        安装 1 软件包
        总下载量:15 k
        安装大小:24 k
        Is this ok [y/d/N]: y
        Downloading packages:
        epel-release-7-11.noarch.rpm                                            |  15 kB  00:00:02
        Running transaction check
        Running transaction test
        Transaction test succeeded
        Running transaction
          正在安装    : epel-release-7-11.noarch                                                   1/1
          验证中      : epel-release-7-11.noarch                                                   1/1
          已安装:
          epel-release.noarch 0:7-11
        完毕!

 

      10、其实在epel源里面也有docker引擎的文件包。

        命令:yum list docker –show-duplicates

        [root@localhost ~]# yum list docker –show-duplicates
        已加载插件:fastestmirror
        Loading mirror speeds from cached hostfile
        epel/x86_64/metalink                                                    | 6.9 kB  00:00:00
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        epel                                                                    | 4.7 kB  00:00:00
        (1/3): epel/x86_64/group_gz                                             |  96 kB  00:00:03
        (2/3): epel/x86_64/updateinfo                                           | 1.0 MB  00:00:00
        (3/3): epel/x86_64/primary_db                                           | 6.9 MB  00:00:00
        可安装的软件包
        docker.x86_64                        2:1.13.1-204.git0be3e21.el7                         extras

 

      11、如果我们想通过yum 来安装Docker,必须安装一下工具。

        命令:#yum install –y yum-utils         

       [root@localhost ~]# yum install –y yum-utils
        已加载插件:fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        软件包 yum-utils-1.1.31-54.el7_8.noarch 已安装并且是最新版本
        无须任何处理

 

      12、然后我们将阿里云Docker-ce的yum仓库增加到本地操作系统仓库里面了。

        命令:#yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        [root@localhost ~]# yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        已加载插件:fastestmirror
        adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
        repo saved to /etc/yum.repos.d/docker-ce.repo

 

      13、查看我们本地仓库中是否存在docker-ce包文件。

        命令:#yum list docker-ce --show-duplicates

        [root@localhost ~]# yum list docker-ce --show-duplicates
        已加载插件:fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        已安装的软件包
        docker-ce.x86_64                   3:19.03.13-3.el7                           @docker-ce-stable
        可安装的软件包
        docker-ce.x86_64                   17.03.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.03.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.03.2.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.03.3.ce-1.el7                           docker-ce-stable
        docker-ce.x86_64                   17.06.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.06.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.06.2.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.09.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.09.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.12.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.12.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   18.03.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   18.03.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   18.06.0.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   18.06.1.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   18.06.2.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   18.06.3.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:18.09.0-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.1-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.2-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.3-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.4-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.5-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.6-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.7-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.8-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.9-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.0-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.1-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.2-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.3-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.4-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.5-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.6-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.7-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.8-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.9-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.10-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.11-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.12-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.13-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.14-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.15-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:20.10.0-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.1-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.2-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.3-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.4-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.5-3.el7                            docker-ce-stable

  

      14、我们可以安装了Docker-ce了,默认安装最新版,可以跟指定版本安装特定版本。

        命令:#yum install docker-ce –y

        [root@localhost ~]# yum install docker-ce –y
        已加载插件:fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        正在解决依赖关系
        --> 正在检查事务
        ---> 软件包 docker-ce.x86_64.3.19.03.13-3.el7 将被 取代
        ---> 软件包 moby-engine.x86_64.0.20.10.5+azure-1.el7 将被 舍弃
        --> 正在处理依赖关系 moby-containerd >= 1.3.9,它被软件包 moby-engine-20.10.5+azure-1.el7.x86_64 需要
        --> 正在处理依赖关系 moby-runc >= 1.0.0~rc93,它被软件包 moby-engine-20.10.5+azure-1.el7.x86_64 需要
        --> 正在检查事务
        ---> 软件包 moby-containerd.x86_64.0.1.4.4+azure-1.el7 将被 安装
        ---> 软件包 moby-runc.x86_64.0.1.0.0~rc93+azure-1 将被 安装
        --> 处理 moby-runc-1.0.0~rc93+azure-1.x86_64 与 runc 的冲突
        --> 正在使用新的信息重新解决依赖关系
        --> 正在检查事务
        ---> 软件包 containerd.io.x86_64.0.1.3.7-3.1.el7 将被 升级
        ---> 软件包 containerd.io.x86_64.0.1.4.4-3.1.el7 将被 更新
        --> 处理 moby-runc-1.0.0~rc93+azure-1.x86_64 与 runc 的冲突
        --> 处理 moby-containerd-1.4.4+azure-1.el7.x86_64 与 containerd 的冲突
        --> 解决依赖关系完成
        。。。。。
        安装到完成。


         如果提示:            
            
您可以尝试添加 --skip-broken 选项来解决该问题
            
您可以尝试执行:rpm -Va --nofiles --nodiges
         解决办法:

            //只需要清除yum 缓存即可
            yum clean all

 

 

      15、docker-ce安装完毕后,设置它开机启动。

        命令:#systemctl enable docker

        [root@localhost ~]# systemctl enable docker

 

      16、设置完开机启动后,我们要启动Docker了。

        命令:#systemctl start docker

          [root@localhost ~]# systemctl start docker  

 

      17、我们先要配置Docker,修改其 daemon.json配置文件。

        命令:#vim /etc/docker/daemon.json

        {
        "graph":"/data/docker",//docker的工作目录
        "storage-driver":"overlay2",//存储驱动
        "insecure-registies":["registry.access.redhat.com","quay.io"],//私有仓库
        "registry-mirrors":["https:q2gr04ke.mirror.aliyuncs.com"],//因为我们要从register上拉取镜像,需要一个国内的加速源,所以在此配置了一个阿里的加速云的加速源。
        "bip":"172.7.5.0/24",//Docker的网络,容器地址和宿主机地址有一个对应
        "exec-opts":["native.cgroupdriver=systemd"],//启动的时候额外的参数。google在2007年将cgroup写到linux内核里的。
        "live-restore":true//Docker引擎失败了,但是Docker依然存活。
        }

 

      18、我们如何查看Docker的网络。

        命令:#ip add

        [root@localhost ~]# ip add
        1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
            link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
            inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
            inet6 ::1/128 scope host
            valid_lft forever preferred_lft forever
        2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
            link/ether 00:0c:29:c6:32:2d brd ff:ff:ff:ff:ff:ff
            inet 10.4.7.137/24 brd 10.4.7.255 scope global noprefixroute dynamic ens33
            valid_lft 1275sec preferred_lft 1275sec
            inet6 fe80::5a9f:c8ce:fc84:340f/64 scope link noprefixroute
            valid_lft forever preferred_lft forever
        3: br-e7f6774da423: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:50:ed:97:13 brd ff:ff:ff:ff:ff:ff
            inet 172.20.0.1/16 brd 172.20.255.255 scope global br-e7f6774da423
            valid_lft forever preferred_lft forever
        4: br-54f0bf11f227: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:45:07:cd:31 brd ff:ff:ff:ff:ff:ff
            inet 172.18.0.1/16 brd 172.18.255.255 scope global br-54f0bf11f227
             valid_lft forever preferred_lft forever
        5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:00:51:15:94 brd ff:ff:ff:ff:ff:ff
            inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
            valid_lft forever preferred_lft forever
        6: br-9f24d73a3b72: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:a0:0c:39:91 brd ff:ff:ff:ff:ff:ff
            inet 172.19.0.1/16 brd 172.19.255.255 scope global br-9f24d73a3b72
             valid_lft forever preferred_lft forever

 

      19、我们使用的第一个命令。

        命令:#docker info

        [root@localhost ~]# docker info
        Client:
        Debug Mode: false
        Server:
         Containers: 0
          Running: 0
          Paused: 0
          Stopped: 0
         Images: 7
         Server Version: 19.03.13
         Storage Driver: overlay2
          Backing Filesystem: xfs
          Supports d_type: true
          Native Overlay Diff: true
         Logging Driver: json-file
         Cgroup Driver: cgroupfs
         Plugins:
          Volume: local
          Network: bridge host ipvlan macvlan null overlay
          Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
         Swarm: inactive
         Runtimes: runc
         Default Runtime: runc
         Init Binary: docker-init
         containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
         runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
         init version: fec3683
         Security Options:
          seccomp
           Profile: default
         Kernel Version: 3.10.0-1062.12.1.el7.x86_64
         Operating System: CentOS Linux 7 (Core)
         OSType: linux
         Architecture: x86_64
         CPUs: 4
         Total Memory: 972.4MiB
         Name: localhost.patrickliu
         ID: MIHL:XZIG:MTEG:4IY2:LDBT:AUTN:RKGL:GBE3:G5VR:CLTX:IWMW:ISLH
         Docker Root Dir: /var/lib/docker
         Debug Mode: false
         Username: patrickliu1979
         Registry: https://index.docker.io/v1/
         Labels:
         Experimental: false
         Insecure Registries:
          127.0.0.0/8
         Registry Mirrors:
          http://hub-mirror.c.163.com/
         Live Restore Enabled: false

    

      20、运行第一个容器。

        命令:#docker run hello-world

        [root@localhost ~]# docker run hello-world
        Unable to find image 'hello-world:latest' locally
        latest: Pulling from library/hello-world
        b8dfde127a29: Pull complete
        Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
        Status: Downloaded newer image for hello-world:latest
 
        Hello from Docker!
        This message shows that your installation appears to be working correctly.
 
        To generate this message, Docker took the following steps:
         1. The Docker client contacted the Docker daemon.
         2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64)
         3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
         4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

        To try something more ambitious, you can run an Ubuntu container with:
         $ docker run -it ubuntu bash

        Share images, automate workflows, and more with a free Docker ID:
        https://hub.docker.com/

        For more examples and ideas, visit:
        https://docs.docker.com/get-started/

          

       21、查看Docker的版本。

          命令:#docker  version  

          [root@localhost ~]# docker version
          Client: Docker Engine - Community
           Version:           19.03.13
           API version:       1.40
           Go version:        go1.13.15
           Git commit:        4484c46d9d
           Built:             Wed Sep 16 17:03:45 2020
           OS/Arch:           linux/amd64
           Experimental:      false

          Server: Docker Engine - Community
           Engine:
            Version:          19.03.13
            API version:      1.40 (minimum version 1.12)
            Go version:       go1.13.15
            Git commit:       4484c46d9d
            Built:            Wed Sep 16 17:02:21 2020
            OS/Arch:          linux/amd64
            Experimental:     false
           containerd:
            Version:          1.3.7
            GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
           runc:
            Version:          1.0.0-rc10
            GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
           docker-init:
            Version:          0.18.0
            GitCommit:        fec3683

 

              22、镜像的结构

                            ${register_name}/${repository_name}/${image_name}:${tag_name}

                    Register_name:远端仓库的地址。

                    Repository_name:分类仓库的名称。

                    Image_name:镜像的名称。

                    Tag_name:标签的名字。

                    例如:docker.io/library/alpine:3.10.1

                    Register_Name:docker.io

                    Repository_Name:library,library是公开的仓库。

                    Image_Name:alpine

                    Tag_Name:3.10.1,一般用版本号做标签,你可以用时间戳等。

             23、世界上最大的Docker Hub仓库。

                    登录地址:https://hub.docker.com/,在此需要注册自己的账号。

                        

          注册地址:https://hub.docker.com/signup

          界面图下:

             

          在注册账号的时候,需要验证邮箱,这个大家要注意一下。


          24、登录 docker.io,登录后可以和服务器进行沟通。

            命令:#docker login docker.io

            [root@localhost ~]# docker login docker.io
            Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.

            Username: patrickliu1979
            Password:********
            WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
            Configure a credential helper to remove this warning. See
            https://docs.docker.com/engine/reference/commandline/login/#credentials-store

            Login Succeeded


        25、您登录的认证结果保存位置。

            保存目录:/root/.docker/config.json 

            [root@localhost ~]# cat /root/.docker/config.json
            {
                    "auths": {
                            "https://index.docker.io/v1/": {
                                    "auth": "cGF0cmlja2xp****************MwNjMw"
                            }
                    },
                   "HttpHeaders": {
                           "User-Agent": "Docker-Client/19.03.13 (linux)"
                   }
            }

 


        26、查看登录docker.io密码和账号:

            [root@localhost ~]# echo "cGF0cmlja2xp****************MwNjMw"|base64 -d 
            patr**********:************


        27、在docker hub上查询镜像

            命令:#docker search redis

          [root@localhost ~]# docker search redis
          NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
          redis                            Redis is an open source key-value store that…   9232                [OK]       
          bitnami/redis                    Bitnami Redis Docker Image                      176                                     [OK]
          sameersbn/redis                                                                  82                                      [OK]
          grokzen/redis-cluster            Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2      77                             
          rediscommander/redis-commander   Alpine image for redis-commander - Redis man…   55                                      [OK]
          redislabs/redisearch             Redis With the RedisSearch module pre-loaded…   32                             
          redislabs/redis                  Clustered in-memory database engine compatib…   29                             
          redislabs/redisinsight           RedisInsight - The GUI for Redis                25                             
          oliver006/redis_exporter          Prometheus Exporter for Redis Metrics. Supp…   24                             
          redislabs/rejson                 RedisJSON - Enhanced JSON data type processi…   24                              
          arm32v7/redis                    Redis is an open source key-value store that…   22                             
          bitnami/redis-sentinel           Bitnami Docker Image for Redis Sentinel         19                                      [OK]
          redislabs/redisgraph             A graph database module for Redis               15                                      [OK]
          arm64v8/redis                    Redis is an open source key-value store that…   11                             
          webhippie/redis                  Docker images for Redis                         11                                      [OK]
          s7anley/redis-sentinel-docker    Redis Sentinel                                  10                                      [OK]
          redislabs/redismod               An automated build of redismod - latest Redi…   9                                       [OK]
          insready/redis-stat              Docker image for the real-time Redis monitor…   9                                       [OK]
          goodsmileduck/redis-cli          redis-cli on alpine                             7                                       [OK]
          centos/redis-32-centos7          Redis in-memory data structure store, used a…   5                              
          circleci/redis                   CircleCI images for Redis                       5                                       [OK]
          clearlinux/redis                 Redis key-value data structure server with t…   3                              
          tiredofit/redis                  Redis Server w/ Zabbix monitoring and S6 Ove…   1                                       [OK]
          wodby/redis                      Redis container image with orchestration        1                                       [OK]
          xetamus/redis-resource           forked redis-resource                           0                                       [OK]

    
        28、拉取服务器上的镜像,不加Tag,默认下载最新版。
    
              命令:#docker pull alpine

           [root@localhost ~]# docker pull alpine
           Using default tag: latest
           latest: Pulling from library/alpine
           ba3557a56b15: Pull complete
            Digest: sha256:a75afd8b57e7f34e4dad8d65e2c7ba2e1975c795ce1ee22fa34f8cf46f96a3be
           Status: Downloaded newer image for alpine:latest
           docker.io/library/alpine:latest


        29、镜像的结构

              registry_name/repository_name/image_name:tag_name        

        30、查看本地镜像

              命令:#docker images/docker image ls

                   [root@localhost ~]# docker images
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            hello-world            latest              d1165f221234        2 weeks ago         13.3kB
            patrickliu1979/httpd   v2021.228           0cb18c5cffb8        3 weeks ago         337MB
            alpine                 latest              28f6e2705743        4 weeks ago         5.61MB
            nginx                  latest              35c43ace9216        4 weeks ago         133MB
            centos                 7                   8652b9f0cb4c        4 months ago        204MB
            redis                  latest              f0453552d7f2        12 months ago       98.2MB
            hello-world            latest              bf756fb1ae65        14 months ago       13.3kB

            [root@localhost ~]# docker image ls
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            hello-world            latest              d1165f221234        2 weeks ago         13.3kB
            patrickliu1979/httpd   v2021.228           0cb18c5cffb8        3 weeks ago         337MB
            alpine                 latest              28f6e2705743        4 weeks ago         5.61MB
            nginx                  latest              35c43ace9216        4 weeks ago         133MB
            centos                 7                   8652b9f0cb4c        4 months ago        204MB
            redis                  latest              f0453552d7f2        12 months ago       98.2MB
            hello-world            latest              bf756fb1ae65        14 months ago       13.3kB


        31、给镜像打标签

              命令:#docker tag image_id registry_name/repository_name/image_name:tag_name

            说明一下:我们注册账号就是仓库的名称。

              [root@localhost ~]# docker tag f0453552d7f2 docker.io/patrickliu1979/redis:v2021.224    
              [root@localhost ~]# docker image ls
              REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
              alpine                 latest              28f6e2705743        6 days ago          5.61MB
              redis                  latest              f0453552d7f2        11 months ago       98.2MB
              patrickliu1979/redis   v2021.224           f0453552d7f2        11 months ago       98.2MB


        32、推送镜像到docker hub.

              命令:#docker push registry_name/repository_name/image_name:tag_name

            [root@localhost ~]# docker push docker.io/patrickliu1979/redis:v2021.224
            The push refers to repository [docker.io/patrickliu1979/redis]
            2f8c6410a70f: Mounted from library/redis
            bc1e8e75ef31: Mounted from library/redis
            6b3ece100807: Mounted from library/redis
            aaa520a04939: Mounted from library/redis
            56f1f103e9b9: Mounted from library/redis
            f2cb0ecef392: Mounted from library/redis
            v2021.224: digest: sha256:780f7dacdc133e899fba9ff09c099828b469030acefe6f3bbc16197b55800cfd size: 1572

            可以去 docker hub 登录账号,查看我们刚才推送的镜像。


        33、删除镜像

              命令:#docker rmi image_id/docker image rm image_id

              如此删除,只能删除标签,镜像本身不会删除
              [root@localhost ~]# docker rmi patrickliu1979/redis:v2021.224
              Untagged: patrickliu1979/redis:v2021.224
              Untagged: patrickliu1979/redis@sha256:780f7dacdc133e899fba9ff09c099828b469030acefe6f3bbc16197b55800cfd
              [root@localhost ~]#
              [root@localhost ~]# docker image ls
              REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
              alpine              latest              28f6e2705743        6 days ago          5.61MB
              redis               latest              f0453552d7f2        11 months ago       98.2MB
              hello-world         latest              bf756fb1ae65        13 months ago       13.3kB
              hello-world         latest              bf756fb1ae65        13 months ago       13.3kB
              [root@localhost ~]#


              如果想彻底删除镜像,如果有多个标签,先删除标签,在删除镜像文件。-f 强制删除
              [root@localhost ~]#docker rmi -f image_id 


        34、镜像特性

              bootfs-->base image-->.....---->Container(容器层是可写的,其他层只读的)

              每一层镜像的下面一层是上一层的父镜像。

              第一层镜像为Base Image,也叫基础镜像,位于 bootfs 之上。

              容器在最顶层,是可写的。

              其他的所有层都是 ReadOnly只读的。
    
              Docker 将 ReadOnly 的FS 层叫做“镜像”

              Bootfs层是最底层,也是基础层,包含lxc、aufs\btrfs和Kernel(核心部件),无论是往共有仓库还是私有仓库推送都是增量推送。这是Docker基于Aufs构建最好的一点。分层的,增量推送,第一次使用慢而已。

            


        35、docker ps -a(列出所有存活或者退出的容器)/docker ps(列出所有存活的容器)

            [root@localhost ~]# docker ps(现在没有存活的容器)
            CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

            [root@localhost ~]# docker ps –a(列出所有容器)
            CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
            fa7bf2b2b2d7        hello-world         "/hello"            42 minutes ago      Exited (0) 42 minutes ago                       focused_colden


        36、我们开始运行Docker 容器,执行docker run命令。

              命令:#docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

              OPTIONS:
              -i:表示启动一个可交互的容器,并持续打开标准输入
              -t:表示使用终端关联到容器的标准输入输出上。
              -d:表示将容器防置后台运行。
              --rm:退出后及删除容器实例。
              --name:表示定义容器的唯一名称。
              IMAGE:表示容器的模板名称。
              COMMAND:表示启动容器时要运行的命令。

            [root@localhost ~]# docker run -it alpine:latest /bin/sh
            / # ip add
            1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
                link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
                inet 127.0.0.1/8 scope host lo
                   valid_lft forever preferred_lft forever
            7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
                link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
                inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
                   valid_lft forever preferred_lft forever
              / # cat /etc/issue
            Welcome to Alpine Linux 3.13
            Kernel \r on an \m (\l)

            / # exit


        37、docker run --rm alpine:latest /bin/echo hello,一次运行,运行完毕删除容器。

              [root@localhost ~]# docker run --rm alpine:latest /bin/echo hello
              hello


        38、启动一个非交互的后台容器。

              命令:#docker run -d --name myalpine alpine:latest
 

              [root@localhost ~]# docker run -d --name myalpine alpine:latest
             bf1a54d2e377d453ecf0fdd4ee02e57fb75c0c30ac52bf94b7026b866f476ed8
             [root@localhost ~]# docker ps -a
             CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
             bf1a54d2e377        alpine:latest       "/bin/sh"           8 seconds ago       Exited (0) 7 seconds ago                       myalpine
             d18bed8415ff        alpine:latest       "/bin/sh"           7 minutes ago       Exited (0) 4 minutes ago                       elastic_curie
             58a0a905766a        hello-world         "/hello"            3 days ago          Exited (0) 3 days ago                          compassionate_nash


        39、进入到一个up 状态容器

               命令:#docker exec -it containerID /bin/sh

                    [root@localhost ~]# docker exec -it 08708c89b20a /bin/sh    
              / #


        40、我们根据容器的ID或者名称停止处于Up状态的容器。
                        命令:#docker stop containerID/containerName

                    [root@localhost ~]# docker ps(开始查询是有容器实例)
              CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
              08708c89b20a        alpine:latest       "/bin/sh"           2 minutes ago       Up 2 minutes                            gifted_burnell
              [root@localhost ~]# docker stop 08708c89b20a
              08708c89b20a    
                    [root@localhost ~]# docker ps(再次查询,没有容器实例了)
              CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES


              41、我们可以根据容器的ID 或者名称启动处于Exited状态容器。
                       命令:#docker start containerID/containerName

                    [root@localhost ~]# docker ps -a
              CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
              fa7bf2b2b2d7        hello-world         "/hello"            42 minutes ago      Exited (0) 42 minutes ago                       focused_colden
              [root@localhost ~]# docker start fa7bf2b2b2d7
              fa7bf2b2b2d7


              42、我们可以根据容器的ID 或者名称启动处于Exited状态容器。
                      命令:#docker restart containerID/containerName

                   [root@localhost ~]# docker restart fa7bf2b2b2d7
               fa7bf2b2b2d7


              43、我们可以根据容器ID或者名称删除处于Exited 状态的容器。
                      命令:#docker rm containerID/containerName

                   [root@localhost ~]# docker rm fa7bf2b2b2d7
                    fa7bf2b2b2d7


              44、我们可以根据容器ID或者名称强制删除处于Exited 状态的容器。                    
                      命令:#docker rm -f containerID/containerName

                  [root@localhost sha256]# docker rm -f 2702bb89bf2e    
                    2702bb89bf2e    

             45、过滤宿主机上所有退出的容器,并干掉。

            命令#for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done

            [root@localhost ~]# for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done


             46、提交容器,生成镜像。
                     命令:#docker commit

            Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
            Create a new image from a container's changes(根据容器的更改创建新图像)
            [root@localhost ~]# docker commit --help
            Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
            Create a new image from a container's changes
            Options:
              -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")作者(例如,“约翰·汉尼拔·史密斯<hannibal@a-team.com>”)
              -c, --change list      Apply Dockerfile instruction to the created image(将Dockerfile指令应用于创建的映像)
              -m, --message string   Commit message(提交讯息)
              -p, --pause            Pause container during commit (default true)【提交期间暂停容器(默认为true)】
            [root@localhost ~]# docker commit -p redis-test patrickliu1979/redis:v2021.03.26-20.17
            sha256:0d19ea10697344a8fdbbe20c298075a50ca54b7928ca8f236c5c0e94a95c92c4
            [root@localhost ~]# docker images(我们提交的镜像)
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            patrickliu1979/redis   v2021.03.26-20.17   0d19ea106973        42 seconds ago      105MB

    
            47、我们导出镜像,可以执行命令Docker Save。
                     命令:#docker save containerID > name

            Usage:  docker save [OPTIONS] IMAGE [IMAGE...]
            Save one or more images to a tar archive (streamed to STDOUT by default)
            Options:
              -o, --output string   Write to a file, instead of STDOUT

            [root@localhost ~]# docker save 0d19ea106973 > redis:v2021.03.26-20.17.tar.gz
            [root@localhost ~]# ll
            总用量 106188
            -rw-r--r--. 1 root root        71 2月  28 20:31 Dockerfile
            drwxr-xr-x. 2 root root        24 2月  27 20:45 html
            drwxr-xr-x. 4 root root        38 2月   5 13:46 microService
            -rw-r--r--. 1 root root 108728832 3月  26 20:31 redis:v2021.03.26-20.17.tar.gz


            48、如果我们又了导出的镜像文件,可以根据此文件导入镜像。
                     命令:# docker load < 导出的镜像文件名称

            [root@localhost ~]# docker load < redis\:v2021.03.26-20.17.tar.gz
            Loaded image ID: sha256:0d19ea10697344a8fdbbe20c298075a50ca54b7928ca8f236c5c0e94a95c92c4
            [root@localhost ~]# docker images
            REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
            <none>              <none>              0d19ea106973        16 minutes ago      105MB
            以上就是我们导入的镜像,只是没有tag。
            [root@localhost ~]# docker tag 0d19ea106973 patrickliu1979/redis:v2021-3-26.20.38
            [root@localhost ~]# docker images
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            patrickliu1979/redis   v2021-3-26.20.38    0d19ea106973        19 minutes ago      105MB

            我们为没有tag的镜像增加了新的标签。


            49、查看容器对象的日志。

           命令:#docker logs containerID/containerName(-f 动态输出)        

             [root@localhost ~]# docker logs 874e5257e28f -f
                  1:C 26 Mar 2021 12:12:39.051 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
            1:C 26 Mar 2021 12:12:39.051 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=1, just started
            1:C 26 Mar 2021 12:12:39.051 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
            1:M 26 Mar 2021 12:12:39.053 * monotonic clock: POSIX clock_gettime

            还要很多,就不全部贴出来了。


           50、 高级操作

            [root@localhost ~]# docker pull nginx 准备数据
            Using default tag: latest
            latest: Pulling from library/nginx
            45b42c59be33: Pull complete
            8acc495f1d91: Pull complete
            ec3bd7de90d7: Pull complete
            19e2441aeeab: Pull complete
           f5a38c5f8d4e: Pull complete
            83500d851118: Pull complete
            Digest: sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc
            Status: Downloaded newer image for nginx:latest
            docker.io/library/nginx:latest


           51、映射端口

              命令:#docker run -p 容器外端口:容器内端口

            [root@localhost ~]# docker run --rm --name mynainx -d -p 81:80 nginx:latest
            886b2eca87134b500b10a052924903d8808c03a76ce93cc05102087fbb7cc896
            [root@localhost ~]# docker ps -a
            CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
            886b2eca8713        nginx:latest        "/docker-entrypoint.…"   7 seconds ago       Up 4 seconds        0.0.0.0:81->80/tcp   mynainx

            [root@localhost ~]# netstat -luntp |grep 81
            tcp6       0      0 :::81                   :::*                    LISTEN      2323/docker-proxy

            [root@localhost ~]# curl 127.0.0.1:81
            <!DOCTYPE html>
            <html>
            <head>
            <title>Welcome to nginx!</title>
            <style>
                body {
                    width: 35em;
                    margin: 0 auto;
                    font-family: Tahoma, Verdana, Arial, sans-serif;
                }
            </style>
            </head>
            <body>
            <h1>Welcome to nginx!</h1>
            <p>If you see this page, the nginx web server is successfully installed and
            working. Further configuration is required.</p>
            
            <p>For online documentation and support please refer to
            <a href="http://nginx.org/">nginx.org</a>.<br/>
            Commercial support is available at
            <a href="http://nginx.com/">nginx.com</a>.</p>
              
            <p><em>Thank you for using nginx.</em></p>
            </body>
            </html>

            http://192.168.127.141:81/


            52、挂载数据卷

              命令:#docker run -v 容器外目录:容器内目录  
               docker run -d --rm --name mynginx_baidu_index -d -p 82:80  -v /root/html:/usr/share/nginx/html nginx:latest

              [root@localhost ~]# mkdir html
              [root@localhost ~]# ls
              html  microService
              [root@localhost ~]# cd html/
              [root@localhost html]# wget www.baidu.com -O index.html
              --2021-02-27 20:45:29--  http://www.baidu.com/
              正在解析主机 www.baidu.com (www.baidu.com)... 39.156.66.14, 39.156.66.18
              正在连接 www.baidu.com (www.baidu.com)|39.156.66.14|:80... 已连接。
              已发出 HTTP 请求,正在等待回应... 200 OK
              长度:2381 (2.3K) [text/html]
              正在保存至: “index.html”

              100%[=========================================================================>] 2,381       --.-K/s 用时 0s

              2021-02-27 20:45:29 (39.3 MB/s) - 已保存 “index.html” [2381/2381])

              [root@localhost html]# ls
              index.html
              [root@localhost html]# cat index.html
              <!DOCTYPE html>
              <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class="head_wrapper"> <div class="s_form"> <div class="s_form_wrapper"> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class="fm"> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class="s_ipt" value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class="mnav">新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class="mnav">hao123</a> <a href=http://map.baidu.com name=tj_trmap class="mnav">地图</a> <a href=http://v.baidu.com name=tj_trvideo class="mnav">视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class="mnav">贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class="lb">登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class="bri" style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class="cp-feedback">意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

              [root@localhost html]# docker run -d --rm --name mynginx_baidu_index -d -p 82:80  -v /root/html:/usr/share/nginx/html nginx:latest
              2537f91e212ad0320962923e6ec411da713eb274d07294e8de6837f9353e922b
              [root@localhost html]# docker ps
              CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
              2537f91e212a        nginx:latest        "/docker-entrypoint.…"   5 seconds ago       Up 3 seconds        0.0.0.0:82->80/tcp   mynginx_baidu_index
              886b2eca8713        nginx:latest        "/docker-entrypoint.…"   10 minutes ago      Up 10 minutes       0.0.0.0:81->80/tcp   mynainx


              http://192.168.127.141:82/  百度官网


           53、传递环境变量(如果要传递多个 可以使用-e多次,后跟key:value)

              命令:#docker run -e 环境变量key=环境变量value

              docker run -d --rm -e E_OPTS=abdcfe C_OPTS=1234566 nginx:latest printev
              [root@localhost html]# docker run  --rm -e E_OPTS=abdcfe -e C_OPTS=1234566 nginx:latest printenv
              C_OPTS=1234566
              HOSTNAME=3042df388a9f
              HOME=/root
              PKG_RELEASE=1~buster
              NGINX_VERSION=1.19.7
              PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
              NJS_VERSION=0.5.1
              PWD=/
              E_OPTS=abdcfe


           54、容器内安装软件(工具)

              yum/apt-get/apt
               先更新国内源:
               tee /etc/apt/sources.list << EOF
               deb http://mirrors.163.com/debian/ jessie main non-free contrib
               deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib

               apt-get update      
               apt-get install curl -y


           55、容器的生命周期

             检查本地是否存在镜像,如果不存在即从远端仓库检索。

               利用镜像启动容器。
    
               分配一个文件系统,并在只读的镜像层外挂载一层可读可写层。

               从宿主机配置的网桥接口中桥接一个虚拟接口到容器。

              从地址池配置一个ip地址给容器。

               执行用户的指定的命令。

               执行完毕后容器终止或者长久运行。


           56、Dockerfile 详解

            1、格式:
    
                   #为注释
                  指令(大写)内容(小写)。
                  尽管指令是大小写不敏感的,但是,我们强烈建议指令大写,内容小写。

            2、Docker是按顺序执行 Dockerfile 里的指令集合的,从上到下依次执行。

               3、每一个 Dockerfile文件的第一个非注释行指令,必须是“FROM”指令,用于为镜像文件构建过程中,指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境中。

                  实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build 会在 docker 主机(本地)上查找指定的镜像文件,当其在本地不存在时,则会从 Docker Registry(远端)上拉取所需的镜像文件。

               4、Dockerfile指令

                  4.1、USER/WORKDIR
                        USER:Docker里面,进程使用哪个用户来启动容器。
                        WORKDIR:工作目录,运行的目录。

                  4.2、ADD/EXPOSE
                        ADD:往容器放东西必备指令。
                        EXPOSE:容器要暴露外界的端口号。
          
                  4.3、RUN/ENV
                        RUN:在构建镜像的时候帮助你执行一些操作。
                        ENV:设置环境变量

                        Dockerfile的示例:

                              FROM centos:7
                              ENV VER 9.11.4
                              RUN yum install bind-$VER -y
                           docker build . -t bind:v9.11.4_with_env_run

                  4.4、CMD/ENTRYPOINT
                         CMD:当你启动容器的时候执行的一些操作。
                         ENTRYPOINT:程序的执行点。

                         Dockerfile的示例:

                              FROM centos:7
                              RUN yum install httpd -y
                              CMD ["httpd","-D","FOREGROUND"]
                           docker build --tag patrickliu1979/httpd:v2021.228 -f Dockerfile .
                           docker run -d --rm --name myhttpd -p 83:80 patrickliu1979/httpd:v2021.228
                             docker ps -a

       
          57、Docker的网络模型

            40.1、NAT(默认)

                [root@localhost ~]# docker run -it --rm alpine /bin/sh
                / # ip add
                1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
                    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
                    inet 127.0.0.1/8 scope host lo
                       valid_lft forever preferred_lft forever
                13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
                    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
                  inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
                       valid_lft forever preferred_lft forever
                / #


            40.2、None

                docker run --net=none

                [root@localhost ~]# docker run -it --rm --net=none alpine /bin/sh
                / # ip add
                1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
                  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
                  inet 127.0.0.1/8 scope host lo
                   valid_lft forever preferred_lft forever
                / #


            40.3、Host

                docker run --net=host

                [root@localhost ~]# docker run -it --rm --net=host alpine /bin/sh
                / # ip add
                1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
                    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
                    inet 127.0.0.1/8 scope host lo
                       valid_lft forever preferred_lft forever
                    inet6 ::1/128 scope host
                       valid_lft forever preferred_lft forever
                2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
                    link/ether 00:0c:29:c6:32:2d brd ff:ff:ff:ff:ff:ff
                    inet 192.168.127.141/24 brd 192.168.127.255 scope global dynamic ens33
                       valid_lft 1276sec preferred_lft 1276sec
                    inet6 fe80::5a9f:c8ce:fc84:340f/64 scope link
                       valid_lft forever preferred_lft forever
                3: br-54f0bf11f227: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
                    link/ether 02:42:e6:4c:d0:86 brd ff:ff:ff:ff:ff:ff
                    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-54f0bf11f227
                       valid_lft forever preferred_lft forever
                4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
                    link/ether 02:42:25:1a:e4:cc brd ff:ff:ff:ff:ff:ff
                    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
                       valid_lft forever preferred_lft forever
                    inet6 fe80::42:25ff:fe1a:e4cc/64 scope link
                       valid_lft forever preferred_lft forever
                5: br-9f24d73a3b72: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
                    link/ether 02:42:55:79:fa:f4 brd ff:ff:ff:ff:ff:ff
                    inet 172.19.0.1/16 brd 172.19.255.255 scope global br-9f24d73a3b72
                       valid_lft forever preferred_lft forever
                6: br-e7f6774da423: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
                    link/ether 02:42:20:cd:47:d8 brd ff:ff:ff:ff:ff:ff
                    inet 172.20.0.1/16 brd 172.20.255.255 scope global br-e7f6774da423
                       valid_lft forever preferred_lft forever
                10: veth3f00ca9@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 state UP
                    link/ether ee:22:ed:f3:ff:db brd ff:ff:ff:ff:ff:ff
                    inet6 fe80::ec22:edff:fef3:ffdb/64 scope link
                       valid_lft forever preferred_lft forever
                / #


            40.4、联合网络

                docker run --net=container:${container_ID}
                docker run -it --rm --name lhwl2 --net=container:06b5613a8ba3 nginx /bin/bash


四、结束

          好了,今天就写到这里了。这么多的内容,肯定不是一天写完的,我相信大家也知道这个道理,太多了,我只是把每天学习的东西记录下来,方便以后自己查阅。当然,也记录了自己的学习历程。俗话说的好,要想人前显贵,必要学会背后受罪。有关Docker的内容还有很多,我也不可能在一篇文章里写的那么全。我也是一位学习者,不断学习,不断总结,以后会有更实际的、更好的东西奉献给大家。不忘初心,继续努力,每天进步一点点。

posted on 2021-03-31 14:25  可均可可  阅读(1023)  评论(0编辑  收藏  举报