新手如何理解并入门docker?
接下来通过4方面来初步了解dockerdocker介绍docker架构docker镜像操作docker容器操作一、docker介绍
容器技术
计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化
(hypervisorvirtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为操作系统级虚拟化,容器技术可以让多个独立的用户空间运行在同一台宿主机上
由于客居于操作系统,容器只能运行与底层宿主机相同或者相似的操作系统,这看起来并不是非常灵活。例如:可以在Ubuntu服务中运行RedhatEnterpriseLinux,但无法再Ubuntu服务器上运行MicrosoftWindows。
相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。而反对这一观点的人则认为,由于虚拟容器所虚拟的是一个完整的操作系统,这无疑增大了攻击范围,而且还要考虑管理程序层潜在的暴露风险。
尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。最常见的一个例子就是权限隔离监牢(chrootjail),它创建一个隔离的目录环境来运行进程。如果权限隔离监牢正在运行的进程被入侵者攻破,入侵者便会发现自己身陷囹圄,
因为权限不足被困在容器所创建的目录中,无法对宿主机进一步破坏。
最新的容器技术引入了OpenVZ、SolarisZones以及Linux容器(LXC)。使用这些新技术,容器不在仅仅是一个单纯的运行环境。在自己的权限类内,容器更像是一个完整的宿主机。容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好的共存。
容器被认为是精益技术,因为容器需要的开销有限。和传统虚拟化以及半虚拟化相比,容器不需要模拟层(emulationlayer)和管理层(hypervisorlayer),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更多的容器。
尽管有着光辉的历史,容器仍未得到广泛的认可。一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而Docker就是为了改变这一切而生的。
Docker是一个开发,运输和运行应用程序的开放平台。Docker使您可以将应用程序与基础架构分离,以便快速交付软件。使用Docker,您可以像管理应用程序一样管理基础架构(OS)。通过利用Docker的方法快速发送,测试和部署代码,您可以显着减少编写代码和在生产中运行代码之间的延迟。(代码改了)docker好处
容器提供了隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。并且,容器本身就具有标准性的特征,非常适合为服务创建构建块。
Docker的一些应用场景如下:加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中构建,然后轻松的提交到测试环境中,并最终进入生产环境。开发人员与运维人员进行职责的逻辑分离能够让独立的服务或应用程序在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和重度依赖微型服务的部署由其实用。用Docker创建隔离的环境来进行测试。例如,用JenkinsCI这样的持续集成工具启动一个用于测试的容器。(持续化集成war实际部署:jenkins持续化集成Jenkinsgit)Docker可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不是一开始就在生产环境部署、测试。构建一个多用户的平台即服务(PaaS)基础设施为开发、测试提供一个轻量级的独立的沙盒环境提供软件即服务(SaaS)应用程序,例如Memcached即服务高性能、超大规模的宿主机部署(可以很多容器)
沙盒:在计算机安全领域,沙盒(英语:sandbox,又译为沙箱)是一种安全机制,为运行中的程序提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。集装箱思想
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Dock将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件、应用程序。
和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容装载进去。
Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。container与vm区别
物理机:
虚拟机:
容器:最大化的利用资源。
通过上面这三张抽象图,我们大概可以通过类比概括出:容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。
容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。
容器在Linux上本机运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用任何其他可执行文件的内存,使其轻量级。相比之下,虚拟机(VM)运行一个完整的客户操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多。虚拟机vs容器
容器是一个应用层抽象,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动。
虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个VM在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且VM启动也十分缓慢。二、docker架构
Dockerusesaclientserverarchitecture。TheDockerclienttalkstotheDockerdaemon,whichdoestheheavyliftingofbuilding,running,anddistributingyourDockercontainers。TheDockerclientanddaemoncanrunonthesamesystem,oryoucanconnectaDockerclienttoaremoteDockerdaemon。TheDockerclientanddaemoncommunicateusingaRESTAPI,overUNIXsocketsoranetworkinterface。(Docker使用客户端服务器架构。Docker客户端与Docker守护进程通信,后者负责构建,运行和分发Docker容器。Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序使用RESTAPI,通过UNIX套接字或网络接口进行通信。)
Docker守护程序(dockerd)侦听DockerAPI请求并管理Docker对象,如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。)
Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如dockerrun之类的命令时,客户端会将这些命令发送到dockerd,后者将其执行。docker命令使用DockerAPI。Docker客户端可以与多个守护进程通信。
Docker注册表存储Docker镜像。
DockerHub是任何人都可以使用的公共注册中心,Docker配置为默认在DockerHub上查找图像。您甚至可以运行自己的私人注册表。如果您使用DockerDatacenter(DDC),它包括DockerTrustedRegistry(DTR)。使用dockerpull或dockerrun命令时,将从配置的注册表中提取所需的映像。使用dockerpush命令时,图像将被推送到配置的注册表。)三、docker镜像操作
Docker镜像是容器的基础。镜像是一个有序集合,其中包含根文件系统更改和在容器运行时中使用的相应执行参数。镜像通常包含堆叠在彼此之上的联合分层文件系统。镜像没有状态并且始终不会发生更改。当运行容器时,使用的镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认是从DockerHub公共镜像源下载。列出镜像dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEhelloworldlatestfce289e99eb95monthsago1。84kB这些镜像都是存储在Docker宿主机的varlibdocker目录下。REPOSITORY:表示镜像的仓库源TAG:镜像的标签(版本),同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15。10、14。04等多个不同的版本。IMAGEID:镜像IDCREATED:镜像创建时间SIZE:镜像大小
查找镜像dockersearch镜像名称NAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDcentosTheofficialbuildofCentOS。5391〔OK〕ansiblecentos7ansibleAnsibleonCentos7121〔OK〕jdeathecentossshCentOS66。10x8664CentOS77。5。1804x86110〔OK〕consolcentosxfcevncCentoscontainerwithheadlessVNCsession91〔OK〕imagine10255centos6lnmpphp56centos6lnmpphp5656〔OK〕centosmysql57centos7MySQL5。7SQLdatabaseserver53tutumcentosSimpleCentOSdockerimagewithSSHaccess44centospostgresql96centos7PostgreSQLisanadvancedObjectRelational37kinogmtcentossshCentOSwithSSH26〔OK〕pivotaldatacentosgpdbdevCentOSimageforGPDBdevelopment。Tagnames10drecomcentosrubycentosruby6〔OK〕mamohrcentosjavaOracleJava8DockerimagebasedonCentos73〔OK〕darksheercentosBaseCentosImageUpdatedhourly3〔OK〕pivotaldatacentosBasecentos,freshenedupalittlewithaDo3miko2ucentos6CentOS6日本語環境2〔OK〕pivotaldatacentosmingwUsingthemingwtoolchaintocrosscompilet2ovirtguestagentcentos7atomicTheoVirtGuestAgentforCentos7AtomicHo2indigocentosmavenVanillaCentOS7withOracleJavaDevelopmen1〔OK〕mcnaughtoncentosbasecentosbaseimage1〔OK〕blacklabelopscentosCentOSBaseImage!BuiltandUpdatesDaily!1〔OK〕pivotaldatacentosgcctoolchainCentOSwithatoolchain,butunaffiliatedwi1pivotaldatacentos7devCentosOS7imageforGPDBdevelopment0smartentrycentoscentoswithsmartentry0〔OK〕fortinj66centos7s2inodejsbasedoffofryanjcentos7s2inodejs。Bigg0pivotaldatacentos6。8devCentosOS6。8imageforGPDBdevelopment0拉取镜像
dockerpull镜像名称〔:version〕
Docker镜像首页,包括官方镜像和其它公开镜像。DockerHub上最受欢迎的10大镜像
(通过DockerregistryAPI获取不了镜像被pull的个数,只能通过镜像的stars数量,来衡量镜像的流行度。毫无疑问,拥有最高stars数量的库都是官方库。国情的原因,国内下DockerHUB官方的相关镜像比较慢,可以使用国内(docker。io)的一些镜像加速器,镜像保持和官方一致,关键是速度块,推荐使用。配置镜像加速器:PS:配置镜像加速器(参考该网站具体的文档操作)阿里云(先加入阿里云开发者平台:https:dev。aliyun。com)docker中国加速器(https:www。dockercn。com)USTC加速器(https:lug。ustc。edu。cnwiki)真正的公共服务(无需任何操作)daocloud、网易蜂巢加速器:略步骤:sudovimetcdockerdaemon。json配置内容:{registrymirrors:〔https:cs913o6k。mirror。aliyuncs。com〕}sudosystemctldaemonreloadsudosystemctlrestartdocker删除镜像1、删除一个镜像dockerrmi镜像名称id2、删除多个镜像dockerrmi镜像名称1id1镜像名称2id2。。。3、删除所有镜像dockerrmidockerimagesq四、docker容器操作
容器是docker镜像的运行时实例。
创建容器dockerrun〔options〕imagecommand〔ARG。。。〕options选项:i、t、d、namei:交互式容器t:tty,终端d:后台运行,并且打印容器idshusrlocaltomcat7binstartup。sh(shell脚本binbashpyrblua)Linux:根的进程:binbashtreexxxyyyeg:创建的容器名称不能重复dockerrunnameu1ubuntudockerrunitnameu1ubuntubinbashdockerrunitdnameu3ubuntubinbash
进入容器方式一:dockerattach容器名称id(ps:exit,容器停止)eg:dockerattachu3方式二:dockerexecit容器名称idbinbash(ps:exit,容器不会停止)eg:dockerexecitu3binbash
查看容器dockerps:查看正在运行的容器dockerpsa:查看运行过的容器(历史)dockerpsl:最后一次运行的容器
停止启动容器dockerstart容器名称iddockerstop容器名称id
获取容器镜像的元数据查看容器镜像全部信息:dockerinspect容器镜像查看容器镜像部分信息:dockerinspectf{{。NetworkSettings。IPAddress}}容器镜像f:可通过format代替
删除容器删除一个容器:dockerrm容器名称id删除多个容器:dockerrm容器名称1id1容器名称2id2。。。删除所有容器dockerrmdockerpsaqPS:无法删除正在运行的容器
查看容器日志dockerlogs容器名称id
文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令dockercp需要拷贝的文件或目录容器名称:容器目录例如:dockercp1。txtc2:root
也可以将文件从容器内拷贝出来dockercp容器名称:容器目录需要拷贝的文件或目录例如:dockercpc2:root2。txtroot
目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可
以通过修改宿主机某个目录的文件从而去影响容器。
创建容器添加v参数后边为宿主机目录:容器目录dockerrunidnamec4vopt:usrlocalmyhtmlcentos
如果你共享的是多级的目录,可能会出现权限不足的提示
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数
privilegedtrue来解决挂载的目录没有权限的问题dockerrunidprivilegedtruenamec4vopt:usrlocalmyhtmlcentos
更多详细内容深入解析docker容器化技术Java进阶教程