Docker技术入门与实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-11-19 15:17:04

点击下载

作者:杨保华等

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Docker技术入门与实战

Docker技术入门与实战试读:

前言

在一台服务器上同时运行一百个虚拟机,肯定会被认为是痴人说梦。而在一台服务器上同时运行一千个Docker容器,这已经成为现实。在计算机技术高速发展的今天,昔日的天方夜谭正在一个个变成现实。

多年的研发和运维(DevOps)经历中,笔者时常会碰到这样一个困境:用户的需求越来越多样,系统的规模越来越庞大,运行的软件越来越复杂,环境配置问题所造成的麻烦层出不穷……为了解决这些问题,开源社区推出过不少优秀的工具。这些方案虽然在某些程度上确能解决部分“燃眉之急”,但是始终没有一种方案能带来“一劳永逸”的效果。

让作为企业最核心资源的工程师们花费大量的时间,去解决各种环境和配置引发的Bug,这真的正常吗?

回顾计算机的发展历程,最初,程序设计人员需要直接操作各种枯燥的机器指令,编程效率之低可想而知。高级语言的诞生,将机器指令的具体实现成功抽象出来,从此揭开了计算机编程效率突飞猛进的大时代。那么,为什么不能把类似的理念(抽象与分层)也引入到现代的研发和运维领域呢?

Docker无疑在这一方向上迈出了具有革新意义的一步。笔者在刚接触Docker时,就为它所能带来的敏捷工作流程而深深吸引,也为它能充分挖掘云计算资源的效能而兴奋不已。我们深信,Docker的出现,必将给DevOps技术,甚至整个信息技术产业的发展带来深远的影响。

笔者曾尝试编写了介绍Docker技术的中文开源文档。短短一个月的时间,竟收到了来自全球各个地区超过20万次的阅读量和全五星的好评。这让我们看到国内技术界对于新兴开源技术的敏锐嗅觉和迫切需求,同时也倍感压力,生怕其中有不妥之处,影响了大家学习和推广Docker技术的热情。在开源文档撰写过程中,我们一直在不断思考,在生产实践中到底怎么用Docker才是合理的?在“华章图书”的帮助下,终于有了现在读者手中的这本书。

与很多技术类书籍不同,本书中避免一上来就讲述冗长的故事,而是试图深入浅出、直奔主题,在最短时间内让读者理解和掌握最关键的技术点,并且配合实际操作案例和精炼的点评,给读者提供真正可以上手的实战指南。

本书在结构上分为三大部分。第一部分是Docker技术的基础知识介绍,这部分将让读者对Docker技术能做什么有个全局的认识;第二部分将具体讲解各种典型场景的应用案例,供读者体会Docker在实际应用中的高效秘诀;第三部分将讨论一些偏技术环节的高级话题,试图让读者理解Docker在设计上的工程美学。最后的附录归纳了应用Docker的常见问题和一些常用的参考资料。读者可根据自身需求选择阅读重点。全书主要由杨保华和戴王剑主笔,曹亚仑写作了编程开发和实践之道章节。

本书在写作过程中参考了官方网站上的部分文档,并得到了DockerPool技术社区网友们的积极反馈和支持,在此一并感谢!

成稿之际,Docker已经发布了增强安全特性的1.32版本。衷心祝愿Docker及相关技术能够快速成长和成熟,让众多IT从业人员的工作和生活都更加健康、更加美好!作者于2014年11月作者简介

杨保华 清华大学博士毕业,现为IBM中国研究院研究员。主要从事数据中心网络解决方案的研发与部署,技术方向包括云计算、软件定义网络(SDN)、网络安全等,是国内较早从事SDN和网络虚拟化相关技术的推广者,同时也是DockerPool开源社区的发起人之一。他的个人主页为yeasy.github.io。

在本书的写作期间,得到了我的父母亲和妻子吴俞萱女士的关怀与支持,得到了公司领导和同事们的信任与鼓励,特别是刘天成帮忙审阅了部分内容。在此表示最深厚的感谢!

戴王剑 资深架构师,从事计算机网络、服务器架构设计多年,负责过多个省级项目的架构设计。热衷开源事业,是DockerPool开源社区的发起人之一。

