Python、Java、大数据、人工智能分享

阿里P8大佬,耗时72小时整理的Docker实战笔记,你值得拥有

2020-06-30  本文已影响0人  Java领域指导者

前言

Docker如日中天,这不是单纯的炒概念,Docker确确实实解决了开发与运维的痛点,因此在企业开发中得到了非常广泛的使用。

Docker是一个开放源代码软件项目,让应用程序部署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一-个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。

Docker是有史以来增长最快的开源项目之一,在其周围的生态系统也是以类似的速度不断发展。由于这些原因,本篇的重点完全在于Docker的工具集。这一范围限定不仅能使内容选材更精准,帮助读者了解在他们的特有实例中如何应用Docker功能;一旦读者们牢牢把握住了本书涉及的基础知识,他们也能应对更大的问题,进而探索整个生态系统。

Docker学习路线

有了学习路线,是不是有种豁然开朗的感觉?那就趁热打铁,跟小编一起进入Docker实战,由项目出发,彻底吃透他!!!

本篇被分成3个部分

第1部分,第1-6章:

介绍Docker和容器的特点。帮助你理解如何安装和卸载Docker中发布的软件。你将学习如何运行、管理,并在不同的容器结构连接不同类型的软件。第一部分介绍每一个Docker用户需要的基本技能。

第2部分,第7-10章:

介绍Docker的封装和软件的分发,涵盖了不同大小Docker镜像的底层机制,以及对不同的封装和分发方法所进行的调查。这一部分 还包括对DockerDistribution项目的的深入分析。

第3部分,第11-12章

介绍多容器项目和多主机环境,覆盖了Docker Compose、Machine 和Swarm项目。这部分内容会指导构建和部署多个真实的实例,规模接近于大型的服务器软件。


第1部分:保持一台整洁的机器

第1章:欢迎来到Docker世界

本章简要介绍了Docker,它可以帮助系统管理员、开发人员和其他软件用户解决问题。在本章中,你将要了解到:

Docker 采用后端的方法来解决常见的软件问题,并简化了安装、运行、发布和删除软件的体验。它由一个命令行程序、一个后台守护进程和一套远程服务组成。它与Docker公司提供的社区工具集成在一起。

容器的抽象是其后端方法的核心。

容器为软件创建了一致的界面和使其能够开发更复杂的工具。

容器有助于保持你的机器整洁,因为容器内的软件不能使用容器以外的任何东西,也没有共享的依赖关系。

由于Docker在Linux、OS X和Windows上可用并被支持,大多数包装在Docker镜像中的软件可以在任何计算机上使用。

Docker 不提供容器技术,它隐藏了直接和容器软件打交道的复杂性。


第2章:在容器中运行软件

Docker项目的核心要点是使用户能够在容器上运行软件。本章介绍如何使用Docker实现这一目的。本章所涵盖的理念和功能包括以下内容:

容器可以基于虚拟终端,连接到用户shell或以守护模式的形式运行。

在默认情况下,每一个Docker容器都有自己的PID命名空间,隔离了每个容器的进程信息。

Docker用产生的容器ID、 简写的容器ID,或者其人性化的名称来标识每个容器。

所有容器都在四个不同状态中:正在运行、暂停、重新启动或退出。

Docker exec命令可以在正运行的容器内运行一个额外的进程。

用户可以通过输入或在容器创建时给进程指定环境变量的方式,提供额外的配置。

使用--read-only标志创建容器时,会将挂载的容器文件系统设置为只读,防止容器被修改。

容器重启策略,即在容器创建时设置--restart标志,将有助于系统出现故障时进行自动恢复。

Docker使用docker rm命令清理容器,和创建时一样简单。


第3章:软件安装的简化

软件的安装和管理任务带来了一些独特的挑战。本章介绍了如何使用Docker来解决这些问题。本章涵盖的核心理念和内容如下:

Docker用户可使用仓库名称来确定他们想通过Docker安装的软件。

Docker Hub是默认的注册服务器,可以通过网站或docker命令行工具在DockerHub_上找到需要的软件。

