庐山真面目之十四微服务架构的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

  1.         [root@localhost ~]# uname -a
  2.         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

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

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

        命令:#getenforce

  1.         [root@localhost ~]# getenforce
  2.         Disabled

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

        命令:#systemctl stop firewalld

  1.         [root@localhost ~]# systemctl stop firewalld

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

        命令:free –m

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

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

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

  1.         [root@localhost ~]# ping www.baidu.com
  2.         PING www.a.shifen.com (39.156.66.18) 56(84) bytes of data.
  3.         64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=128 time=14.5 ms
  4.         64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=2 ttl=128 time=14.2 ms
  5.         64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=3 ttl=128 time=18.1 ms
  6.         64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=4 ttl=128 time=13.8 ms
  7.         64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=5 ttl=128 time=14.8 ms
  8.         ^C
  9.  
  10.         --- www.a.shifen.com ping statistics ---
  11.         5 packets transmitted, 5 received, 0% packet loss, time 13069ms
  12.         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

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

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

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

    9、安装epel源

        命令:#yum install epel-release –y

  1.         [root@localhost ~]# yum install epel-release y
  2.         已加载插件:fastestmirror
  3.         Determining fastest mirrors
  4.          * base: mirrors.163.com
  5.          * extras: mirrors.163.com
  6.          * updates: mirrors.aliyun.com
  7.         base | 3.6 kB 00:00:00
  8.         docker-ce-stable | 3.5 kB 00:00:00
  9.         extras | 2.9 kB 00:00:00
  10.         jenkins | 2.9 kB 00:00:00
  11.         packages-microsoft-com-prod | 3.0 kB 00:00:00
  12.         updates | 2.9 kB 00:00:00
  13.         (1/5): extras/7/x86_64/primary_db | 227 kB 00:00:03
  14.         (2/5): docker-ce-stable/7/x86_64/primary_db | 58 kB 00:00:04
  15.         (3/5): updates/7/x86_64/primary_db | 6.5 MB 00:00:04
  16.         (4/5): packages-microsoft-com-prod/primary_db | 335 kB 00:00:04
  17.         (5/5): jenkins/primary_db | 166 kB 00:00:06
  18.         正在解决依赖关系
  19.         --> 正在检查事务
  20.         ---> 软件包 epel-release.noarch.0.7-11 将被 安装
  21.         --> 解决依赖关系完
  22.         依赖关系解决
  23.         ===============================================================================================
  24.          Package 架构 版本 大小
  25.         ===============================================================================================
  26.         正在安装:
  27.          epel-release noarch 7-11 extras 15 k
  28.         事务概要
  29.         ===============================================================================================
  30.         安装 1 软件包
  31.         总下载量:15 k
  32.         安装大小:24 k
  33.         Is this ok [y/d/N]: y
  34.         Downloading packages:
  35.         epel-release-7-11.noarch.rpm | 15 kB 00:00:02
  36.         Running transaction check
  37.         Running transaction test
  38.         Transaction test succeeded
  39.         Running transaction
  40.          正在安装 : epel-release-7-11.noarch 1/1
  41.          验证中 : epel-release-7-11.noarch 1/1
  42.           已安装:
  43.          epel-release.noarch 0:7-11
  44.         完毕!

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

        命令:yum list docker –show-duplicates

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

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

        命令:#yum install –y yum-utils         

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

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

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

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

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

  1.         [root@localhost ~]# yum list docker-ce --show-duplicates
  2.         已加载插件:fastestmirror
  3.         Loading mirror speeds from cached hostfile
  4.          * base: mirrors.163.com
  5.          * epel: mirrors.bfsu.edu.cn
  6.          * extras: mirrors.163.com
  7.          * updates: mirrors.aliyun.com
  8.         已安装的软件包
  9.         docker-ce.x86_64 3:19.03.13-3.el7 @docker-ce-stable
  10.         可安装的软件包
  11.         docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
  12.         docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
  13.         docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
  14.         docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
  15.         docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
  16.         docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
  17.         docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
  18.         docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
  19.         docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
  20.         docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
  21.         docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
  22.         docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
  23.         docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
  24.         docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
  25.         docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
  26.         docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
  27.         docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
  28.         docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
  29.         docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
  30.         docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
  31.         docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
  32.         docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
  33.         docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
  34.         docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
  35.         docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
  36.         docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
  37.         docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
  38.         docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
  39.         docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
  40.         docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
  41.         docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable
  42.         docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable
  43.         docker-ce.x86_64 3:19.03.5-3.el7 docker-ce-stable
  44.         docker-ce.x86_64 3:19.03.6-3.el7 docker-ce-stable
  45.         docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable
  46.         docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable
  47.         docker-ce.x86_64 3:19.03.9-3.el7 docker-ce-stable
  48.         docker-ce.x86_64 3:19.03.10-3.el7 docker-ce-stable
  49.         docker-ce.x86_64 3:19.03.11-3.el7 docker-ce-stable
  50.         docker-ce.x86_64 3:19.03.12-3.el7 docker-ce-stable
  51.         docker-ce.x86_64 3:19.03.13-3.el7 docker-ce-stable
  52.         docker-ce.x86_64 3:19.03.14-3.el7 docker-ce-stable
  53.         docker-ce.x86_64 3:19.03.15-3.el7 docker-ce-stable
  54.         docker-ce.x86_64 3:20.10.0-3.el7 docker-ce-stable
  55.         docker-ce.x86_64 3:20.10.1-3.el7 docker-ce-stable
  56.         docker-ce.x86_64 3:20.10.2-3.el7 docker-ce-stable
  57.         docker-ce.x86_64 3:20.10.3-3.el7 docker-ce-stable
  58.         docker-ce.x86_64 3:20.10.4-3.el7 docker-ce-stable
  59.         docker-ce.x86_64 3:20.10.5-3.el7 docker-ce-stable

  

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

        命令:#yum install docker-ce –y

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

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

        命令:#systemctl enable docker

  1.         [root@localhost ~]# systemctl enable docker

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

        命令:#systemctl start docker

  1.       [root@localhost ~]# systemctl start docker

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

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

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

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

        命令:#ip add

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

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

        命令:#docker info

  1.         [root@localhost ~]# docker info
  2.         Client:
  3.         Debug Mode: false
  4.         Server:
  5.          Containers: 0
  6.          Running: 0
  7.          Paused: 0
  8.          Stopped: 0
  9.          Images: 7
  10.          Server Version: 19.03.13
  11.          Storage Driver: overlay2
  12.          Backing Filesystem: xfs
  13.          Supports d_type: true
  14.          Native Overlay Diff: true
  15.          Logging Driver: json-file
  16.          Cgroup Driver: cgroupfs
  17.          Plugins:
  18.          Volume: local
  19.          Network: bridge host ipvlan macvlan null overlay
  20.          Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
  21.          Swarm: inactive
  22.          Runtimes: runc
  23.          Default Runtime: runc
  24.          Init Binary: docker-init
  25.          containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
  26.          runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
  27.          init version: fec3683
  28.          Security Options:
  29.          seccomp
  30.          Profile: default
  31.          Kernel Version: 3.10.0-1062.12.1.el7.x86_64
  32.          Operating System: CentOS Linux 7 (Core)
  33.          OSType: linux
  34.          Architecture: x86_64
  35.          CPUs: 4
  36.          Total Memory: 972.4MiB
  37.          Name: localhost.patrickliu
  38.          ID: MIHL:XZIG:MTEG:4IY2:LDBT:AUTN:RKGL:GBE3:G5VR:CLTX:IWMW:ISLH
  39.          Docker Root Dir: /var/lib/docker
  40.          Debug Mode: false
  41.          Username: patrickliu1979
  42.          Registry: https://index.docker.io/v1/
  43.          Labels:
  44.          Experimental: false
  45.          Insecure Registries:
  46.          127.0.0.0/8
  47.          Registry Mirrors:
  48.          http://hub-mirror.c.163.com/
  49.          Live Restore Enabled: false

    

      20、运行第一个容器。

        命令:#docker run hello-world

  1.         [root@localhost ~]# docker run hello-world
  2.         Unable to find image 'hello-world:latest' locally
  3.         latest: Pulling from library/hello-world
  4.         b8dfde127a29: Pull complete
  5.         Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
  6.         Status: Downloaded newer image for hello-world:latest
  7.  
  8.         Hello from Docker!
  9.         This message shows that your installation appears to be working correctly.
  10.  
  11.         To generate this message, Docker took the following steps:
  12.          1. The Docker client contacted the Docker daemon.
  13.          2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64)
  14.          3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
  15.          4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
  16.  
  17.         To try something more ambitious, you can run an Ubuntu container with:
  18.          $ docker run -it ubuntu bash
  19.  
  20.         Share images, automate workflows, and more with a free Docker ID:
  21.         https://hub.docker.com/
  22.  
  23.         For more examples and ideas, visit:
  24.         https://docs.docker.com/get-started/

          

       21、查看Docker的版本。

          命令:#docker  version  

  1.           [root@localhost ~]# docker version
  2.           Client: Docker Engine - Community
  3.            Version: 19.03.13
  4.            API version: 1.40
  5.            Go version: go1.13.15
  6.            Git commit: 4484c46d9d
  7.            Built: Wed Sep 16 17:03:45 2020
  8.            OS/Arch: linux/amd64
  9.            Experimental: false
  10.  
  11.           Server: Docker Engine - Community
  12.            Engine:
  13.            Version: 19.03.13
  14.            API version: 1.40 (minimum version 1.12)
  15.            Go version: go1.13.15
  16.            Git commit: 4484c46d9d
  17.            Built: Wed Sep 16 17:02:21 2020
  18.            OS/Arch: linux/amd64
  19.            Experimental: false
  20.            containerd:
  21.            Version: 1.3.7
  22.            GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
  23.            runc:
  24.            Version: 1.0.0-rc10
  25.            GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
  26.            docker-init:
  27.            Version: 0.18.0
  28.            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

  1.           [root@localhost ~]# docker login docker.io
  2.           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.
  3.  
  4.           Username: patrickliu1979
  5.           Password:********
  6.            WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  7.            Configure a credential helper to remove this warning. See
  8.            https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  9.  
  10.            Login Succeeded

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

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

  1.           [root@localhost ~]# cat /root/.docker/config.json
  2.           {
  3.             "auths": {
  4.             "https://index.docker.io/v1/": {
  5.             "auth": "cGF0cmlja2xp****************MwNjMw"
  6.             }
  7.             },
  8.            "HttpHeaders": {
  9.             "User-Agent": "Docker-Client/19.03.13 (linux)"
  10.             }
  11.            }

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

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

        27、在docker hub上查询镜像



            命令:#docker