写作期间,我的女儿戴子萱刚刚出生,感谢我的父母亲以及我的妻子刘乃华对我的大力支持,没有你们的辛勤付出,我不可能安心写完这本书,我爱你们!在这里一并感谢公司领导和同事对我的信任,感谢郭捷给予的硬件支持,在经过半年左右的测试之后,Docker在公司的项目中正式上线,并给我们的开发、测试、生产带来了实实在在的效率。特别感谢我的导师:浙江师范大学杨传斌教授,没有杨老师,我可能在毕业前就放弃从事IT行业了。本书的出版能得到杨老师的肯定,是最让我开心的事。

曹亚仑 85后,全栈Web开发者,擅长并专注于SaaS系统架构设计与研发,兴趣方向为PaaS和智能可穿戴设备。译著有《Arduino无线传感器网络实践指南》,开源图书有《程序员禅修指南》。个人主页为allengaller.com。

我要感谢我的父母和妻子丁小芬,感谢你们在我写书过程中所给予的帮助和支持,我爱你们。第一部分 Docker入门

·第1章 初识Docker

·第2章 Docker的核心概念和安装

·第3章 镜像

·第4章 容器

·第5章 仓库

·第6章 数据管理

·第7章 网络基础配置

·第8章 使用Dockerfile创建镜像

欢迎来到Docker的世界!

在这一部分里,笔者将介绍Docker的基础知识,本部分分为8章。

第1章介绍Docker开源项目以及它与现有的虚拟化技术,特别是Linux容器技术的关系;第2章介绍Docker的三大核心概念,以及如何在常见的操作系统环境中安装Docker;第3章第5章通过具体的示例操作讲解Docker的常用命令;第6章剖析如何在Docker中使用数据卷来保存数据;第7章介绍如何使用容器网络,特别是使容器访问外网和其他容器;第8章介绍如何编写Dockerfile,以及使用Dockerfile配置文件来创建镜像的具体方法和注意事项。第1章初识Docker

如果说个人主机时代大家比拼的关键是CPU主频的高低和内存的大小,那么在云计算时代,虚拟化技术无疑是整座信息技术大厦最核心的一块基石。

伴随着信息技术产业的发展,虚拟化技术已经应用到各种关键场景中。从最早上世纪60年代IBM推出的大型主机虚拟化到后来X86平台上的虚拟化,虚拟化技术自身也在不断丰富和创新。

虚拟化既可以通过硬件模拟来实现,也可以通过操作系统来实现。而近些年出现的容器虚拟化方案,更是充分利用了操作系统本身已有的机制和特性,可以实现轻量级的虚拟化,甚至有人把它称为新一代的虚拟化技术。Docker毫无疑问就是其中的佼佼者。

那么,什么是Docker?它会带来什么好处?它跟现有虚拟化技术又有何关系呢?

本章在介绍Docker项目的起源和发展之后,会剖析Docker和Linux容器技术的密切联系,以及在开发和运维中使用Docker的突出优势。最后,还将阐述Docker在整个虚拟化领域中的定位。1.1 什么是DockerDocker开源项目

Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司。Docker自开源后受到广泛的关注和讨论,目前已有多个相关项目,逐渐形成了围绕Docker的生态体系。dotCloud公司后来也改名为Docker Inc,专注于Docker相关技术和产品的开发。

Docker项目目前已加入了Linux基金会,遵循Apache 2.0协议,全部开源代码均在https://github.com/docker/docker上进行维护。在最近一次Linux基金会的调查中,Docker是仅次于OpenStack的最受欢迎的云计算开源项目。

现在主流的Linux操作系统都已经支持Docker。例如,Redhat RHEL 6.5/CentOS 6.5往上的操作系统、Ubuntu 14.04操作系统,都已经默认带有Docker软件包。Google公司宣称在其PaaS(Platform as a Service)平台及服务产品中广泛应用了Docker。微软公司宣布和Docker公司合作,以加强其云平台Azure对Docker的支持。公有云提供商亚马逊近期也推出了AWS EC2Container,提供对Docker的支持。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。

Docker基于Linux的多项开源技术提供了高效、敏捷和轻量级的容器方案,并且支持在多种主流云平台(PaaS)和本地系统上部署。可以说Docker为应用的开发和部署提供了“一站式”的解决方案。Linux容器技术

Docker引擎的基础是Linux容器(Linux Containers,LXC)技术。IBM DeveloperWorks上给出了关于容器技术的准确描述:

