-
向 Dockerfile 传参 :--build-arg
ARGARG是一个构建时有效的变量。它们只能从在Dockerfile中使用ARG指令开始到生成dockerimage的那一端时间内使用。正在运行的容器无法访问ARG变量的值。这也适用于CMD和Enrypoint指令,它们只是告诉容器在默认情况下应该运行什么。如果您告诉Dockerfile需要各种ARG变量(即从外部传递参数),需要配合--build-arg参数来指定参数值,但是如果在运行dockerbuild命令时没有提供任何变量,那么就会出现错误消息。虽然其在container启动后不再生效,但是使用‘dockerhistory’可以查看到。所以,敏感数据不建议使用ARG.设置ARG和使用ARG编译image,实例如下:之后在shell命令行中我们可以执行如下命令:ENV在Dockerfile中有一个和ARG功能类似的指令ENV,它在构建dockerimag的过程中有效,在image被创建和container启动后作为环境变量依旧也有效,并且可以重写覆盖。printenv可查看其值。下图是ARG和ENV的作用域示意图:设置ENV和使用env,实例如下对于没有设定初始值的ENV变量,我们可以在docker容器启动的时候指定变量的参数:参考【1】Vladislav.DockerARG,ENVand.env-aCompleteGuide.Vsupalov
LoveIT 2020-10-30Docker -
docker网络模型
一、docker网络基础知识Docker在启动时会创建一个虚拟网桥docker0,默认地址为172.17.0.1/16,容器启动后都会被桥接到docker0上,并自动分配到一个IP地址。使用ipaddr或ifconfig命令可以看到:Docker容器在创建的时候有四种网络模型,如果没有指定,默认使用是birdge模式,其余三种需要使用-net显式指定。bridge模式:使用–net=bridge指定,默认设置。docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。none模式:使用–net=none指定。此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。host模式:使用–net=host指定。此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个NetworkNamespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。container模式:用–net=container:容器名称或ID指定。此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。以下是docker网络初始化的过程:详细过程:二、docker网络模型详解1、桥接模式在bridge模式下,连在同一网桥上的容器可以相互通信(如果为了安全考虑,也可以设置禁止它们通信),容器也可以与外部通信,数据包从容器出来,由于容器是桥接到docker0上,所以数据包会发到docker0上,查看iptables的策略,会发现有一个策略,将源地址从172.17.0.1的包进行源地址转换,转化成宿主机的网卡地址,(注意ipfoward功能要开启)因此只要宿主机可以与外部通信,那么容器就可以与外部通信。Bridge桥接模式的实现步骤如下:DockerDaemon利用vethpair技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0和veth1。而vethpair技术的特性可以保证无论哪一个veth接收到网络报文,都会将报文传输给另一方。DockerDaemon将veth0附加到DockerDaemon创建的docker0网桥上。保证宿主机的网络报文可以发往veth0DockerDaemon将veth1添加到DockerContainer所属的namespace下,并被改名为eth0。如此一来,保证宿主机的网络报文若发往veth0,则立即会被eth0接收,实现宿主机到DockerContainer网络的联通性;同时,也保证DockerContainer单独使用eth0,实现容器网络环境的隔离性。桥接模式下的DockerContainer在使用时,并非为开发者包办了一切。最明显的是,该模式,DockerContainer不具有一个公有IP,即和宿主机的eth0不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然NAT模式经过中间处理实现了这一点,但是NAT模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外NAT模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。2、Host网络模式:使用与宿主机相同的命名空间host模式是bridge桥接模式很好的补充。采用host模式的DockerContainer,可以直接使用宿主机的IP地址与外界进行通信,若宿主机的eth0是一个公有IP,那么容器也拥有这个公有IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换。当然,有这样的方便,肯定会损失部分其他的特性,最明显的是DockerContainer网络环境隔离性的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用host模式的DockerContainer虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以bridge网络模式容器的端口映射。3、Container网络模式(1)查找othercontainer(即需要被共享网络环境的容器)的网络namespace;(2)将新创建的DockerContainer(也是需要共享其他网络的容器)的namespace,使用othercontainer的namespace。DockerContainer的othercontainer网络模式,可以用来更好的服务于容器间的通信。在这种模式下的DockerContainer可以通过localhost来访问namespace下的其他容器,传输效率较高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要注意的是,它并没有改善容器与宿主机以外世界通信的情况。4、None网络模式网络环境为none,即不为DockerContainer任何的网络环境。一旦DockerContainer采用了none网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。可以说none模式为DockerContainer做了极少的网络设定,在没有网络配置的情况下,作为Docker开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了Docker设计理念的开放。在none网络模式下分配固定ip:netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络。使用netns创建的网络空间独立于当前系统的网络空间,其中的网络设备以及iptables规则等都是独立的,就好像进入了另外一个网络一样。容器间互联:--link参数可以在不映射端口的前提下为两个容器间建立安全连接,--link参数可以连接一个或多个容器到将要创建的容器,–link表示添加连接到另一个容器。--link参数的格式为--linkname:alias,其中name是要链接的容器的名称,alias是这个连接的别名。
LoveIT 2020-09-22Docker -
提升10倍生产力: IDEA集成Docker一键部署Spring Boot项目(war包部署)
1、准备工作1.1在远程CentOS服务器上已经安装好了docker。可以参考:1.官方手册:https://docs.docker.com/install/2.我的笔记:手把手教你在Centos7上安装和使用Docker1.2配置docker远程连接端口图1.2.12375端口正在监听注意:在实际线上环境中千万不能这么干,这么干分分钟你的机器就会被肉鸡~~~1.3Idea安装docker插件,重启在比较新的IDEA中是默认安装Docker插件的,只需要点击File->Settings->Build,Execution,Deployment->Docker,如果发现有Docker,那就可以直接进入下一步;如果是比较老的IDEA版本可以在IDEA的插件安装中搜索docker,安装并重启装即可使用!图1.3.1安装Docker插件1.4idea连接远程Docker上面的一切操作都没毛病后,接下来还是依次点击File->Settings->Build,Execution,Deployment->Docker打开docker,配置远程主机的连接信息:填写Name,选择tcpsocket填写EngineAPIURL,填好后会自动连接,连接成功会提示Connectionsuccessful,如图:图1.4.1配置docker连接信息注意:这一步如果是在远程云服务器上操作时,请注意还要在安全组中开启2375端口连接成功后点击Apply->OK,之后IDEA就会在界面的下方菜单栏把docker服务列出来,我们双击就可以连接上docker,并操作管理docker。图1.4.2双击连接docker2、准备项目这个没啥好说的,并且也不是本文的重点,此处不再赘述。3、配置Dockerfile文件3.1Dockerfile文件的配置接下来在我们项目的根目录下新建一个取名为Dockerfile的文件,用于构建镜像:图3.1新建Dockerfile文件**文件内容如下**:3.2执行Dockerfile文件生成镜像在IDEA的右上方的Run/DebugConfigurations中做如下配置:图3.2.1配置执行Dockerfile文件配置好后使用mvncleanpackage-Dmaven.test.skip=true命令打包项目,然后再点击运行刚才配置的Dockerfile文件:如图所示:图3.2.2运行按钮运行日志:图3.2.3运行日志截图(部分)运行成功后就会生成目标镜像并上传到目标服务器中:图3.2.3成功构建镜像4、启动应用图4.1创建镜像之后配置镜像启的参数:镜像ID、容器名、端口映射、是否后台启动......。这里由于我的项目中使用到了redis和mysql,因此需要使用--link来实现docker容器内通信图4.2配置启动参数点击Run之后就会看到下面的画面:图4.3启动成功浏览器中访问121.36.49.86/user/loginPage,来到我项目的登录页面,docker和IDEA集成使用成功!此后发布项目将会变得非常简单快捷,而且借助于强大的Docker可以做到持续集成和弹性扩容!图4.4浏览器访问项目登录页面
LoveIT 2020-07-16Docker -
Docker常见异常处理(持续更新)
1.启动docker时映射到宿主机时出现/usr/bin/docker-current:Errorresponsefromdaemon:driverfailed...的解决方案启动docker映射到宿主机时出现如下错误时:这是由于来自守护进程的错误响应,而致使外部连接失败。解决的办法就是将其docker进程kill掉,然后再清空掉iptables下nat表下的所有链(规则)。最后,将docker的网桥删除,并重启docker服务.重启后不出以意外的话就可以了。2.serviceendpointwithnamexxxalreadyexists(docker已删除的容器却依旧存在)(1)启动服务报错如题确认我已经dockerrm-fXXX了。也确认各个容器端口并不重复。重新启动容器服务依旧报错:意思是这个端口已经被名为xxx的容器占用了。而执行dockerps又找不到这个容器,这种情况,通常是xxx容器没有正常删除导致的。这时我们可以使用命令:可以看到,此时stoic_varahamihira这个容器都还和docker保持连接的。(2)断开其网络连接:再次查看,stoic_varahamihira已不存在:之后重新启动服务,发现可以成功启动,问题解决
LoveIT 2020-06-10Docker -
卸载Linux服务器上安装的Docker
有时会用到,特此记录一下在使用后3条命令时如果遇到如下错误:这是由于挂载的目录没有停止,最简单的方法是重启服务器,然后在执行命令即可。
LoveIT 2020-05-05Docker -
Docker进阶之容器数据卷(Volume)
一、什么是数据卷?什么是容器数据卷? 数据卷就是一个文件或者文件夹。 Docker的理念之一是将应用与其运行的环境打包,docker容器的生命周期是与其运行的程序一致的,而对数据的要求是持久化,docker容器之间也需要有共享数据的渠道。 数据卷是特殊的目录,可以绕过联合文件系统,为一个或多个容器提供访问。数据卷设计的目的是数据的持久化,数据卷的生命周期完全独立于容器,不会在容器删除时删除其挂载的数据卷,也不会存在类似垃圾收集机制,对容器引用的数据卷进行处理。 数据卷存在于宿主机中,独立于容器,和容器的生命周期是分离的,数据卷存在于宿主机的文件系统中,数据卷可以是目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。 通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。二、Volume的作用/特点通过数据卷可以在容器之间实现共享和重用对数据卷的修改会立马生效(非常适合作为开发环境)对数据卷的更新,不会影响镜像卷会一直存在,直到没有容器使用三、Docker添加数据的两种方式1、使用命令的方式添加数据卷在使用dockerrun的时候我们可以通过-v来创建一个数据卷并挂载到容器上,在一次run中多次使用可以挂载多个容器。命令语法:dockerrun-it-v/宿主机绝对路径:/容器绝对路径镜像名打开命令行终端,使用docker命令以交互式的方式来运行centos如果发现挂载在容器中的目录没有访问权限,可以加上--privileged=true这个参数。启动成功后我们可以用前面我们学过一个命令dockerinspect容器名/容器ID来查看关于一个容器的有关细节,打开我们发现主机和容器之间的共享已经建立起来了,而且默认都是可读可写的:接下来然容器和主机之间互相共享数据:在另一个终端中来到/home/huangxin/hostdata目录下,新建text1.txt,然后在里面写点东西:随便写点东西:然后来到容器里,就可以看到主机在主机端的共享文件夹中写的数据在容器中可以看到了:接着我们反向操作看看能不能在容器中写的数据在主机可以共享到。还是随便写了点东西在新建的Demo1.text中,然后在主机端去看看有没有。可以看到主机和容器之间可以相互共享文件了;而且对这些文件都具有读写的权限。即使容器停止后,这些共享的数据还是同步的。然而有时我们不需要让容器写数据,那么我们就可以用带权限的命令:dockerrun-it-v/宿主机绝对路径:/容器绝对路径:ro镜像名,ro表示readonly。四、使用DockerFile添加数据卷编写自定义的Dockerfile,可以使用VOLUME[]命令可以挂载任意多个共享目录,以json的格式,多个目录逗号隔开。使用dockerbuild命令通过Dockerfile构建一个镜像dockerbuild的基本语法:dockerbuild[OPTIONS]PATH|URL|-*-f,--file指定Dockerfile的路径名*-t,--tag指定镜像的REPOSITORY和标签常用的写法:dockerbuild-fDcokerfile的路径-t仓库:标签可以看到我们的镜像构建成功了,下来我们来启动基于我们构建镜像的一个容器。使用ls查看,发现容器中自动就挂载了两个文件夹data1,data2但是这两个文件夹对应在主机上的什么地方呢?使用dockerinspect来看看这个运行中的容器的详细信息可以看到,docker对于使用VOLUME挂载的共享目录,在主机中会有一个默认的文件夹——"/var/lib/docker/volumes/。在这个文件夹下你有挂载几个,docker就默认给你生成几个对应的共享目录。还是一样随便在Dem01.txt中写点东西,然后去容器中的data1目录看看有没有Demo1.txt以及内容。五、容器之间共享数据让容器之间共享数据,有一种方法是可以通过数据卷来实现,首先启动一个父容器(启动我们刚才制作的那个镜像)在centos01.txt中随便写点东西,然后在启动子容器时候使用命令参数:--volumes-from来和父容器共享数据,最终达到的效果:父子容器都可以互相共享各自的数据:那么如果我们删除了父容器,父容器以前共享的数据还在吗?子容器之间的共享还会有吗?来,一张图回答这个问题:
LoveIT 2020-05-01Docker -
手把手教你在Centos 7上安装和使用Docker
在上一节我们了解了什么是Docker、以及Docker的三个核心概念、Docker的作用。本节我们就上机实操,在Linux上安装Docker、学习一下Docker常用的命令、最后我们使用Docker启动一个Tomcat容器感受一下Docker的强大。好了,我们开始吧!一、CentOS7安装配置Docker1、检查系统版本。在安装前一定要先检查一下你的CentOS的版本:Docker运行在CentOS7上,要求系统为64位、系统内核版本为3.10以上。查看的命令是:2、使用yum命令安装docker3、启动Docker,并设置以后开机Docker自动启动4、这时我们可以查看一下docker的有关配置5、配置一下阿里云的镜像源这一步的配置不是必须的,只是配置一下以后使用的时候下载的速度会快很多,而且有时候如果直接使用国外的镜像出现下载失败的情况也可以这么配置一下。配置的具体的方法是:5.1、到阿里云的官网直接搜索容器镜像服务5.2、点开后一顿注册设置后点击最下面的镜像加速器,然后复制加速器地址5.3、复制后来到虚拟机是用vim打开/etc/docker/daemon.json添加刚才阿里云上的加速地址,格式如下:注意:这里格式一定要正确,标准的json格式,不然服务不能启动配置后保存并退出vim界面,输入以下命令重新加载配置并重启Docker6、停止docker在这里对于Docker的配置就大致完成了,如果我们想停止docker,可以使用一下命令:二、Docker常用命令和操作2.1镜像操作1、检索关键字(镜像)2、拉取镜像这个命令中的tag就是镜像的版本,具体这个镜像有哪些版本可以下载,可以去docker.hub查看。tag可以省略,省略后默认下载最新的版本。3、查看本地所有的镜像4、删除指定本地的镜像2.2容器操作(以tmocat为例)1、搜索镜像搜索镜像使用命令:dockersearch镜像名一般查出来会有一大堆的东西,其中OFFICIAL字段标记为[OK]表示是官方版本,一般我们就下载官方的就好了。2、拉取镜像拉取镜像使用命令:dockerpull镜像名在这一步配置阿里云镜像的效果就显现出来了,下载速度还是非常快的。3、查看已下载的镜像我们可以使用命令:dockerimages查看我们已经安装的镜像。执行时候会列出当前已经安装的docker镜像,各个字段的含义如下:REPOSITORY:镜像名TAG:镜像的版本,latest表示是最新版本IMAGEID:标识这个镜像的唯一标识符CREATED:安装日期SIZE:镜像的大小4、启动容器启动容器使用命令:dockerrun[参数]镜像名dockerrun命令通常会跟一些启动参数:--name参数后面指定你为这个容器起的名字-d参数表示启动后在后台运行-p参数作用是将主机的端口映射到容器的一个端口:-p主机端口:容器内部的端口tomcat:latest就是要启动的镜像名,冒号后面指定这个镜像的版本,latest可以省略,省略后默认启动latest版本的。启动成功就会产生一串16进制数字,这串数字可以在当前docker环境中唯一标识这个运行中的容器实例。5、查看运行中的容器和所有容器之后我们可以尝试访问一下这个在虚拟机中启动的tomcat,有两种方法,一种是在图像化的Linux终端中打开浏览器访问localhost:25050或者我们也可以先使用ifconfig命令查看虚拟机的ip,然后使用宿主机的浏览器中访问虚拟机ip:250506、停止运行中的容器停止容器使用命令::dockerstop容器名或容器id7、删除容器删除容器使用命令:dockerrm容器名或容器id8、查看容器的日志查看容器日志使用命令:dockerlogs容器名或容器id后记这里我只是借助安装Tomcat简单使用了一下docker,不得不说确实非常方便,然而这里仅仅是介绍了一些常用的命令,Docker中还有许多的命令这里没有介绍到,具体的可以参考Docker官方文档,而且我们也可以参考docker.hub上每个镜像官方给出的配置方法,方法很多这里就不一一介绍了。
LoveIT 2020-04-30Docker -
Docker入门基本核心概念
一、认识容器Docker是世界领先的软件容器平台,所以想要搞懂Docker的概念我们必须先从容器开始说起。1、什么是容器?先来看看容器较为官方的解释。一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。容器赋予了软件独立性 ,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。再来看看容器较为通俗的解释(说人话)如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。2、虚拟机与容器的关系?容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。什么是虚拟机?虚拟机(VM)是计算机系统的仿真。简而言之,它可以在实际上是一台计算机的硬件上运行看起来很多单独的计算机。操作系统(OS)及其应用程序从单个主机服务器或主机服务器池共享硬件资源。每个VM都需要自己的底层操作系统,并且硬件是虚拟化的。管理程序或虚拟机监视器是创建和运行VM的软件,固件或硬件。它位于硬件和虚拟机之间,是虚拟化服务器所必需的。自从负担得起的虚拟化技术和云计算服务出现以来,大大小小的IT部门都将虚拟机(VM)作为降低成本和提高效率的一种方式。但是,VM可能占用大量系统资源。每个VM不仅运行操作系统的完整副本,还运行操作系统需要运行的所有硬件的虚拟副本。这很快就会增加大量的RAM和CPU周期。与运行单独的实际计算机相比,这仍然是经济的,但对于某些应用程序来说,这可能是过度的,这导致了容器的开发。什么是容器?使用容器,而不是像虚拟机(VM)那样虚拟化底层计算机,只是虚拟化操作系统。容器位于物理服务器及其主机操作系统之上-通常是Linux或Windows。每个容器共享主机操作系统内核,通常也包括二进制文件和库。共享组件是只读的。共享操作系统资源(如库)可以显着减少重现操作系统代码的需要,并且意味着服务器可以通过单个操作系统安装来运行多个工作负载。因此容器非常轻-它们只有几兆字节,只需几秒钟即可启动。与容器相比,VM需要几分钟才能运行,并且比同等容器大一个数量级。与VM相比,容器所需的全部功能都足以支持程序和库以及运行特定程序的系统资源。实际上,这意味着您可以将容器上的应用程序的容量设置为使用容器的两到三倍,而不是使用VM。此外,使用容器,您可以为开发,测试和部署创建可移植,一致的操作环境。容器与虚拟机总结容器是一个应用层抽象,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动。虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个VM在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且VM启动也十分缓慢。通过Docker官网,我们知道了这么多Docker的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。二、Docker基本概念1、什么是Docker?Docker使用Google公司推出的使用Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便、快捷。记住最重要的一点,Docker实际是宿主机的一个普通的进程,这也是Dokcer与传统虚拟化技术的最大不同。我们着重可以从下四个方面理解Docker是什么:Docker是世界领先的软件容器平台。Docker是一个构建在LXC(LinuxContainer容器)之上,基于进程容器的轻量级VM解决方案,实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud基于go语言开发,遵从Apache2.0开源协议Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。2、为什么要用Docker?一致的运行环境:Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间隔离性:避免公用的服务器,资源会容易受到其他用户的影响。弹性伸缩,快速扩展:善于处理集中爆发的服务器使用压力;动态迁移成本低:可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。持续交付和部署:使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。三、Docker三个核心概念Docker中有非常重要的三个核心的概念,理解了这三个概念,就理解了Docker的整个生命周期。镜像(Image)容器(Container)仓库(Repository)理解了这三个概念,就理解了Docker的整个生命周期1、镜像(Image)操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。Docker设计时,就充分利用**UnionFS技术**,将其设计为分层存储的架构。镜像实际是由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。2、容器(Container)镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。3、仓库(Repository)镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,DockerRegistry就是这样的服务。一个DockerRegistry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。目前最大最常用的公开DockerRegistry就是Docker官方提供的**DockerHub**,官方是这样介绍DockerHub的:DockerHub是Docker官方提供的一项服务,用于与您的团队查找和共享容器镜像在DockerHub中我们几乎可以搜索到目前市面上所有的软件产品的镜像。在DockerHub的搜索结果中,有几项关键的信息有助于我们选择合适的镜像:OFFICIALImage:代表镜像为Docker官方提供和维护,相对来说稳定性和安全性较高。Stars:和点赞差不多的意思,类似GitHub的Star。Dowloads:代表镜像被拉取的次数,基本上能够表示镜像被使用的频度。在国内访问DockerHub可能会比较慢国内也有一些云服务商提供类似于DockerHub的公开服务。比如时速云镜像库、网易云镜像服务、DaoCloud镜像市场、阿里云镜像库等。具体如何配置,可以参考下一节:手把手教你在Centos7上安装和使用Docker
LoveIT 2020-04-30Docker