感谢我女儿 Cindy 为本站提供的“涂鸦”缩略图~

精通Docker第三版 – 第一章 Docker概览

Coding Alan 7天前 50次浏览 0个评论

欢迎来到《精通Docker第三版》!第一章将涵盖你应该已经有所了解的Docker基础知识。但如果你尚不具备相应知识,本章将帮助你了解相关基础知识,这样学习后续章节就不会觉得困难重重。在学完本书后,你将成为Docker大神(传销即视感😂),可以在你自己的环境中实施Docker,基于它创建和维护应用。

本章中,我们将来复习如下高级知识:

  • 了解 Docker
  • 独立主机、虚拟机和Docker之间的区别
  • Docker安装程序和Docker安装
  • Docker命令
  • Docker和容器生态

技术要求

本章中,我们将讨论如何在本地安装Docker。要实现安装,我们需要一个运行着以下任意一种操作系统的宿主机:

  • macOS High Sierra及以上版本
  • Windows 10专业版
  • Ubuntu 18.04

查看如下视频中的实操(油管视频,墙内的朋友请忽略~):

了解Docker

在进行Docker的安装之前,我们先来了解Docker技术所致力于解决的问题。

开发人员

Docker背后的公司总是将该程序描述为“在我的机器上运行正常”的问题。这个问题有一张图片总结的最好,是一张以“灾难女孩”迷因(Disaster Girl meme)为底,添加了Worked fine in dev, ops problem now(dev正常,运维躺枪)的文案,几年前开始频繁出现在 PPT、论坛和Slack频道上。虽然很搞笑,但不幸地是这也是血淋淋的现实,我自己也亲身经历这一情况,让我们来看看这种问题究竟代表什么。

精通Docker第三版 - 第一章 Docker概览

译者注:“灾难女孩”真名Zoë Roth,她在互联网上的风靡源自上图这张以火灾为背景的迷之微笑,后来被互联网上的吃瓜群众们 P 到泰坦尼克号、珍珠港等各种背景图上。原照片为其父亲所拍摄,背景中的火灾实为消防人员测试时大火。

问题

即便是遵循DevOps最佳实践的世界里,仍然会存在开发者的工作环境与最终生产环境不匹配的情况。

例如,开始者可能使用macOS,其中的PHP版本与托管生产代码的Linux主机上的版本不匹配。即便是版本相匹配,我们还需要处理配置以及运行该PHP版本整体环境的不同,举例来说,一个潜在的问题是要处理不同操作系统版本间文本权限处理方式不同的问题。

所有这些都会导致在开发人员将自己的代码部署到线上时,却无法正常运行。那么是否应将生产环境进行配置来与开发者的电脑相匹配呢,或者让开发人员在与生产环境相一致的工作环境下进行开发呢?

这是一个理想的世界,从开发人员的电脑到生产服务器所有内容都应保持一致,但这一乌托邦通过传统的技术难以实现。每个都有自己的工作习惯和个人喜好,哪怕只有一个系统工程师在开发时强制跨平台的一致性已经很困难了,不消说一个工程师团队与数百个开发人员合作的情况了。

Docker 解决方案

在Mac或Windows上使用Docker,开发人员可以很轻易地将代码封装到他们自定义的容器里,或者在与系统管理员或运维团队合作时将其创建为一个Dockerfile。我们将在第二章 创建容器镜像中讲解这一内容, 并且在第五章 Docker Compose中会深入讲解Docker Compose文件。

开发人员仍然可以选择自己喜欢的IDE,并在开发代码时保持原有的工作流。我们在本章的后续部分中会发现,安装和使用Docker一定都不困难,其实考虑至曾经维护环境一致性的繁琐,哪怕是有自动化的加持,Docker会简单到难以置信-像梦一样。

运维人员

作者在从事的从年运维工作中,常常会遇到下面的问题。

问题

假设我们有五台服务器:三台负载均衡web服务器,两台配置为主从用于运行应用一的数据库服务器。我们使用工具Puppet或Chef来自动管理软件栈和5台服务器上的配置。

一切都很顺利,直到接到新的需求。我们需要将应用二部署在运行应用一相同的服务器上。表面上没有任何问题,我们可以修改Puppet或Chef的配置来添加新用户、vhosts、拉取新代码,诸如此类。但是,我们注意到应用二要求使用比应用一更高的软件版本。

事情再糟糕一些,我们已经知道应用一竭力避免与新的软件栈进行兼容,而应用二又不向后兼容。

使用传统技术,我们只有几个选择,每一种都会在某种程度上带来问题:

  1. 请求更多的服务器?这是传统技术可能最安全的技术方案,但并不意味着会有预算来添置更多的资源。
  2. 重新架构方案?从负载均衡或副本中拿出一台web服务器和数据库服务器,以应用二的软件栈重新进行部署,从技术上可能是最简单的方案。但是我们引入了应用二的单点问题,同时也降低了应用二的冗余:我们一开始使用3台web服务器和2台数据库服务器可能是有原因的。
  3. 尝试在我们的服务器上同时安装新的软件?嗯,这肯定会带来问题,刚开始运行项目时这看起来是一个很好的短期方案,但这等于我们手上的是纸牌屋,在随后任意软件栈需要严重安全补丁时会摧枯拉朽般崩溃。

Docker 解决方案

这正是Docker的领域。如果把应用一放在三台服务器的容器中运行,实际可以运行不止三个容器,双倍的容器我们就可以运行6个容器,让我们可以不降低应用一的可用性的同时部署我们的应用。