容器有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。

Linux容器其实不是一个全新的概念。最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具(直到今天,主流的Unix、Linux操作系统仍然支持和带有该工具)。早期的容器实现技术包括Sun Solaris操作系统上的Solaris Containers(2004年发布),FreeBSD操作系统上的FreeBSD jail(2000年左右出现),以及GNU/Linux上的Linux-VServer(http://linux-vserver.org/)(2001年10月)和OpenVZ(http://openvz.org)(2005年)。

虽然这些技术经过多年的演化已经十分成熟,但是由于种种原因,这些容器技术并没有被集成到主流的Linux内核中,使用起来并不方便。例如,如果用户要使用OpenVZ技术,就需要先给操作系统打上特定的内核补丁方可使用。

后来LXC项目借鉴了前人成熟的容器设计理念,并基于一系列新的内核特性实现了更具扩展性的虚拟化容器方案。更加关键的是,LXC被集成到了主流Linux内核中,进而成为Linux系统轻量级容器技术的事实标准。从Linux容器到Docker

在LXC的基础上,Docker进一步优化了容器的使用体验。Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以简单明了地管理和使用容器。用户操作Docker容器就像操作一个轻量级的虚拟机那样简单。

读者可以简单地将Docker容器理解为一种沙盒(Sandbox)。每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,容器自身对资源的需求也十分有限,远远低于虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。

有理由相信,随着Docker技术的进一步成熟,它将成为更受欢迎的容器虚拟化技术实现,得到更广泛的应用。1.2 为什么要使用DockerDocker容器虚拟化的好处

Docker项目的发起人和Docker Inc.的CTO Solomon Hykes认为,Docker在正确的地点、正确的时间顺应了正确的趋势——即高效地构建应用。现在开发者需要能方便地创建运行在云平台上的应用,也就是说应用必须能够脱离底层机器,而且同时必须是“任何时间任何地点”可获取的。因此,开发者们需要一种创建分布式应用程序的方式,这也是Docker所能够提供的。

举个简单的应用场景的例子。假设用户试图基于最常见的LAMP(Linux+Apache+MySQL+PHP)组合来运维一个网站。按照传统的做法,首先,需要安装Apache、MySQL和PHP以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作正常;如果不正常,则意味着更多的时间代价和不可控的风险。可以想象,如果再加上更多的应用,事情会变得更加难以处理。

更为可怕的是,一旦需要服务器迁移(例如从阿里云迁移到腾讯云),往往需要重新部署和调试。这些琐碎而无趣的“体力活”,极大地降低了工作效率。

而Docker提供了一种更为聪明的方式,通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。Docker在开发和运维中的优势

对开发和运维(DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。

具体说来,Docker在开发和运维过程中,具有如下几个方面的优势。

·更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程可见,使团队更容易理解应用的创建和工作过程。

·更高效的资源利用。Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。

·更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性让用户可以在不同平台之间轻松地迁移应用。

·更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:

·Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。

·Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。

·Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。

·Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。

Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启动N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的容器,并将应用放到容器内即可。

当然,在隔离性方面,传统的虚拟机方式多了一层额外的隔离。但这并不意味着Docker就不安全。Docker利用Linux系统上的多种防护机制实现了严格可靠的隔离。从1.3版本开始,Docker引入了安全选项和镜像签名机制,极大地提高了使用Docker的安全性。

下表总结了使用Docker容器技术与传统虚拟机技术的特性比较。1.3 虚拟化与Docker

虚拟化技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化(Computing Virtualization),或通常说的服务器虚拟化。维基百科上的定义如下:

在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。

可见,虚拟化的核心是对资源进行抽象,目标往往是为了在同一个主机上运行多个系统或应用,从而提高系统资源的利用率,同时带来降低成本、方便管理和容错容灾等好处。

从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。其中,真正意义上的基于硬件的虚拟化技术不多见,少数如网卡中的单根多IO虚拟化(Single Root I/O Virtualization and Sharing Specification,SR-IOV)等技术,也超出了本书的讨论范畴。

基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。其中,前者一般指的是一些模拟设备或Wine这样的软件。后者又可以细分为如下几个子类:

·完全虚拟化。虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需进行修改。例如VMware Workstation、VirtualBox、QEMU等。

·硬件辅助虚拟化。利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-VT和AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无需修改,例如VMware Workstation、Xen、KVM。

·部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化。

·超虚拟化(Paravirtualization)。部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen。

·操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。

可见,Docker以及其他容器技术都属于操作系统的虚拟化这个范畴。

Docker虚拟化方式之所以拥有众多优势,这跟操作系统的虚拟化自身的特点是分不开的。下面图1-1比较了Docker和常见的虚拟机方式的不同之处。

图1-1 Docker和传统的虚拟机方式的不同之处

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。

Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。1.4 本章小结

通过本章内容的叙述,相信读者已经对于Docker技术不再陌生,并为它带来的众多优势所深深吸引。通过为Linux容器技术提供更简便的使用和管理方案、更高效的版本控制机制,Docker让容器技术一下子变得前所未有的方便易用。

笔者相信,随着云计算技术的进一步发展,以Docker技术为代表的容器技术必将在整个虚拟化领域占有越来越重要的地位。第2章Docker的核心概念和安装

本章首先介绍Docker的三大核心概念:

·镜像(Image)

·容器(Container)

·仓库(Repository)

读者理解了这三个核心概念,就能顺利地理解Docker的整个生命周期。社区讨论很激烈的一个话题,就是Docker和Linux容器技术到底有何区别?相信读者在阅读完本章后,会得到更清晰的答案。

随后,笔者将介绍如何在常见的操作系统上安装Docker,包括Ubuntu、CentOS、Windows和MacOS等。2.1 核心概念Docker镜像

Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统。

例如:一个镜像可以只包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。镜像也可以安装了Apache应用程序(或用户需要的其他软件),可以把它称为一个Apache镜像。

镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并通过简单的命令就可以直接使用。Docker容器

Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。

容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

读者可以把容器看做一个简易版的Linux系统环境(这包括root用户权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序打包而成的应用盒子。

镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。Docker仓库

Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。

有时候会看到有资料将Docker仓库和注册服务器(Registry)混为一谈,并不严格区分。实际上,注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。仓库注册服务器的示例如图2-1所示。

图2-1 仓库和注册服务器

根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。

目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。

当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。

当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需将其从仓库上pull下来就可以了。注意 可以看出,Docker利用仓库管理镜像的设计理念与Git非常相似。2.2 安装Docker

Docker支持在主流的操作系统平台上使用,包括Ubuntu、CentOS、Windows以及MacOS系统等。当然,在Linux系列平台上是原生支持,使用体验也最好。Ubuntu1.Ubuntu 14.04及以上版本

Ubuntu 14.04版本官方软件源中已经自带了Docker包,可以直接安装:$ sudo apt-get update$ sudo apt-get install -y docker.io$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

以上流程使用Ubuntu 14.04系统默认自带docker.io安装包安装Docker,这样安装的Docker版本相对较旧。

读者也可通过下面的方法从Docker官方源安装最新版本。首先需要安装apt-transport-https,并添加Docker官方源:$ sudo apt-get install apt-transport-https$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"$ sudo apt-get update

之后,可以通过下面的命令来安装最新版本的Docker:$ sudo apt-get install -y lxc-docker

在安装了Docker官方软件源后,若需要更新Docker软件版本,只需要执行以下命令即可升级:$ sudo apt-get update -y lxc-docker 注意 后文中使用$作为终端引导符时,表示非root权限用户;#代表是root用户。2.ubuntu 14.04以下的版本

如果使用的是较低版本的Ubuntu系统,则需要先进行内核更新并重启系统后再进行安装:$ sudo apt-get update$ sudo apt-get install -y linux-image-generic-lts-raring linux-headers-generic-lts-raring$ sudo reboot

重启后,重复在Ubuntu 14.04系统的安装步骤即可。CentOS

Docker支持CentOS 6及以后的版本。

对于CentOS 6系统可使用EPEL库安装Docker,命令如下:$ sudo yum install -y http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm$ sudo yum install -y docker-io

对于CentOS 7系统,由于CentOS-Extras源中已内置Docker,读者可以直接使用yum命令进行安装:$ sudo yum install -y docker

目前在Centos系统中更新Docker软件有两种方法,一是自行通过源码编译安装,二是下载二进制文件进行更新。Windows

目前Docker官方已经宣布Docker通过虚拟机方式支持Windows 7.1和8,前提是主机的CPU支持硬件虚拟化。由于近几年发布的Intel和AMD CPU基本上都已支持了硬件虚拟化特性,因此在Windows中使用Docker通常不会有硬件支持的问题。

由于Docker引擎使用了Linux内核特性,所以在Windows上运行的话,需要额外使用一个虚拟机来提供Linux支持。这里推荐使用Boot2Docker工具,它会首先安装一个经过加工与配置的VirtualBox轻量级虚拟机,然后在其中运行Docker。主要步骤如下:

1)从https://docs.docker.com/installation/windows/下载最新官方Docker for Windows Installer。

2)运行Installer。这个过程将安装VirtualBox,MSYS-git,boot2docker Linux ISO镜像,以及Boot2Docker管理工具。如图2-2所示。

图2-2 Windows下安装Docker

3)打开桌面的Boot2Docker Start程序,或者用以下命令:Program Files>Boot2Docker for Windows。此初始化脚本在第一次运行时需要输入一个SSH Key Passphrase(用于SSH密钥生成的口令)。读者可以自行设定,也可以直接按回车键,跳过此设定,如图2-3所示。

