Docker技术入门与实战[按需印刷]

更多详情

内容简介: 在云计算时代,开发者将应用转移到云上已经解决了硬件管理的问题,然而软件配置和管理相关的问题依然存在。Docker的出现正好能帮助软件开发者开阔思路,尝试新的软件管理方法来解决这个问题。通过掌握Docker,开发人员便可享受先进的自动化运维理念和工具,无需运维人员介入即可顺利运行于各种运行环境。
《Docker技术入门与实战》分为三大部分:Docker入门、实战案例和高级话题。第一部分(第1~8章)介绍Docker与虚拟化技术的基本概念,包括安装、镜像、容器、仓库、数据管理等;第二部分(第9~17章)通过案例介绍Docker的应用方法,包括与各种操作系统平台、SSH服务的镜像、Web服务器与应用、数据库的应用、各类编程语言的接口、私有仓库等;第三部分(第18~21章)是一些高级话题,如Docker核心技术、安全、高级网络配置、相关项目等。
《Docker技术入门与实战》从基本原理开始入手,深入浅出地讲解Docker的构建与操作,内容系统全面,可帮助开发人员、运维人员快速部署应用。

目录: 《Docker技术入门与实战》
序一
序二
前言
作者简介
第一部分 Docker入门
第1章 初识Docker 3
1.1 什么是Docker 3
1.2 为什么要使用Docker 5
1.3 虚拟化与Docker 7
1.4 本章小结 8
第2章 Docker的核心概念和安装 9
2.1 核心概念 9
2.2 安装Docker 11
2.3 本书环境介绍 14
2.4 本章小结 15
第3章 镜像 16
3.1 获取镜像 16
3.2 查看镜像信息 17
3.3 搜寻镜像 20
3.4 删除镜像 21
3.5 创建镜像 23
3.6 存出和载入镜像 24
3.7 上传镜像 25
3.8 本章小结 25
第4章 容器 26
4.1 创建容器 26
4.2 终止容器 28
4.3 进入容器 29
4.4 删除容器 31
4.5 导入和导出容器 31
4.6 本章小结 32
第5章 仓库 33
5.1 Docker Hub 33
5.2 Docker Pool简介 35
5.3 创建和使用私有仓库 36
5.4 本章小结 38
第6章 数据管理 39
6.1 数据卷 39
6.2 数据卷容器 40
6.3 利用数据卷容器迁移数据 42
6.4 本章小结 42
第7章 网络基础配置 43
7.1 端口映射实现访问容器 43
7.2 容器互联实现容器间通信 45
7.3 本章小结 47
第8章 使用Dockerfile创建镜像 48
8.1 基本结构 48
8.2 指令 49
8.3 创建镜像 53
8.4 本章小结 53
第二部分 实战案例
第9章 操作系统 57
9.1 Busybox 57
9.2 Debian/Ubuntu 60
9.3 CentOS/Fedora 62
9.4 CoreOS 64
9.5 本章小结 69
第10章 创建支持SSH服务的镜像 70
10.1 基于commit命令创建 70
10.2 使用Dockerfile创建 74
10.3 本章小结 79
第11章 Web服务器与应用 80
11.1 Apache 80
11.2 Nginx 86
11.3 Tomcat 95
11.4 Weblogic 102
11.5 LAMP 119
11.5.1 下载LAMP镜像 119
11.5.2 使用默认方式启动LAMP容器 119
11.5.3 部署自己的PHP应用 120
11.5.4 在PHP程序中连接数据库 120
11.6 CMS 121
11.7 本章小结 123
第12章 数据库应用 124
12.1 MySQL 124
12.2 Oracle XE 129
12.3 MongoDB 130
12.4 本章小结 134
第13章 编程语言 136
13.1 PHP 136
13.1.1 PHP技术栈 136
13.1.2 PHP常用框架 142
13.1.3 相关资源 147
13.2 C/C++ 147
13.2.1 GCC 147
13.2.2 LLVM 150
13.2.3 Clang 150
13.3 Java 151
13.4 Python 153
13.4.1 Python技术栈 153
13.4.2 Flask 155
13.4.3 Django 157
13.4.4 相关资源 159
13.5 Perl 160
13.5.1 Perl技术栈 160
13.5.2 Catalyst 161
13.5.3 相关资源 161
13.6 Ruby 162
13.6.1 Ruby技术栈 162
13.6.2 JRuby 163
13.6.3 Ruby on Rails 164
13.6.4 Sinatra 165
13.6.5 相关资源 166
13.7 JavaScript 166
13.7.1 JavaScript技术栈 166
13.7.2 Node.js 167
13.7.3 Express 168
13.7.4 AngularJS 170
13.7.5 相关资源 171
13.8 Go 172
13.8.1 Go技术栈 172
13.8.2 Beego 174
13.8.3 Revel 175
13.8.4 Martini 177
13.8.5 相关资源 179
13.9 本章小结 180
第14章 使用私有仓库 181
14.1 使用docker-registry 181
14.2 用户认证 183
14.3 使用私有仓库批量上传镜像 186
14.4 仓库配置文件 189
14.5 本章小结 196
第15章 构建Docker容器集群 197
15.1 使用自定义网桥连接跨主机容器 197
15.2 使用Ambassador容器 199
15.3 本章小结 200
第16章 在公有云上使用Docker 202
16.1 公有云上安装Docker 202
16.1.1 CentOS 6.5系统 202
16.1.2 Ubuntu 14.04系统 207
16.2 阿里云Docker的特色服务 207
16.3 本章小结 213
第17章 Docker实践之道 214
17.1 个人学习之道 214
17.1.1 温故而知新 215
17.1.2 众人拾柴火焰高 216
17.2 技术创业之道 217
17.3 中小型企业实践之道 218
17.3.1 开发、测试和发布中应用Docker 218
17.3.2 应用Docker到生产环境 220
17.4 本章小结 220
第三部分 高级话题
第18章 Docker核心技术 223
18.1 基本架构 223
18.2 命名空间 225
18.3 控制组 227
18.4 联合文件系统 229
18.5 Docker网络实现 230
18.6 本章小结 232
第19章 Docker安全 233
19.1 命名空间隔离的安全 233
19.2 控制组资源控制的安全 234
19.3 内核能力机制 234
19.4 Docker服务端的防护 235
19.5 其他安全特性 236
19.6 本章小结 237
第20章 高级网络配置 238
20.1 网络启动与配置参数 238
20.2 配置容器DNS和主机名 240
20.3 容器访问控制 241
20.4 映射容器端口到宿主主机的实现 243
20.5 配置docker0网桥 244
20.6 自定义网桥 245
20.7 创建一个点到点连接 246
20.8 工具和项目 247
20.9 本章小结 251
第21章 Docker相关项目 252
21.1 平台即服务方案 252
21.2 持续集成 253
21.3 管理工具 256
21.4 编程开发 261
21.5 其他项目 262
21.6 本章小结 267
附  录
附录A 常见问题汇总 270
附录B 常见仓库 276
附录C Docker命令查询 294
附录D Docker资源链接 299