在这个环境部署应用二仅仅需要在3台主机上启动容器并使用负载均衡路由到新部署的应用上。因为我们只是在容器中部署,无需担心在同一台服务器上部署、配置和管理不同版本的软件栈。

我们会在第五章 Docker Compose操作一个具体的实例。

企业

企业也深受前述相同问题的困扰,因为它们通常都会有开发人员和运维人员,但它们的规模更大,因此具有更大的风险。

问题

因为前面所说的风险,以及宕机所带来的销售或声誉的损失,企业需要在发布前对每个部署进行测试。这表示发生如下情况时新功能和修复都会裹足不前:

  • 测试环境已启动和配置
  • 应用在新启动的环境中部署
  • 执行了测试方案并且对应用和配置进行修改直到测试通过
  • 编写、提交和讨论了需求变更,来获取部署到生产环境的更新应用

这一过程可能要花费几天到数周乃至数月的时间,取决了应用的复杂性以及引入变更存在的风险。虽然在技术层面这一过程要确保持续性和可用性,在商业层面这是在引入潜在的风险。如果这一新功能在过程中受阻,而竞争对手提前出了一相似的功能,或者更糟的是一个相同的功能?

这一情形对销售和声誉带来的损伤和我们一开始竭力避免的宕机是一样的。

Docker 解决方案

首先要说Docker并不会移除操作流程,如上面我们所描述的。但是我们也说了,它会让已经连贯动作的事情更为简单。这表示我们的开发们可以在与生产环境相同配置的容器中进行运行。也意味着应用测试的方法不会太过繁杂。

比如,在开发人员查看代码时,他们知道代码可以在本地开发环境上运行(因为这正是他们进行开发的环境),我们的测试工具可以启动相同的容器来进行自动化测试。一旦使用过容器,可以删除来释放资源进行下面的测试。这意味着突然间我们的测试流程和进程变得更加灵活,并且我们可以继续利用相同的环境,而不是为下一套测试重新部署可重新制作服务器镜像。

这一流程甚至可推广至将新应用容器直接推到生产环境中。

这一过程完成的越快,我们就越能无后顾之忧地快速上线新功能并引领潮流。

独立主机、虚拟机和Docker之间的区别

那么,我们知道了Docker所能解决的问题。下面需要讨论的是Docker到底是什么以及它能做些什么。

Docker是一个容器管理系统,帮助我们以轻松和统一的方式管理Linux容器(LXC)。这让我们可以在笔记本上的虚拟环境中创建镜像并对其运行命令。在本地电脑上运行这些环境中对容器所执行的操作,和在生产环境中运行相同命令或操作的效果是一样的。

这有助于我们在迁移到生产环境时无需进行额外的操作,比如从本机将应用上线到生产环境服务器。下面我们来看下Docker容器和典型的虚拟主机环境有哪些区别。

下图展示了独立物理主机和运行虚拟主机的服务器之间的区别:

精通Docker第三版 - 第一章 Docker概览

可以看出,对于独立主机我们的三个应用同时共享相同的橙色的软件栈。在虚拟主机上运行三个应用,则可以使用两个完全不同的软件栈。下图显示了使用Docker运行相同的橙色和绿色应用:

精通Docker第三版 - 第一章 Docker概览

这张图中让我们清晰地看到使用Docker的关键好处,即,无需在每次启动容器时创建一个完整的操作系统,这缩减了容器占用的总空间。因为所有的Linux版本都使用标准内核模型,Docker依赖于宿主机操作系统如Red Hat, CentOS和Ubuntu的Linux内核。

因此,我们几乎可以将所有的Linux操作系统作为宿主机操作系统,并可对主机上其它基于Linux的操作系统进行分层 。也就是对于应用来说是安装了完整的操作系统,而现实是我们仅安装了二进制文件,如包管理器、Apache/PHP以及操作系统运行应用所需要的一些其它库。

例如,在前面的图中,我们可以用Red Hat运行橙色应用,Debian运行绿色应用,但绝不需要在主机上实际安装Red Hat 或Debian。因此,Docker的另一个好处是它所创建的镜像的大小。在创建时无需那些大块文件:内核或操作系统。这让镜像很小很紧凑,易于迁移。

安装Docker

首先我们需要的是安装器(Installer),在本地机器和服务器环境中运行Docker。下面来看哪些环境中可以安装Docker:

  • Linux (各发行版)
  • MacOS
  • Windows 10 Professional

此外我们可以在公有云中运行Docker,如 AWS(Amazon Web Services)、Microsoft Azure和DigitalOcean,这只是很少一部分。通过前面列出的不同类型的安装器,Docker在操作系统上运行的方式其实并不相同。例如,Docker在Linux上原生运行,所以如使用的是Linux,在系统中运行Docker直截了当。而如果使用的是MacOS或Windows 10,运行方式则有些许不同,因为它需要依赖于Linux。

下面分别来看在 Ubuntu 18.04 Linux桌面、MacOS和Windows 10上快速安装Docker。

在Linux (Ubuntu 18.04)上安装Docker

 

在MacOS上安装Docker

在Windows 10专业版上安装Docker

更老的操作系统

Docker命令行客户端

Docker和容器生态

开源项目

Docker CE和Docker EE

Docker, Inc.

总结

课后问题

扩展阅读

更新中…

喜欢 (1)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址