图2-3 Boot2Docker启动后界面

此时Boot2Docker Start程序将连接至虚拟机中的Shell会话,Docker已经运行起来了!Mac OS

目前Docker已经支持Mac OS X 10.6Snow Leopard及以上版本的Mac OS。

在Mac OS上使用Docker,同样需要Boot2Docker工具的支持。主要步骤如下:

1)下载最新官方Docker for OS X Installer。读者可以从https://docs.docker.com/installation/mac/下载。

2)双击运行安装包。这个过程将安装一个VirtualBox虚拟机、Docker本身以及Boot2Docker管理工具,如图2-4所示。

3)安装成功后,找到Boot2Docker(Mac系统的Application或“应用”文件夹中)并运行它。现在进行Boot2Docker的初始化:$ boot2docker init$ boot2docker start$ $(boot2docker shellinit)

读者将看到虚拟机在命令行窗口中启动运行,并显示Docker的启动信息,则说明Docker安装成功。当虚拟机初始化完毕后,可以使用boot2docker stop和boot2docker start来控制它。

注意:如果在命令行中看到如下提示信息:To connect the Docker client to the Docker daemon, please set: export DOCKER_HOST=tcp://192.168.59.103:2375

可以执行提示信息中的语句:export DOCKER_HOST=tcp://192.168.59.103:2375。此语句的作用是在系统环境变量中设置Docker的主机地址。