search redis

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

    

        28、拉取服务器上的镜像,不加Tag,默认下载最新版。

    

              命令:#docker pull alpine

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

        29、镜像的结构



              registry_name/repository_name/image_name:tag_name        



        30、查看本地镜像



              命令:#docker
images/docker image ls

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

        31、给镜像打标签



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

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

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

        32、推送镜像到docker hub.



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

  1.          [root@localhost ~]# docker push docker.io/patrickliu1979/redis:v2021.224
  2.          The push refers to repository [docker.io/patrickliu1979/redis]
  3.          2f8c6410a70f: Mounted from library/redis
  4.           bc1e8e75ef31: Mounted from library/redis
  5.           6b3ece100807: Mounted from library/redis
  6.          aaa520a04939: Mounted from library/redis
  7.          56f1f103e9b9: Mounted from library/redis
  8.           f2cb0ecef392: Mounted from library/redis
  9.           v2021.224: digest: sha256:780f7dacdc133e899fba9ff09c099828b469030acefe6f3bbc16197b55800cfd size: 1572
  10.  
  11.         可以去 docker hub 登录账号,查看我们刚才推送的镜像。

        33、删除镜像



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

  1.           如此删除,只能删除标签,镜像本身不会删除
  2.           [root@localhost ~]# docker rmi patrickliu1979/redis:v2021.224
  3.            Untagged: patrickliu1979/redis:v2021.224
  4.            Untagged: patrickliu1979/redis@sha256:780f7dacdc133e899fba9ff09c099828b469030acefe6f3bbc16197b55800cfd
  5.             [root@localhost ~]#
  6.             [root@localhost ~]# docker image ls
  7.            REPOSITORY TAG IMAGE ID CREATED SIZE
  8.            alpine latest 28f6e2705743 6 days ago 5.61MB
  9.            redis latest f0453552d7f2 11 months ago 98.2MB
  10.             hello-world latest bf756fb1ae65 13 months ago 13.3kB
  11.            hello-world latest bf756fb1ae65 13 months ago 13.3kB
  12.            [root@localhost ~]#
  13.  
  14.            如果想彻底删除镜像,如果有多个标签,先删除标签,在删除镜像文件。-f 强制删除
  15.            [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(列出所有存活的容器)

  1.             [root@localhost ~]# docker ps(现在没有存活的容器)
  2.             CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3.  
  4.             [root@localhost ~]# docker ps a(列出所有容器)
  5.             CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6.             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:表示启动容器时要运行的命令。

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

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

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

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



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

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

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



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

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

        40、我们根据容器的ID或者名称停止处于Up状态的容器。

                        命令:#docker stop containerID/containerName

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

      41、我们可以根据容器的ID 或者名称启动处于Exited状态容器。

                       命令:#docker start containerID/containerName

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

      42、我们可以根据容器的ID 或者名称启动处于Exited状态容器。

                      命令:#docker
restart containerID/containerName

  1.       [root@localhost ~]# docker restart fa7bf2b2b2d7
  2.            fa7bf2b2b2d7

      43、我们可以根据容器ID或者名称删除处于Exited 状态的容器。

                      命令:#docker
rm containerID/containerName

  1.     [root@localhost ~]# docker rm fa7bf2b2b2d7
  2.     fa7bf2b2b2d7

      44、我们可以根据容器ID或者名称强制删除处于Exited 状态的容器。                    

                      命令:#docker
rm -f containerID/containerName

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

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

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

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

      46、提交容器,生成镜像。

                     命令:#docker
commit

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

      47、我们导出镜像,可以执行命令Docker Save。

                     命令:#docker
save containerID > name

  1.             Usage: docker save [OPTIONS] IMAGE [IMAGE...]
  2.             Save one or more images to a tar archive (streamed to STDOUT by default)
  3.             Options:
  4.              -o, --output string Write to a file, instead of STDOUT
  5.  
  6.             [root@localhost ~]# docker save 0d19ea106973 > redis:v2021.03.26-20.17.tar.gz
  7.             [root@localhost ~]# ll
  8.             总用量 106188
  9.             -rw-r--r--. 1 root root 71 2 28 20:31 Dockerfile
  10.             drwxr-xr-x. 2 root root 24 2 27 20:45 html
  11.             drwxr-xr-x. 4 root root 38 2 5 13:46 microService
  12.             -rw-r--r--. 1 root root 108728832 3 26 20:31 redis:v2021.03.26-20.17.tar.gz

     48、如果我们又了导出的镜像文件,可以根据此文件导入镜像。

                     命令:#
docker load < 导出的镜像文件名称

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

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

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

  1.            [root@localhost ~]# docker logs 874e5257e28f -f
  2.     1:C 26 Mar 2021 12:12:39.051 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  3.             1:C 26 Mar 2021 12:12:39.051 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=1, just started
  4.             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
  5.             1:M 26 Mar 2021 12:12:39.053 * monotonic clock: POSIX clock_gettime
  6.  
  7.             还要很多,就不全部贴出来了。

     50、 高级操作

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

     51、映射端口



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

  1.          [root@localhost ~]# docker run --rm --name mynainx -d -p 81:80 nginx:latest
  2.          886b2eca87134b500b10a052924903d8808c03a76ce93cc05102087fbb7cc896
  3.          [root@localhost ~]# docker ps -a
  4.          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5.          886b2eca8713 nginx:latest "/docker-entrypoint.…" 7 seconds ago Up 4 seconds 0.0.0.0:81->80/tcp mynainx
  6.  
  7.          [root@localhost ~]# netstat -luntp |grep 81
  8.          tcp6 0 0 :::81 :::* LISTEN 2323/docker-proxy
  9.  
  10.          [root@localhost ~]# curl 127.0.0.1:81
  11.          <!DOCTYPE html>
  12.          <html>
  13.          <head>
  14.          <title>Welcome to nginx!</title>
  15.          <style>
  16.          body {
  17.          width: 35em;
  18.          margin: 0 auto;
  19.          font-family: Tahoma, Verdana, Arial, sans-serif;
  20.          }
  21.          </style>
  22.          </head>
  23.          <body>
  24.          <h1>Welcome to nginx!</h1>
  25.          <p>If you see this page, the nginx web server is successfully installed and
  26.          working. Further configuration is required.</p>
  27.         
  28.          <p>For online documentation and support please refer to
  29.          <a href="http://nginx.org/">nginx.org</a>.<br/>
  30.          Commercial support is available at
  31.          <a href="http://nginx.com/">nginx.com</a>.</p>
  32.           
  33.          <p><em>Thank you for using nginx.</em></p>
  34.          </body>
  35.          </html>
  36.  
  37.          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

  1.            [root@localhost ~]# mkdir html
  2.            [root@localhost ~]# ls
  3.            html microService
  4.            [root@localhost ~]# cd html/
  5.            [root@localhost html]# wget www.baidu.com -O index.html
  6.            --2021-02-27 20:45:29-- http://www.baidu.com/
  7.            正在解析主机 www.baidu.com (www.baidu.com)... 39.156.66.14, 39.156.66.18
  8.            正在连接 www.baidu.com (www.baidu.com)|39.156.66.14|:80... 已连接。
  9.            已发出 HTTP 请求,正在等待回应... 200 OK
  10.            长度:2381 (2.3K) [text/html]
  11.            正在保存至: index.html
  12.  
  13.            100%[=========================================================================>] 2,381 --.-K/s 用时 0s
  14.  
  15.            2021-02-27 20:45:29 (39.3 MB/s) - 已保存 index.html [2381/2381])
  16.  
  17.            [root@localhost html]# ls
  18.            index.html
  19.            [root@localhost html]# cat index.html
  20.            <!DOCTYPE html>
  21.            <!--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>
  22.  
  23.            [root@localhost html]# docker run -d --rm --name mynginx_baidu_index -d -p 82:80 -v /root/html:/usr/share/nginx/html nginx:latest
  24.            2537f91e212ad0320962923e6ec411da713eb274d07294e8de6837f9353e922b
  25.            [root@localhost html]# docker ps
  26.            CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  27.            2537f91e212a nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 3 seconds 0.0.0.0:82->80/tcp mynginx_baidu_index
  28.            886b2eca8713 nginx:latest "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:81->80/tcp mynainx
  29.  
  30.            http://192.168.127.141:82/ 百度官网

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



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

  1.            docker run -d --rm -e E_OPTS=abdcfe C_OPTS=1234566 nginx:latest printev
  2.            [root@localhost html]# docker run --rm -e E_OPTS=abdcfe -e C_OPTS=1234566 nginx:latest printenv
  3.            C_OPTS=1234566
  4.            HOSTNAME=3042df388a9f
  5.            HOME=/root
  6.            PKG_RELEASE=1~buster
  7.            NGINX_VERSION=1.19.7
  8.            PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  9.            NJS_VERSION=0.5.1
  10.            PWD=/
  11.            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(默认)

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

        40.2、None

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

        40.3、Host

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

         40.4、联合网络

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