前言: 在一台服务器上同时运行一百个虚拟机,肯定会被认为是痴人说梦。而在一台服务器上同时运行一千个Docker容器,这已经成为现实。在计算机技术高速发展的今天,昔日的天方夜谭正在一个个变成现实。
多年的研发和运维(DevOps)经历中,笔者时常会碰到这样一个困境:用户的需求越来越多样,系统的规模越来越庞大,运行的软件越来越复杂,环境配置问题所造成的麻烦层出不穷……为了解决这些问题,开源社区推出过不少优秀的工具。这些方案虽然在某些程度上确能解决部分“燃眉之急”,但是始终没有一种方案能带来“一劳永逸”的效果。
让作为企业最核心资源的工程师们花费大量的时间,去解决各种环境和配置引发的 Bug,这真的正常吗?
回顾计算机的发展历程,最初,程序设计人员需要直接操作各种枯燥的机器指令,编程效率之低可想而知。高级语言的诞生,将机器指令的具体实现成功抽象出来,从此揭开了计算机编程效率突飞猛进的大时代。那么,为什么不能把类似的理念(抽象与分层)也引入到现代的研发和运维领域呢?
Docker无疑在这一方向上迈出了具有革新意义的一步。笔者在刚接触Docker时,就为它所能带来的敏捷工作流程而深深吸引,也为它能充分挖掘云计算资源的效能而兴奋不已。我们深信,Docker的出现,必将给DevOps技术,甚至整个信息技术产业的发展带来深远的影响。
笔者曾尝试编写了介绍Docker技术的中文开源文档。短短一个月的时间,竟收到了来自全球各个地区超过20万次的阅读量和全五星的好评。这让我们看到国内技术界对于新兴开源技术的敏锐嗅觉和迫切需求,同时也倍感压力,生怕其中有不妥之处,影响了大家学习和推广Docker技术的热情。在开源文档撰写过程中,我们一直在不断思考,在生产实践中到底怎么用Docker才是合理的?在“华章图书”的帮助下,终于有了现在读者手中的这本书。
与很多技术类书籍不同,本书中避免一上来就讲述冗长的故事,而是试图深入浅出、直奔主题,在最短时间内让读者理解和掌握最关键的技术点,并且配合实际操作案例和精炼的点评,给读者提供真正可以上手的实战指南。
本书在结构上分为三大部分。第一部分是Docker技术的基础知识介绍,这部分将让读者对Docker技术能做什么有个全局的认识;第二部分将具体讲解各种典型场景的应用案例,供读者体会Docker在实际应用中的高效秘诀;第三部分将讨论一些偏技术环节的高级话题,试图让读者理解Docker在设计上的工程美学。最后的附录归纳了应用Docker的常见问题和一些常用的参考资料。读者可根据自身需求选择阅读重点。全书主要由杨保华和戴王剑主笔,曹亚仑写作了编程开发和实践之道章节。
本书在写作过程中参考了官方网站上的部分文档,并得到了DockerPool技术社区网友们的积极反馈和支持,在此一并感谢!
成稿之际,Docker已经发布了增强安全特性的1.32版本。衷心祝愿Docker及相关技术能够快速成长和成熟,让众多IT从业人员的工作和生活都更加健康、更加美好!
作者于2014年11月