图2-4 Mac OS上安装Boot2Docker2.3 本书环境介绍

本书的实践环境是一台装有Linux Mint 17的笔记本电脑,并使用虚拟机软件VirturBox虚拟了一套Ubuntu 14.04系统,两套系统上都安装了Docker的1.3版本,虚拟机通过VirturBox网络的NAT方式连接到外部,如图2-5所示。

图2-5 本书环境

其中,Ubuntu 14.04虚拟机将是主要的操作环境(自动获取的IP地址为10.0.2.15/24),而笔记本上装的Linux Mint环境(内网地址为10.0.2.2/24,外网地址为192.168.1.0/24段地址)将作为本地私有仓库的服务器,演示跟仓库相关的操作。

读者可根据自己本地环境,选择搭建类似的环境。2.4 本章小结

本章介绍了Docker的三大核心概念:镜像、容器和仓库。

通过这三大核心概念所构建的高效工作流程,毫无疑问,正是Docker得以从众多容器虚拟化方案中脱颖而出的重要原因。

熟悉Git和GitHub的读者,会理解这一工作流程为文件分发和合作所带来的众多优势。在后续章节,笔者将进一步地介绍围绕这三大核心概念的Docker常见操作命令。第3章镜像

镜像是Docker的三大核心概念之一。

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

本章将介绍围绕镜像这一核心概念的具体操作,包括如何使用pull命令从Docker Hub仓库中下载镜像到本地;如何查看本地已有的镜像信息;如何在远端仓库使用search命令进行搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像并且保存为外部文件。最后,还将介绍如何向Docker Hub仓库中推送自己的镜像。3.1 获取镜像

镜像是Docker运行容器的前提。