四、结束

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

庐山真面目之十四微服务架构的Docker虚拟技术深入探究的更多相关文章

  1. 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群

    庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介      前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...

  2. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

  3. 庐山真面目之四微服务架构Consul集群和Nginx版本实现

    庐山真面目之四微服务架构Consul集群和Nginx版本实现 一.简介      在上一篇文章<庐山真面目之三微服务架构Consul版本实现>中,我们已经探讨了如何搭建基于单节点Consu ...

  4. 庐山真面目之四微服务架构Consul和Ocelot简单版本实现

    庐山真面目之四微服务架构Consul和Ocelot简单版本实现 一.简介      在上一篇文章<庐山真面目之三微服务架构Consul简单版本实现>中,我们已经探讨了如何搭建基于Consu ...

  5. 庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署

    庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署 一.简介      我们在上一篇文章<庐山真面目之八微服务架构 NetCore 基于 Dockerfile ...

  6. 庐山真面目之二微服务架构NGINX版本实现

    一.简介          在上一篇文章<庐山真面目之微服务的简介和技术栈>中,我们已经探讨了微服务的来龙去脉,也说了想要实现微服务架构所需要的技术栈,今天我们开始实现一个微服务,当然这个 ...

  7. 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境

    庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...

  8. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  9. Aibabelx-shop 大型微服务架构系列实战之技术选型

    一.本项目涉及编程语言java,scala,python,涉及的技术如下: 1.微服务架构: springboot springcloud mybatisplus shiro 2.全文检索技术 sol ...