docker命令行工具可以很方便地通过其他注册服务器或其他形式来分发安装软件。

镜像仓库配置中会包括注册服务器的主机信息。

docker load 和docker save 命令可以将TAR档案文件用来加载和保存镜像。

分发一个项目的Dockerfile可简化用户机器上构建镜像的过程。

镜像通常和其他镜像都有父/子的关联。这些关系构成分层。当我们说,我们已经安装了一个镜像,我们是说已经安装了一个目标镜像,及其依赖的每个镜像层。

使用分层构建镜像,可重用分层,并可节省分发带宽和机器上的存储空间。


第4章:持久化存储和卷间状态共享

学习如何使用Docker的第一个重大障碍是理解存储卷和文件系统。本章做了深入介绍,其中包括:存储卷允许容器与主机或其他容器共享文件。

存储卷是主机文件系统的一部分, Docker将主机文件系统挂载到容器中指定位置。

两种类型的存储卷: Docker管理卷挂载主机文件系统的Docker目录,绑定挂载卷可挂载主机文件系统的任何位置。

存储卷有生命周期,且独立于任何特定的容器,但是一个用户只能通过容器句柄引用Docker管理卷。

孤立卷问题会导致磁盘空间难以恢复。可在dockerrm命令中使用-v选项来避免此问题。

卷容器模式对保证存储卷有序组织,并避免孤立卷问题非常有用。

数据打包的卷容器模式对给其他容器分发静态内容非常有用。

多态容器模式是一种组成最小功能组件并最大化重用的方法。


第5章:网络访问

网络是一个比较宽泛的概念,需要花费好几本书才能够覆盖全面。Docker提供的单主机网络工具涉及一些网络的基础知识,本章应该能够帮助读者对这些知识有一个基础的认识。在阅读本章的过程中,你能够学习到以下知识:

Docker提供了四个网络容器原型:Close容器、Bridged容器、Joined容器和Open容器。

Docker创建的网桥网络会将参与的容器互相绑定到一起,并且绑定到主机所依附的网络上。

当Docker后台进程启动时,可以使用docker命令行选项用自定义的网桥接口替代Docker创建的网桥接口。

Docker run命令的选项能够被用来开放容器接口的端口,绑定容器开放端口到主机的网络接口上,还能连接其他的容器。

禁止任意的跨容器通信是非常简单的,并且能够构建一个深度防御的系统。

使用链接能够提供一个低负载的本地服务发现机制,并且映射具体的容器依赖。


第6章:隔离——限制危险

本章介绍了Linux提供的隔离特性,并讨论了Docker如何使用这些特性来构造可配置的容器。有了这些知识,你就能够自定义容器隔离度,使得Docker能够适用于任何用户场景。本章包含了以下内容:

Docker使用cgroups让用户能够设置内存限制、CPU权重、CPU核限制,还有设备访问限制。

每个Docker容器都有各自的IPC命名空间,它们能够被其他容器或主机共享,以此建立基于共享内存的高速通信。

Docker还不支持USR命名空间,因此容器中的用户和用户组ID和主机上具有相同ID的用户和用户组是相等的。

你可以并且应该使用dockerrun和docker create命令的-u选项使得容器以非root用户运行。

尽可能避免容器以特权模式运行。

Linux能力提供了操作系统特性的授权功能。Docker去除某些能力是为了提供合理的默认隔离配置。

使用--cap-add和--cap-drop选项来赋予或去除容器的能力。

Docker提供了配置选项来集成加强隔离技术,比如SELinux和AppArmor。 这些都是非常强大的工具,任何认真严肃的Docker采用者都应该研究它们。


第2部分:镜像发布如何打包软件

第7章:在镜像中打包软件

这章包含Docker镜像创建、标签管理和其他发布所需要关心内容。这些内容能够帮助你构建镜像和成为一个更加优秀的容器使用者。下面是本章的关键内容:

当使用docker commit命令提交容器时,新的镜像被创建。

当一个容器被提交,启动容器时的配置也会被编码进新镜像的配置文件中。

一个镜像由多层以栈形式组成,且镜像由其中的最顶层来标识。