读者可以使用docker pull命令从网络上下载镜像。该命令的格式为docker pull NAME[:TAG]。对于Docker镜像来说,如果不显式地指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像。

下面,笔者将演示如何从Docker Hub的Ubuntu仓库下载一个最新的Ubuntu操作系统的镜像。$ sudo docker pull ubuntuubuntu:latest: The image you are pulling has been verifiedd497ad3926c8: Downloading [======> ] 25.41 MB/201.6 MB 51m14sccb62158e970: Download completee791be0477f2: Download complete3680052c0f5c: Download complete22093c35d77b: Download complete5506de2b643b: Download complete511136ea3c5a: Download complete

该命令实际上下载的就是ubuntu:latest镜像,目前最新的14.04版本的镜像。

下载过程中可以看出,镜像文件一般由若干层组成,行首的2185fd50e2ca这样的字串代表了各层的ID。下载过程中会获取并输出镜像的各层信息。层(Layer)其实是AUFS(Advanced Union File System,一种联合文件系统)中的重要概念,是实现增量保存与更新的基础。

读者还可以通过指定标签来下载特定版本的某一个镜像,例如14.04标签的镜像。$ sudo docker pull ubuntu:14.04

上面两条命令实际上都相当于$sudo docker pull registry.hub.docker.com/ubuntu:latest命令,即从默认的注册服务器registry.hub.docker.com中的ubuntu仓库来下载标记为latest的镜像。

用户也可以选择从其他注册服务器的仓库下载。此时,需要在仓库名称前指定完整的仓库注册服务器地址。例如从DockerPool社区的镜像源dl.dockerpool.com下载最新的Ubuntu镜像。$ sudo docker pull dl.dockerpool.com:5000/ubuntu

下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用。$ sudo docker run -t -i ubuntu /bin/bashroot@fe7fc4bd8fc9:/#3.2 查看镜像信息

使用docker images命令可以列出本地主机上已有的镜像。

例如,下面的命令列出了本地刚从官方下载的ubuntu:14.04镜像,以及从DockerPool镜像源下载的ubuntu:latest镜像。$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.04 5506de2b643b 1 weeks ago 197.8 MBdl.dockerpool.com:5000/ubuntu latest 5506de2b643b 1 weeks ago 197.8 MB

在列出信息中,可以看到几个字段信息:

·来自于哪个仓库,比如ubuntu仓库。

·镜像的标签信息,比如14.04。

·镜像的ID号(唯一)。

·创建时间。

·镜像大小。

其中镜像的ID信息十分重要,它唯一标识了镜像。

TAG信息用于标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,包括10.04、12.04、12.10、13.04、14.04等标签。

为了方便在后续工作中使用这个镜像,还可以使用docker tag命令为本地镜像添加新的标签。例如添加一个新的ubuntu:latest镜像标签如下:$ sudo docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest

再次使用docker images列出本地主机上镜像信息,可以看到多了一个ubuntu:latest标签的镜像。$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.04 5506de2b643b 1 weeks ago 197.8 MBdl.dockerpool.com:5000/ubuntu latest 5506de2b643b 1 weeks ago 192.8 MBubuntu latest 5506de2b643b 1 weeks ago 192.8 MB

细心的读者可能会注意到,这些不同标签的镜像的ID是完全一致的,说明它们实际上指向了同一个镜像文件,只是别名不同而已。标签在这里起到了引用或快捷方式的作用。