序言: 序一
信息技术领域一直试图解决的核心问题之一是提供强大的计算能力。在过去很长一段时间里,我们可以依靠硬件性能的提升来提高物理计算资源的能力,提升处理器的主频或者增加每个处理器里面的处理核心的数量。然而这个时代随着摩尔定律无法胜过物理定律而不得不终结。
在云计算时代,信息技术所面临的难题则截然不同。分布式、虚拟化、大数据……每一项挑战都不是仅仅依靠硬件或软件的局部优化就能得到解决的,更需要通过高效的资源利用来“压榨”计算平台的每一点运算能力。
作为充分发掘计算平台能力的Linux容器虚拟化技术,在近些年得到广泛的关注和发展。从早期IBM发起的LXC项目,到今天如火如荼的Docker项目,这些不断涌现的创新项目给计算模式本身带来了巨大的变革。市面上关于传统虚拟机相关技术的书籍有不少,但是探讨容器虚拟化技术的著作寥寥无几。尽管互联网上已经出现了很多关于容器虚拟化、Docker的文章,但这些文章或过于简略,或仅关注某个技术方面,总体上缺少系统化的从概念、到实现、到如何使用的介绍。这给广大信息产业从业人员了解最新的技术潮流带来了不小的障碍。
值得庆幸的是,能够第一时间拜读这本《Docker技术入门与实战》。作为国内开发者撰写的首本探讨Docker容器虚拟化技术的书籍,一方面它深入浅出地讲解了Docker应用的诸多话题,包括围绕镜像、容器、仓库等核心概念如何来实现“Build、Ship、Run”的高效流程;另一方面,难能可贵的是书中提供了大量翔实的实战案例,涵盖DevOps领域的典型场景。无论是Docker技术的初学者还是业内的一线研发人员或资深专家,本书都值得一阅。
作者之一的杨保华博士在加入IBM之后,一直从事云计算与软件定义网络领域的相关解决方案和核心技术的研发,热心关注OpenStack、Docker等开源社区,热衷使用开源技术,并积极参与开源社区的讨论、积极提交代码。这使得他既能从宏观上准确把握Docker技术在整个云计算产业中的定位,又能从微观上清晰理解技术人员所渴望获知的核心之处。
如果你只是Docker的初学者,阅读本书,或许并不能让你立刻成为行业内的专业人士,但一定能让你马上体会Docker技术所带来的众多优势。如果你已经开始使用Docker,阅读本书也可以帮助你解答实践中的一些问题,帮助你更恰当地使用Docker技术。本书深入浅出,讲解到位,是一本值得常置案头的好书。
刘天成
IBM中国研究院,云计算运维技术研究组经理
2014年11月