随机推荐

  1. how to publish a UMD module

    how to publish a UMD module 如何发布UMD模块 npm https://github.com/xgqfrms/umd-npm-package https://www.npm ...

  2. chroot vs docker

    chroot vs docker chroot Linux A chroot on Unix operating systems is an operation that changes the ap ...

  3. Android Studio & SDK & JDK & setting path

    Android Studio & SDK & JDK & setting path https://developer.android.com/studio/intro/upd ...

  4. ts 使用 keyof typeof

    传递参数 const cats = { "Coding Cat": "https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy. ...

  5. Spark在处理数据的时候,会将数据都加载到内存再做处理吗?

    对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD.SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗? 很显然,答案是否定的! 对该问题产生疑问的根源还是对Sp ...

  6. JavaScript高级:JavaScript面向对象,JavaScript内置对象,JavaScript BOM,JavaScript封装

    知识点梳理 课堂讲义 1.JavaScript面向对象 1.1.面向对象介绍 在 Java 中我们学习过面向对象,核心思想是万物皆对象. 在 JavaScript 中同样也有面向对象.思想类似. 1. ...

  7. Asp.Net Core学习笔记:(二)视图、模型、持久化、文件、错误处理、日志

    TagHelper 入门 优点:根据参数自动生成,不需要手写超链接,类似Django模板里面的url命令. 在ViewImport中添加TagHelper @addTagHelper *,Micros ...

  8. 基于股票大数据分析的Python入门实战(视频教学版)的精彩插图汇总

    在我写的这本书,<基于股票大数据分析的Python入门实战(视频教学版)>里,用能吸引人的股票案例,带领大家入门Python的语法,数据分析和机器学习. 京东链接是这个:https://i ...

  9. KSM概念学习

    KSM: Kernel SamePage Merging 内核同页合并 简介 KSM允许内核在两个或多个进程(包括虚拟客户机)之间共享完全相同的内存页. KSM让内核扫描检查正在运行中的程序,并比较他 ...

  10. Qstring和String的区别

    QString qTest; std::string sTest = qTest.toStdString(); qTest = QString::fromStdString(sTest); //进入两 ...