使用docker inspect命令可以获取该镜像的详细信息。$ sudo docker inspect 5506de2b643b[{ "Architecture": "amd64", "Author": "", "Comment": "", "Config": { "AttachStderr": false, "AttachStdin": false, "AttachStdout": false, "Cmd": [ "/bin/bash" ], "CpuShares": 0, "Cpuset": "", "Domainname": "", "Entrypoint": null, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "ExposedPorts": null, "Hostname": "065262ce3c91", "Image":"964692831e07f7362f5c3fedf0c4b81a622f2c6e3ec5f19d0eddff21afd64c12", "Memory": 0, "MemorySwap": 0, "NetworkDisabled": false, "OnBuild": [], "OpenStdin": false, "PortSpecs": null, "StdinOnce": false, "Tty": false, "User": "", "Volumes": null, "WorkingDir": "" }, "Container":"f26bc14cc07412402bdab911b8a935fead0322649cf042cee8515c02ebdfa53a", "ContainerConfig": { "AttachStderr": false, "AttachStdin": false, "AttachStdout": false, "Cmd": [ "/bin/sh", "-c", "#(nop) CMD [/bin/bash]" ], "CpuShares": 0, "Cpuset": "", "Domainname": "", "Entrypoint": null, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "ExposedPorts": null, "Hostname": "065262ce3c91", "Image":"964692831e07f7362f5c3fedf0c4b81a622f2c6e3ec5f19d0eddff21afd64c12", "Memory": 0, "MemorySwap": 0, "NetworkDisabled": false, "OnBuild": [], "OpenStdin": false, "PortSpecs": null, "StdinOnce": false, "Tty": false, "User": "", "Volumes": null, "WorkingDir": "" }, "Created": "2014-09-23T22:37:05.812213629Z", "DockerVersion": "1.2.0", "Id": "53bf7a53e8903fce40d24663901aac6211373a8d8b4effe08bc884e63e181805", "Os": "linux", "Parent":"964692831e07f7362f5c3fedf0c4b81a622f2c6e3ec5f19d0eddff21afd64c12", "Size": 0}]

docker inspect命令返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f参数来指定,例如,获取镜像的Architecture信息:$ sudo docker inspect -f {{".Architecture"}} 550amd64

在指定镜像ID的时候,通常使用该ID的前若干个字符组成的可区分字串来替代完整的ID。3.3 搜寻镜像

使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。用法为docker search TERM,支持的参数包括:

·--automated=false仅显示自动创建的镜像。

·--no-trunc=false输出信息不截断显示。

·-s,--stars=0指定仅显示评价为指定星级以上的镜像。

例如,搜索带mysql关键字的镜像如下所示:$ sudo docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relati... 213 [OK]tutum/mysql MySQL Server image - listens in port 3306.... 74 [OK]orchardup/mysql 36 [OK]tutum/lamp LAMP image - Apache listens in port 80, an... 32 [OK]tutum/wordpress Wordpress Docker image - listens in port 8... 26 [OK]paintedfox/mariadb A docker image for running MariaDB 5.5, a ... 21 [OK]dockerfile/mysql Trusted automated MySQL (http://dev.mysql.... 14 [OK]google/mysql MySQL server for Google Compute Engine 13 [OK]anapsix/gitlab-ci GitLab-CI Continuous Integration in Docker... 12 [OK]centurylink/drupal Drupal docker image without a DB included ... 11 [OK]stenote/docker-lemp MySQL 5.6、PHP 5.5、Nginx、Memcache 10 [OK]...

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。

默认的输出结果将按照星级评价进行排序。官方的镜像说明是官方项目组创建和维护的,automated资源则允许用户验证镜像的来源和内容。3.4 删除镜像

使用镜像的标签删除镜像

使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE[IMAGE...],其中IMAGE可以为标签或ID。

例如,要删除掉dl.dockerpool.com:5000/ubuntu:latest镜像,可以使用如下命令:$ sudo docker rmi dl.dockerpool.com:5000/ubuntuUntagged: dl.dockerpool.com:5000/ubuntu:latest

读者可能会担心,本地的ubuntu:latest镜像是否会受到此命令的影响。无需担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像5506de2b643b的一个标签而已。

为保险起见,再次查看本地的镜像,发现ubuntu:latest镜像(准确地说,是5506de2b643b镜像)仍然存在:$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.04 5506de2b643b 1 weeks ago 197.8 MBubuntu latest 5506de2b643b 1 weeks ago 192.8 MB

但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除该镜像。

假设本地存在一个标签为mysql:latest的镜像,且没有额外的标签指向它,执行docker rmi命令,可以看出它会删除这个镜像文件的所有AUFS层:$ sudo docker rmi mysql:latestUntagged: mysql:latestDeleted: 9a09222edf600a03ea48bd23cfa363841e45a8715237e3a58cb0167f0e8bad54Deleted: 4daeda4ad839a152a3b649672bd5135977d7f81866d3bc0e16d0af3f65cc8af6Deleted: cf07a411bf0883bd632940e8108dac49c64456a47f7390507de5685bbd6daf85Deleted: 4f513746df18b222a07bb8d76d4b6d29752ce5dcb69bfad0ce92e6c144

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载