学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出)
目录
- 前言
- 一、Docker是什么?
- 二、Docker能干撒?
- 三、容器虚拟化技术 和 虚拟机有啥区别?
- 1.虚拟机
- 2.容器虚拟化技术
- 3.对比
- 4.Docker为啥比VM虚拟机快
- 四、Docker组成
- 4.1 镜像(image)
- 4.2 容器(container)
- 4.3 仓库(repository)
- 五、Docker的架构
- 1.架构图[^2]
- 2.架构解读
- 总结
前言
举个例子:
你开发好了项目,准备发布。
你说:“我开发好,你部署一下吧‘,
运维:“根本运行不了!”
你说:”???我这一切正常呀,你搞错了吧!“
运维:”我xxx“
...
(一场战争就此爆发😂)
这就是没有Docker前容易出现的情况。很难去在开发环境、测试环境、生产环境中保持基础环境的统一。
能不能让软件带环境呢?————Docker
一、Docker是什么?
Docker官网 这里是学怎么用
Docker Hub 这个是安装docker镜像的仓库
Docker的主要目标是“Build,Ship and Run Any App.Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”
Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将您的应用程序与基础设施分离,以便您可以快速交付软件。使用Docker,你可以像管理应用程序一样管理你的基础设施。通过利用Docker的方法来快速交付、测试和部署代码,您可以显著减少编写代码和在生产中运行代码之间的延迟。
Docker 提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,包含运行应用程序所需的一切,因此您无需依赖主机上当前安装的内容。您可以在工作时轻松共享容器,并确保与您共享的每个人都获得以相同方式工作的相同容器。
Docker 提供工具和平台来管理容器的生命周期:
- 使用容器开发您的应用程序及其支持组件。
- 容器成为分发和测试应用程序的单元。
- 准备就绪后,将应用程序作为容器或编排服务部署到生产环境中。无论您的生产环境是本地数据中心、云提供商还是两者的混合体,这都是一样的。1
总结:就是一个容器,里面装好了我开发的程序所运行的各种环境配置,保证各个到处运行的”一致性“。这个容器还能共享。
二、Docker能干撒?
如图:
我的理解就是打包环境,避免环境移植困难
1. 一次构建、随处运行
2. 更便捷的升级和扩缩容
3. 更简单的系统运维
4. 更高效的计算资源利用
三、容器虚拟化技术 和 虚拟机有啥区别?
1.虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。是硬件层面的,比如我们使用VMware安装Linux系统时,会为其分配cpu、内存、存储等这些资源。本质上虚拟机是一个iso文件,但是实际运行后就和真实的操作系统没有甚差别。
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如: VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。“
虚拟机的缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
这3个缺点,相信使用过的人都有所感受。
2.容器虚拟化技术
由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为 LXC)
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker 优势体现为启动速度快、占用体积小。
3.对比
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
4.Docker为啥比VM虚拟机快
- docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。 - docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
Docker容器 | 虚拟机VM | |
---|---|---|
操作系统 | 与宿主共享OS | 宿主机OS上运行虚拟机OS |
存储大小 | 镜像小,标语存储和运输 | 镜像庞大(vmdk,vdi等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的CPU、内存消耗 |
移植性 | 轻便、灵活、适应于Linux | 笨重、与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速、秒级 | 较慢、10s以上 |
四、Docker组成
4.1 镜像(image)
就像是一个一个的类模板。
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
4.2 容器(container)
运行镜像,来获得实例对象
-
从面向对象角度
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台 -
从镜像容器角度
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
4.3 仓库(repository)
存放镜像
仓库(Repository)是集中存放镜像文件的场所。类似于
- Maven仓库,存放各种jar包的地方;
- github仓库,存放各种git项目的地方;
- Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
五、Docker的架构
1.架构图2
Docker的架构模式是C/S,后端是一个松耦合架构,众多模块各司其职。
2.架构解读
- 用户是使用 Docker Client与 Docker Daemon 建立通信,并发送请求给后者
- Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
- Docker Enaine 执行 Docker内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registy 中下载镜像,并通过镜像管理动 Graph driver将下载镜像以Graph的形式存储
- 当需要为 Docker创建网络环境时,通过网络管理驱动 Network driver创建并配置 Docker 容器网络环境。
- 当需要限制 Docker容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成。
- Libcontainer是一项独立的容器管理包,Netwok driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作
总结
Docker是一个由三部分镜像
、容器
、仓库
组成的一个简易版Linux系统(只包含程序运行所需要的依赖项,而不是整个Linux)
。我对自己的要求就是先会用,逐渐的深入原理、分析其架构。
https://docs.docker.com/get-started/overview/ ↩︎
https://docs.docker.com/get-started/overview/#docker-architecture ↩︎