Docker——Docker介绍——第一章
Docker——Docker运行底层原理和为什么Docker比Vm快——小知识
Docker——Docker命令——工作最常用——第二章
Docker——镜像介绍——第三章
Docker——容器数据卷——第四章
Docker——DockerFile——第五章
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重来一 一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说安装的时候,把原始环境一模一样地复制过来。开发人员利用Docker可以消除协作编码时“ 在我的机器上可正常工作"的问题。
之前在服务器配置一个应用的运行环境,要安装各种软件,就拿淘宝电商项目的环境来说吧,Java/TomcatMySQLJDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在Windows上安装的这些环境,到了Linux又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
假设你想尝试一款新的Linux软件,但是担心运行起来的是恶意代码。为了保护你的机器,在Docker中运行该软件是很好的第一步。因为Docker可以帮助大多数普遍软件用户利用好强大的安全工具。
如果你是一名系统管理员,将Docker作为软件管理工具集的基础,将节省你的时间,让你专注于高价值的事情,因为Docker可以最大限度地减少你花在琐碎工作上的时间。如果你编写软件,通过Docker发布,你的用户会更容易安装并运行它。在Docker封装的开发环境中编写软件,将节省配置或共享环境的时间,因为从软件的角度来看,每个环境都是一样的。
假设你拥有或管理大型系统或数据中心。使用Docker来创建build,测试和部署管道会变得很简单,因为通过这样一个管道可以应用到其他任何软件。
不仅仅是Linux Docker 是一款Linux软件,但可以很好地运行在大多数操作系统上。
隔离是众多计算模式、资源管理策略和一般审计实践的一个核心概念,很难在一开始就编制好一切。学习Linux容器如何为运行的程序提供隔离,以及如何使用Docker来控制隔离,可以实现惊人的创举:重用、资源有效配置和系统简化。对这部分内容的深入理解是每个读者掌握不断发展的Docker和容器生态系统的坚实基础。像Docker工具集本身,这部分提供了可构建的工具块,用来解决更大的问题。
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build, Ship and Run Any App,Anywhere!",也就是通过对应用组件的封装、 分发、部署、运行等生命周期的管理,使用户的APP (可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。将应用运行在Docker容器上面,而Docker容器在任何操作系统上都是一 致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虛拟化技术。
Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序从基础设施中分离出来,这样您就可以快速交付软件。使用Docker,您可以像管理应用程序一样管理基础设施。通过利用Docker的方法快速交付、测试和部署代码,可以显著减少编写代码和在生产环境中运行代码之间的延迟
Docker提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要hypervisor的额外负载,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,在给定的硬件组合上可以运行更多的容器。您甚至可以在主机(实际上是虚拟机)中运行Docker容器!
Docker提供了工具和平台来管理容器的生命周期:
使用容器开发应用程序及其支持组件。
容器成为分发和测试应用程序的单元。
准备就绪后,将应用程序部署到生产环境中,作为容器或编排好的服务。无论您的生产环境是本地数据中心、云提供商还是两者的混合,这都是一样的。
Docker包括一个命令行程序、一个后台守护进程,以及一组远程服务。它解决了常见的软件问题,并简化了安装、运行、发布和删除软件。这一切能够实现是通过使用一项UNIX技术,称为容器。
从历史.上看,UNIX风格的操作系统都使用jail这个术语来形容一个修改过的运行时环境,以防止该程序访问受保护的资源。自2005年以来,Sun的Solaris 10和Solaris容器发布后,容器已经成为这样一个运行环境的首选术语。而我们的目标,已经从防止对受保护资源的访问,扩展到隔离所有的资源,除非明确允许。使用容器已经是很长一段时间的最佳做法。但手动创建容器,仍然具有挑战性,而且很容易出错。错误配置的容器却让他人产生安全的错觉。这个问题直到Docker的出现终于得到解决。任何使用Docker运行的软件其实是在一个容器内运行。Docker 使用现有的容器引擎,根据最佳实践提供一致的Docker构建方案。这给大家带来了触手可及且更强的安全性。有了Docker,用户以更低的成本获得容器。随着Docker和容器引擎改进,你获得最新和最好用的“jail"功能。不用再紧跟着迅速发展且高技术性的构建强大应用jail的世界了,相反你只要让Docker帮你处理这些事情就好。这将节省大量的时间和金钱
在没有Docker的时代,商家通常使用硬件虚拟化(也称为虚拟机),以提供隔离。虚拟机提供虚拟的硬件,可安装一个操作系统和其他程序。它们需要很长的时间(通常以分钟计)来创建,也需要显著的资源开销,因为它们除了要执行你需要的软件,还得运行整个操作系统的副本。
不同于虚拟机,Docker容器不使用硬件虚拟化。运行在Docker容器中的程序接口和主机的Linux内核直接打交道。因为容器中运行的程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟硬件的模拟而浪费掉。这是一个很重要的区别。Docker不是一个虚拟化技术。相反,它可以帮助使用已经内置到操作系统中的容器技术。
如上所述,容器已经存在了几十年。Docker使用的是2007年就已经成为Linux 一部分的Linux命名空间和cgroups。Docker并不提供容器技术,但它使得容器更易于使用。要了解系统中的容器长什么样子,让我们先建立一条基准线。如图1-1 所示画出了在一个简化的计算机系统体系结构上运行的基本容器示例。
如图1-2所示,运行Docker可以认为是在用户空间运行着两个程序。首先是Docker守护进程。如果正确安装,这个进程应始终处于运行状态。另一个是DockerCLI,它是与用户交互的Docker程序。如果要启动、停止或安装软件,你可使用DockerCLI执行相应的命令。
Docker构建的容器隔离包括8个方面。具体如下:
PID命名空间一进程标识符和能力
UTS命名空间一主机名和域名
MNT命名空间一文件系统访问和结构
IPC命名空间一-通过共享内存的进程间通信
NET命名空间一网络访问和结构
USR命名空间一用户名和标识,
chroot ()控制文件系统根目录的位置
cgroups一资源保护
Linux的命名空间和cgroups管理着运行时的容器。Docker 采用另一套技术, 就像运输集装箱那样来为文件提供容器。
你可以把一个Docker容器看成是物理运输的集装箱。这就是你存储和运行应用程序及其所有依赖的一一个盒子。正如吊车、卡车、火车、船舶可以方便地运输集装箱,所以Docker也可以执行、复制和轻松地分发容器。Docker 通过一种打 包和分发的软件,完成传统容器的封装。这个用来充当容器分发角色的组件被称为镜像。
Docker镜像,是一个容器中运行程序的所有文件的捆绑快照。只要你想,你就可以从镜像中创造尽可能多的容器。但是,当你这样做时,从相同的镜像启动的容器不共享文件系统的更改。当你使用Docker分发软件,其实就是分发这些镜像,并在接收的机器上创建容器。镜像在Docker生态系统中是可交付的基本单位。
Docker提供了一组简化分发镜像的基础设施组件。这些组件包括注册服务器和索引服务器。你可以使用由Docker公司公开提供的基础设施,以及其他托管公司提供或者自有的注册服务器和索引服务器。
软件的安装是复杂的。安装之前,你必须考虑使用什么样的操作系统,软件需要的资源,其他已经安装的软件,以及它们的依赖。你需要决定它应该被安装在哪个位置。然后,你需要知道如何安装。安装过程变化如此之大令人惊讶。要考虑的名单又长,又苛刻。软件的安装怎么说也是不一致的,而且过于复杂。
大多数计算机都安装并运行着多个应用程序。大多数应用程序依赖于其他软件。当你想使用的两个或多个应用程序不能在一起工作,会发生什么?这是一个灾难。整个事情会变得很复杂,两个或多个应用程序共享的依赖关系就像:
如果一个应用程序需要已升级的依赖,而另一个不需要,会发生什么?
当你删除一个应用程序会发生什么?是不是真的删除了?
你能删除旧的依赖吗?
你还记得现在想的删除软件,还能回退在当时安装时被迫做出的所有改动吗?
简单的事实是:你使用的软件越多,则越难管理。即使你可以花时间和精力找出安装和运行应用程序的方法,如何能有信心地保证安全呢?开源和闭源代码发布的安全更新持续不断,考虑到所有的问题往往是不可能的。运行的软件越多,它受攻击的风险就越大。所有这些问题都可以通过仔细核算资源管理来解决,但这也很琐碎,而且并不那么好处理。你的时间应该更好地花在你试图安装、升级或发布的软件上面。构建Docker的人都会有此共识让你在任何时候都可用最小的工作量使得这一切变得轻而易举。
如果没有Docker,一台机器运行完看起来就像一个装满垃圾的抽屉。应用程序有各种各样的依赖。一些应用程序依赖于特定的系统库,常见的像语音、网络、图形等。其他依赖于所使用语言的标准库。
某些应用依赖于其他应用,例如Java程序依赖于Java虚拟机,或Web应用程序可能依于一个数据库。对正在运行的程序而言,要求一些稀缺资源的独占访问,如网络连接或文件,是很常见的。
今天,要是没有Docker,应用遍布整个文件系统,并最终创造出一个相互影响的凌乱关系。如图1-3所示为没有Docker时示例应用是如何依赖于例库的。
Docker保留了通过容器和镜像进行隔离的所有一切。如图1-4所示说明了这些相同的应用程序及其依赖在容器中如何运行。随着链接断裂,以及每个应用程序整齐在列,理解该系统并非难事。
如果没有Docker或虚拟机,可移植性一般以 单个程序为级别,通过一 些常用的工具来实现。例如,Java 程序员可以编写一个程序,在多个操作系统上几乎都能正常工作,因为程序依赖于一种被称为Java虚拟机(JVM)的程序。。Docker 改善了每个程序的可移植性,无论它用什么语言编写,为什么操作系统而设计,或是在什么样的运行环境下。
到目前为止,我所提到Docker的大多数情况,都是从软件工作的角度来看的,以及在容器外部这样做的好处。但是Docker也会保护我们在容器内运行的软件。软件程序可能有各种各样的情况,出现错误或带来安全风险:
程序可能是由攻击者编写的。
好心的开发人员也会编写出有害的错误程序。
程序可能会意外地由于输入处理的故障,被攻击者利用。
无论何种方式,运行软件都将给计算机带来安全威胁。由于运行软件是拥有计算机的主旨,应谨慎地应用实际的降险措施。
像物理的牢房,容器里的任何东西只能访问在它内部的东西。此规则有例外,但仅在用户显式创建时。容器限制了一个程序对其他程序带来的影响范围、可访问的数据和系统资源的影响范围。图1-5说明了容器内部运行和外部运行软件的区别。
第一,Docker提供了所谓的抽象。抽象允许你以简化的方式处理复杂的工作。所以,在使用Docker的前提下,不用再专注于与安装应用程序相关的复杂性和细节,我们需要考虑的是我们想安装什么样的软件。这就像起重机装载航运集装箱到船舶上,用Docker安装任何软件的过程都是相同的。该起重机拾取集装箱的形状或装运集装箱的大小可能会不同,但拾取的方式将始终是相同的。而且所有工具对任何分发的容器而言,均可重复使用。
这也适合移除应用时的情况。当你要删除软件时,你只要告诉Docker要刪除哪个软件。没有散落在外的文件,因为它们都被封装在容器中。你的机器将会变得清洁,就像在安装之前那个样子。
容器抽象和Docker所提供的容器管理工具,将改变系统管理和软件开发。Docker很重要,是因为它使得大家都可以使用容器,用它来节省时间、金钱和精力。
第二,有一个重要的推广使用容器和Docker的软件社区。这种推动是如此强大,像亚马逊、微软和谷歌都共同努力,促进其发展,并在自己的云产品中采用它。这些公司已经很难得地走到了一起,支持这个开源项目,而不是开发和发布自己的解决方案。
第三,它为PC端所做的像应用商店为移动设备所做的一样。它使软件安装、划分和删除变得十分简单。更妙的是,Docker 有跨平台和开放的特点。试想一下,如果所有主要智能手机享用相同的应用程序商店,这将是一一个相当大的市场。 有了这项技术,操作系统之间的界限开始变得模糊,在第三方产品的选择中操作系统不再是一一个考量因素。
第四,我们终于开始看到通过操作系统实现的更好、更先进的隔离功能。这似乎不起眼,但是不少人正试图让计算机通过操作系统层面的隔离获得更大的安全。很遗憾他们辛勤工作了这么久,才看到大规模的普及。容器以这种或那种形式存在了几十年,Docker 的伟大之处在于,帮我们充分利用这些功能的同时,又没有那些复杂性。
Docker可以运行在大多数计算机上,无论工作或是在家都可使用。实际上,到底有多普遍呢?
Docker可以运行在几乎任何地方,但是,这并不意味着你会想这样做。例如,目前Docker只能运行Linux操作系统上的应用程序。这意味着,如果你想运行OS X或Windows的本地应用程序,你没有办法通过Docker做到。
应用范围限定在Linux服务器或桌面上运行的软件,即可以在容器中运行几乎所有的应用程序。这包括服务器应用程序,如Web服务器、邮件服务器、数据库、代理服务器等。桌面软件如网络浏览器、文字处理软件、电子邮件客户端或其他工具也很适合。即使是信任的程序也一样危险,就像从互联网上下载后运行的程序会交换用户提供的数据或网络数据。在容器中使用低权限的用户运行,将有助于保护系统免受攻击。
除了增加防守的深度,每天的日常任务使用Docker有助于保持计算机的清洁。保持一台整洁的机器能避免共享资源的问题,易于软件安装和移除。同样也会便于计算机安装、移除和分配,简化计算机管理,进而从根本上改变企业维护的方式。
记住一件最重要的事情,要了解容器何时不适用——容 器不能改善程序的安全,特别当不得不用最高权限访间计算机的时候。在写本文的时候,这样做是可能的,但很复杂。容器不是安全问题的总解决方案,但它可以用来预防许多类型的攻击。请记住,你不应该使用不受信任来源的软件。如果软件需要管理权限,请弄清楚是不是合理的。也就是说,盲目地将客户提供的容器运行在互相协作的环境中是一个坏主意。
官网:
Docker官网
docker中文网站
仓库:
Docker Hub官网
架构图如下
Docker使用客户机-服务器架构。Docker客户机与Docker守护进程通信,后者负责构建、运行和分发Docker容器等繁重的工作。Docker客户端和守护进程可以运行在同一个系统上,或者您可以将一个Docker客户端连接到一个远程Docker守护进程。Docker客户机和守护进程通过UNIX套接字或网络接口使用REST API进行通信。
The Docker daemon
Docker守护进程(dockerd)侦听Docker API请求并管理Docker对象,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务。
The Docker client
Docker客户机(Docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如docker run之类的命令时,客户机将这些命令发送给dockerd, dockerd执行这些命令。docker命令使用docker API。Docker客户端可以与多个守护进程通信。
Linux虚拟机中安装docker