前言
Docker 是在 Linux 容器里运行应用的一种开源工具,是一种轻量级的虚拟机
-
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务 -
例如: pid=2 ——> python pid=3——>java pid4——>php,三个服务可能会相互影响 -
使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本 ——> 延伸出——>能否将这三种服务分别封装起来——>KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境 -
随着技术发展——>虚拟化技术开销较大(例如:只 要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理) ——>延伸出容器技术 -
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销
一、虚拟化概述
虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
1.虚拟化三种模式
- 全虚拟化(50%)
- 半虚拟化(软、硬件结合的方式)
- 直通(以全硬件的方式实现虚拟化的功能)
2.虚拟化功能
- 在一个操作系统内,模拟多个操作系统
- 以软件的方式模拟物理设备的功能
3.三个层面
二、Docker容器概述
名称空间:以不同空间划分不同资源
1.6大名称空间
namespace资源隔离——用容器技术封装
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
---|
user | 操作进程的用户和用户组 | pid | 进程编号 | uts | 主机名和主机域 | ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) | net | 网络设备、网络协议栈、端口等 |
ipc:把内存资源划分开来,给不同的进程去用,每个应用的进程会给它分配一块资源,它只能用自己的(进程级别隔离)
net:网络资源
2.Docker和虚拟化的区别
小而灵活,效率至上!
特性 | Docker 容器 | 虚拟机虚拟化 |
---|
启动速度 | 秒级 | 分钟级 | 运行性能 | 接近原生(直接在内核中运行)10%-20% | 50%左右损失 | 磁盘占用 | 50-100MB | 3-5G | 数量 | 成百上千,每个进程可控制一个容器 | 几十个 | 隔离性 | 进程级别 | 操作系统(更彻底) | 操作系统 | 主要支持Linux | 几乎所有 | 封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了~ 这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制
Docker 拥有的众多优势与操作系统虚拟化的特点是分不开的:
- 传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层
- 而 Docker 容器是直接再操作系统层面之上实现的虚拟化
3.使用docker有什么意义
①相同版本的docker引擎
②打包成镜像包,拖到另一个操作系统中(把引擎放在镜像中,带着镜像到处跑)
③利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了
镜像——>封装的某一时刻的服务/应用状态
容器——>应用跑起来的状态(正常提供服务的状态—运行时running)
4、应用场景
三、docker的核心概念
1.镜像(Image)
docker镜像是创建容器的基础,类似于虚拟机的快照
- 可以理解为是一个面向 Docker 容器引擎的只读模板,比如:
- 一个镜像可以是一个完整的 CentOS 操作系统环境,称之为一个 CentOS 镜像
- 一个安装了 MySQL 的应用程序,称之为是一个 MySQL 镜像
- …
- Docker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经做好的应用镜像来直接使用
2.容器(Container)
Docker 的【容器】是【从镜像创建的运行实例】,它可以被【启动、停止和删除】,容器即服务
- 创建的每一个容器都是相互隔离、互不可见的,相互之间隔离性超强,从而保证平台的安全性
- 可以把容器看做是一个简易版本的 Linux 环境,Docker 可以利用容器来运行和隔离一个个应用
3.仓库(Repository)
Docker 仓库时用来集中保存镜像的地方
- 创建完自己的镜像后,可以使用【push】命令将其上传至【公共仓库(public)】或【私有仓库(Private)】
- 之后,在另一台机器上使用这个镜像,直接【pull】下来就可以了
仓库注册服务器【Registry】是存放仓库的地方,其中包含了多个仓库,每个仓库存放某一类镜像,并使用不同的标签【tag】来区分它们
目前最大的公共仓库是【Docker Hub】
总结
镜像(镜像的压缩包) 容器(实例,通过镜像创建) 仓库(存放镜像的地方) 公有仓库:Docker官方仓库 私有仓库:个人化、私有化的仓库
Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有
1.docker run hello-world
run指令 运行
①检测本地有没有该镜像(没有的话直接到docker hub上下载)
②create(将镜像创建为容器)+start将创建好的容器运行起来
小结:Dcoker是基于容器技术的轻量级虚拟化解决方案 低层原理:docker是容器引擎,把linux的cgroup、 namespaces 等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行C1i、api等) C/s
2.问:2013年,发布了docker (面试话术)
docker有哪些优势? 和虚拟化比有什么优势?
-
docker把容器化技术做成了标准化平台CAAS(docker 统一/指定了容器化技术的标准化平台) 使用docker有什么意义(实现了3个统一) docker引擎统一了基础设施环境-docker环境——>image——>封装一一个简易的操作系统(3.0+G) docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——>images docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境)
3.如何把多个目录挂载到同一个目录下?
(存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加
4.docker原理
docker namespace实现的是资源隔离,cgroup实现的是资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配200g并不是实际占用物理磁盘200g)
|