序二
最近的几年,云计算是计算机与互联网界的焦点,它的广泛应用离不开虚拟化技术的支持。作为Linux下的容器虚拟化工具,Docker以其轻便易用而受人关注。
这本书向读者清晰地介绍了Docker这个虚拟化工具;详细比较了Docker和传统虚拟机在组织架构、实现技术和性能上的差异。在此基础上,本书围绕着镜像、容器、仓库三个部分,从实践的角度出发,讲解了Docker的安装、配置、使用的方式。在本书的后面几个章节,也介绍了许多Docker的实现细节和工作原理。总体而言,本书从实际的案例入手,由浅至深,循序渐进,内容相当丰富。
对于正在寻找虚拟化工具的用户来说,年轻而有活力的Docker项目绝对是首选。而如果你正在使用或打算使用Docker,或者想学习一些新的技术以丰富自己,那就一定不要错过这本书。书中有大量的实践案例、完备的细节讲解,将这本书常备于手边,比起查阅复杂繁琐的文档,能为工作或学习节省更多的时间。
王灿
浙江大学计算机学院副教教授
2014年11月

媒体评论: 虽然前几年在容器方面所做的工作不多,但是从2015年起,我们计划将工作重点放在 Docker 等容器技术上。
——杨卫华
新浪微博技术总监
本书作者之一杨保华博士在加入 IBM之后,一直从事云计算与软件定义网络领域的相关解决方案和核心技术的研发,热心关注 OpenStack、Docker 等开源社区,热衷使用开源技术,积极参与开源社区的讨论并提交代码。这使得他既能从宏观上准确把握 Docker 技术在整个云计算产业中的定位,又能从微观上清晰理解技术人员所渴望获知的核心之处。
——刘天成
IBM中国研究院云计算运维技术研究组经理
好的IT技术总是迅速“火爆”,Docker 就是这样。好像忽然之间,在企业一线工作的毕业生们都在谈论 Docker。在IT云化的今天,系统的规模和复杂性,呼唤着标准化的构件和自动化的管理,Docker 正是这种强烈需求的产物之一。这本书很及时,相信会成为IT工程师的宝典。
——李军
清华大学信息技术研究院院长
本书围绕着镜像、容器、仓库三个部分,从实践的角度出发,讲解了 Docker 的安装、配置、使用的方式。在本书的后面几个章节,也介绍了许多 Docker 的实现细节和工作原理。总体而言,本书从实际的案例入手,由浅至深,循序渐进,内容相当丰富。
——王灿
浙江大学计算机学院副教授
Docker 在公司多个项目中正式上线,目前运行稳定,在系统的关键节点使用 Docker 容器集群来快速扩展计算能力效果显著。本书作者之一戴王剑前期的充分调研和测试功不可没。
——徐勋业
浙江中正智能科技有限公司副总裁
本书详细介绍了 Docker 的发展历史、作用、部署方法和应用案例,文笔流畅,通俗易懂,对促进开源软件和虚拟化技术发展很有意义,对加强信息化在各行业的应用有较大的参考价值。
——杨传斌
浙江师范大学计算机学院教授

书摘: 第1章
初识Docker
如果说个人主机时代大家比拼的关键是CPU主频的高低和内存的大小,那么在云计算时代,虚拟化技术无疑是整座信息技术大厦最核心的一块基石。
伴随着信息技术产业的发展,虚拟化技术已经应用到各种关键场景中。从最早上世纪60年代IBM推出的大型主机虚拟化到后来X86平台上的虚拟化,虚拟化技术自身也在不断丰富和创新。
虚拟化既可以通过硬件模拟来实现,也可以通过操作系统来实现。而近些年出现的容器虚拟化方案,更是充分利用了操作系统本身已有的机制和特性,可以实现轻量级的虚拟化,甚至有人把它称为新一代的虚拟化技术。Docker毫无疑问就是其中的佼佼者。
那么,什么是Docker?它会带来什么好处?它跟现有虚拟化技术又有何关系呢?
本章在介绍Docker项目的起源和发展之后,会剖析Docker和Linux容器技术的密切联系,以及在开发和运维中使用Docker的突出优势。最后,还将阐述Docker在整个虚拟化领域中的定位。
1.1 什么是Docker
Docker开源项目
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 EC2 Container,提供对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 为什么要使用Docker
Docker容器虚拟化的好处
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容器技术与传统虚拟机技术的特性比较。
特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个
隔离性 安全隔离 完全隔离