镜像的磁盘大小就是组成镜像的层的大小总和。

可以使用docker export和docker import命令将镜像导出为压缩文件格式,或将压缩文件导入到镜像。

docker tag 命令能够被用来对同一个仓库赋予多个标签。

仓库维护者应该保持标签的实用性,让用户更容易采用和迁移控制。

将软件的最新稳定版标记为latest.

提供细粒度、重叠的标签,这有利于用户掌控软件的版本进展。


第8章:构建自动化和高级镜像设置

大多数Docker镜像都是从Dockerfile自动构建的。本章包含了Docker 提供的构建自动化方法,还有Dockerfile 的最佳实践。在学习下一章内容前,请确保你已经理解了本章的关键内容:

Docker提供了一个镜像自动化构建程序,它会从Dockerfile中读取指令来构建镜像。

每一个Dockerfile指令都会创建一一个镜像层。

尽可能地合并指令,这样能够减少镜像的大小和层的数量。

Dockerfiles包含了能够设置镜像元数据的指令,比如说默认用户、开放端口、默认命令和入口点。

其他的Dockerfile指令能从本地文件系统或远程目录复制文件到构建的镜像中。

下游的构建会继承上游Dockerfile中ONBUIILD指令设置的构建触发。

启动脚本应该用来在启动主要应用前验证容器的执行,上下文。

一个有效的执行上下文应该拥有正确的环境变量集合,网络依赖的可用性和一个合适的用户配置。

init程序能够被用来启动多个进程、监控这些进程、清除孤立的进程和转发信号量到子进程中。

应该使用内容可寻址镜像标识符,创建非root的默认用户和禁止或去除任何带有SUID或SGID权限的可执行文件来加固镜像。


第9章:公有和私有软件分发

本章涵盖了各种软件分发的机制以及Docker在每个分发机制方面的价值贡献,最近实施了分发渠道或者目前正在这样做的读者可能需要额外的洞察力来审视他们的解决方案,而其他的读者会了解更多有效的选择。在任何情况下,重要的是在继续往下阅读之前,要确保你已经获得了以下的知识:

有一个选择的选项图谱显示了你的选择范围。

你应该总是使用一组一致的选择标准,以评估你的分发选项并确定应该使用哪个方法。

托管的公有仓库提供了出色的项目可见性,是免费的,并且只需要非常少的经验就可以采用。

因为镜像是由一个受信任的第三方构建的,所以消费者将对其自动构建产生的镜像有更高程度的信任。

托管的私有仓库对于小型团队是划算的,提供了令人满意的访问控制。

运行自己的Registry使你能够构建适合特殊使用案例的基础设施,并且不需要放弃Docker的分发设施。

将镜像分发为文件,可以用任何文件共享系统来完成。

镜像源代码分发是非常弹性的,但是在你运用的时候会非常复杂,使用流行的源代码分发工具和模式会让事情变得简单。


第10章:运行自定义Registry

本章深入探讨了如何从分发项目构建一个Docker Registry, 这个信息对于打算部署自己的Registry以及想要开发一-个可以有深入了解的主镜像分发渠道的读者是非常重要的,该章具体涵盖了以下几点:

一个Docker Registry 是由其公开的API定义的,分发项目是一个对于Registry API V2的开源实现。

运行你自己的Registry 很简单,从registry:2镜像启动一个容器即可。

分发工程通过YAML文件配置。

实现有多个客户端的集中式的Registry, 通常需要实现一个反向代理,采用TLS,并添加身份认证机制。

身份认证可以移到反向代理或者由Registry本身实现。

虽然有其他身份认证机制可用,HTTP基础身份认证是最简单的配置,并最受欢迎。

反向代理层可以帮助解决RegistryAPI对于多个客户端版本的兼容性问题。

在生产环境中通过绑定加载卷和环境变量配置覆盖来注入机密材料,不要提交机密材料到镜像里。

集中式Registry考虑采用远程BLOB存储,比如Azure、 S3或者Ceph。

