docker 容器技术
一、学习目标
- 了解 Docker 与虚拟机的不同点,相比的优势
- 掌握 Docker 的启动方法、镜像与容器操作
- 掌握 Mysql tomcat Nginx Redis 等容器的部署方法
- 掌握 Docker 的备份与迁移方法
- 掌握 Docker 的面试题
二、docker简介
2.1、虚拟化
2.1.1、什么是虚拟化
在计算机中,虚拟化(英语:Virtualization )是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用。
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等等。
2.1.2、虚拟化的种类
1、全虚拟化架构
虚拟机的监视器(hypervisor )是类似于用户的应用程序运行在主机的 OS 之上,如VMware 的 workstation ,这种虚拟化产品提供了虚拟的硬件。
2、OS层虚拟化架构 (docker属于这种)
3、硬件层虚拟化
硬件层的虚拟化具有高性能和隔离性,因为 hypervisor 直接在硬件上运行,有利于控制VM 的 OS 访问硬件资源,使用这种解决方案的产品有 VMware ESXi 和 Xen server。
Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层 可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor VMM )。
Hypervisor是所有虚拟化技术的核心。当服务器启动并执行 Hypervisor 时,它会给每一台虚拟机分配适量的内存、 CPU 、网络和磁盘,并加载所有虚拟机的客户作系统。就是宿主机。
Hypervisor是所有虚拟化技术的核心 软硬件架构和管理更高效、更灵活,硬件的效能能够更好地发挥出来 。常见的产品有: VMware 、 KVM 、 Xen 等等。Openstack。
2.2、什么是docker?
2.2.1、容器技术
在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化hypervisor virtualization HV )有所不同,管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。
由于“客居”于操作系统,容器只能运行与底层宿主机相同或者相似的操作系统,这看起来并不是非常灵活。例如:可以在 Ubuntu 服务中运行 Redhat Enterprise Linux ,但无法再Ubuntu 服务器上运行 Microsoft Windows 。
相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。而反对这一观点的人则认为,由于虚拟容器所虚拟的是一个完整的操作系统,这无疑增大了攻击范围,而且还要考虑管理程序层潜在的暴露风险。
尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。最常见的一个例子就是“权限隔离监牢”( chroot jail ),它创建一个隔离的目录环境来运行进程。如果权限隔离监牢正在运行的进程被入侵者攻破,入侵者便会发现自己“身陷囹圄”,因为权限不足被困在容器所创建的目录中,无法对宿主机进一步破坏。
最新的容器技术引入了OpenVZ 、 Solaris Zones 以及 Linux 容器( LXC )。使用这些新技术,容器不在仅仅是一个 单纯的运行环境。在自己的权限类内,容器更像是一个完整的宿主机。对 Docker 来说,它得益于现代 Linux 特性,如控件组( control group )、命名空间(namespace )技术,容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好的共存。
容器被认为是精益技术,因为容器需要的开销有限。和传统虚拟化以及半虚拟化相比,容器不需要模拟层( emulation layer )和管理层( hypervisor layer ),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更多的容器。
尽管有着光辉的历史,容器仍未得到广泛的认可。一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而Docker 就是为了改变这一切而生的。
2.2.2、容器与虚拟机的比较
(1)本质上的区别:
(2)使用上的区别:
从大小、运行、集成三方面对比。
虚拟机已死,容器才是未来。
2.2.3、docker的特点
(1)上手快
用户只需要 几分钟, 就 可以把 自己 的程序 Docker 化 ”。 Docker 依赖于“写 时复制copy on write )模型 使修改 应用程序也 非常迅速 可以 说 达到 “随心 所致,代码即改的境界。
随后 ,就可以创建容器来运行应用程序了 。大多数 Docker 容器只需要不到 1 秒即可启动 。由于去除了管理程序的开销,Docker容器拥有很高的性能同时同一台宿主机中也可以运行更多的容器 ,使用户尽可能的充分利用系统资源 。
(2)职责的逻辑分类
使用Docker 开发人员只需要关心容器中运行的应用 程序 ,而运维人员只需要关心如何管理容器 。 Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。 从而降低那种"开发"时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)。
(3)快速高效的开发生命周期
Docker的目标之一就是缩短代码从开发 、测试到部署 、上线运行的周期让你的应用程序具备可移植性,易于构建并易于协作 。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而 不需要从该盒子中一件件的取)。
(4)鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构 。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)。
2.3、docker的组件
2.3.1、docker的客户端和服务端
Docker是一个客户端服务器C/S架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果 。Docker 提供了一个命令行工具Docker以及一整套RESTful API 。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程Docker守护进程。
2.3.2、docker镜像
镜像是构建 Docker 的 基石 。用户基于镜像来运行自己的容器。镜像也是 Docker生命周期中的“构建”部分 。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:
添加一个文件
执行一个命令;
打开一个窗口。
也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享 、存储和更新 。
2.3.3、Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry 分为公共和私有两种 。Docker 公司运营公共的Registry 叫做 Docker Hub 。用户可以在 Docker Hub 注册账号分享并保存自己的镜像(说明 :在 Docker Hub 下载镜像巨慢,可以自己构建 私有的Registry)。
2.3.4、docker容器
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是 Docker 生命周期中的构建或者打包阶段而容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。
所以 Docker 容器就是:
一个镜像格式;
一些列标准操作;
一个执行环境;
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中唯一不同的是:集装箱运输货物而Docker运输软件。
和集装箱一样 Docker 在执行上述操作时,并不关心容器中到底装 了什么,它不管是web 服务器,还是数据库,或者是应用程序服务器什么的 。所有的容器都按照相同的方式将内容 “装载”进去 。
Docker 也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到