分发项目可以通过创建一个元数据缓存(基于Redis) 或者采用Amazon web服务CloudFront存储中间件这两种方式配置为可伸缩的。

将分发项目与你剩下的部署项目、分布式系统和数据中心基础设施通过通知集成,非常简单。

通知以JSON格式推送事件数据到已配置的端点。


第3部分:多容器和多主机环境

第11章:Docker Compose声明式环境

本章聚焦于一个名为Docker Compose的Docker客户端的辅助工具,其提供了缓解单调沉闷的容器命令行管理工作的功能,本章包括以下几个方面:

Docker Compose 是一个用于定义、启动和管理服务的工具,其中的服务被定义为Docker容器的一个或多个副本。

Compose使用YAML配置文件来提供环境定义。

使用Docker-compose命令行程序,你可以构建镜像、启动和管理服务、扩展服务并在任何运行DockerDaemon的主机上查看日志。

在项目中管理环境和迭代的Compose命令,类似于docker命令行。构建、启动、停止、删除和列出服务,所有这些都相当于单个容器关注的那些。

有了DockerCompose,你可以通过运行一个up和down命令来伸缩容器数目。

借助于YAML格式的声明式环境配置可以启用环境版本控制、共享、迭代和一致性。


第12章:Docker Machine和Swarm集群

Docker Machine和Docker Swarm都为Docker Engine提供了增强应用程序的功能,这些和其他相关技术将帮助你运用在本书中所学到的从一开始在一台单独的计算机上使用Docker到在多台计算机上管理容器集群的知识。当你小有所成时,对于以下几点有一个全面深入的了解是非常重要的:

用户可以使用DockerMachine的create命令创建一个本地虚拟机或者在云上创建一台Machine。

Docker Machine 的env和config 子命令可用于配置Docker客户端与DockerMachine提供的远程Docker Engine-起 工作。

Docker Swarm是一个向后兼容Docker远程API的协议,并且可以在一组成员节点上提供集群设施。

Swarm manager程序实现了Swarm API, 并且为集群处理容器调度工作。

Docker Machine为Swarm node和manager都提供了flag。

DockerSawrm提供了三种不同的调度算法,可以使用过滤器进行调整。

DockerEngine的标签和其他默认属性可以通过容器调度约束用作过滤标准。

容器调度关联可以用来在同- -台主机上将容器置为另外的容器, 这些容器或者镜像匹配一个已提供的模式或者表达式。

当任何一个Docker客户端被配置为与- 一个Swarm端点进行通信时,客户端将与整个Swarm互动,就好像是一台Docker Machine一样。

Docker Swarm目前调度在同一个节点上依赖的容器,直到多主机网络的发行版发布,或者你可以提供另一个服务发现机制并禁用Swarm的依赖性过滤器。

多主机网络将从Docker容器中的应用程序关注点抽象容器位置信息,每个容器在Overlay网络上都将是一台主机。


后记

Docker背后的想法是很简单的,创建一个轻量级的虚拟环境,称之为容器,其仅持有你的应用程序及其依赖。Docker Engine使用主机操作系统来构建和管理这些容器。它们易于安装、管理和删除,容器内运行的应用程序共享资源,使得它们的足迹很微小。

《Docker实战》教会我们如何创建、部署和管理Docker容器托管的应用程序,在以一个清晰透彻的对于Docker模式的开篇介绍之后,你将会学到如何在容器内打包应用,包括测试和分发应用的技术。你还将学习如何编排容器和应用程序以及它们的安装和卸载。本篇使用精心设计的示例教你如何从安装、删除到编排容器和应用程序。从开发和测试机器到全面的云服务部署的这些领域一路走下来,你会发现使用Docker 的各种技术。

以上就是小编帮大家整理的Docker实战,因为篇幅限制,更多细节无法展开,只是帮大家整理了小结,方便大家整理预览,需要完整无缺页版的朋友,请转发并关注小编,并+++VX:bjmsb1来免费领取~~~

喜欢小编请多多点赞评论转发,关注小编,你们的支持就是小编最大的动力!!!

上一篇下一篇

猜你喜欢

热点阅读