3.5docker引擎(Docker Engine)
Docker Engine是具有以下主要组件的客户端-服务器(C/S架构)应用程序:
==server端:==服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
==client端:==REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
命令行界面(cLI)客户端((docker命令)
docker run
docker start
docker rm
3.6docker三要素
Docker images:镜像:统一的封装方式——>模板
Docker container:容器:==统一的运行时环境 ==——>基于镜像,运行状态/运行时状态
Docker registry:镜像仓库:放置镜像的仓库——>存放镜像模板
存储镜像的地方,默认在公共的 Docker Hub上查找,可以搞个人仓库。
仓库大类:①公共仓库—>docker hub ②私有仓库registry harbor
docker三要素
镜像——>模板
容器——>基于镜像,运行状态/运行时状态
仓库——>存放镜像模板
客户端发起各种各样的命令,给与主机
主机会调用镜像,如果有镜像直接用,运行为容器
如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器
3.7六大名称空间(namespace)
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net(网络资源) | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
MNT Namespace
提供磁盘挂载点和文件系统的隔离能力
比如一个宿主机是 ubuntu 的服务器, 可以在里面启动一个 centos 运行环境的容器并且在容器里面启动一个 Nginx 服务, 此 Nginx 运行时使用的运行环境就是 centos 系统目录的运行环境, 但是在容器里面是不能访问宿主机的资源, 宿主机是使用了 chroot 技术把容器锁定到一个指定的运行目录里面
IPC Namespace
提供进程间通信的隔离能力
同一个容器内的进程间通信相互可见,不同容器则不可见(不能跨容器访问)
UTS Namespace
提供主机名隔离能力
UTS提供主机名与域名的隔离,让每个docker拥有的主机名和域名,并独立于宿主机系统和其上的其他容器
docker中,每个镜像基本都以自身所提供的服务名称来命名镜像的hostname,且不会对宿主机产生任何影响
PID Namespace
提供进程隔离能力
pid 进程运行时系统随机分配的代号,程序终止后被回收,可能分配给其他程序,在linux系统中,多个容器的进程通过 PID namespace 进程隔离
对进程PID重新标号,即两个不同namespace下的进程可以有相同的PID。每个PID namespace都有自己的计数程序
Net Namespace
提供网络隔离能力
提供了关于网络资源的隔离,包括网络设备、IPv4和IPv6协议栈、IP路由表、防火墙,创建的时候添加CLONE_NEWNET标识符位,Docker 使用 network namespace 启动一个 vethX 接口, 这样你的容器将拥有它自己的桥接 ip 地址, 通常是 docker0, 而 docker0 实质就是 Linux 的虚拟网桥,网桥是在 OSI 七层模型的数据链路层的网络设备, 通过 mac 地址对网络进行划分, 并且在不同网络直接传递数据
User Namespace
提供用户隔离能力
主要隔离了安全相关的标识符和属性
允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户 UID 和 GID,把用户的作用范围限制在每个容器内,包括用户ID、用户组ID、root目录、key以及特殊权限
3.9容器特性
特性——>性能损耗10-20%
灵活:即使是最复杂的应用也可以集装箱化。
轻量级:容器利用并共享主机内核。
可互换:可以即时部署更新和升级。
便携式:可以在本地构建,部署到云,并在任何地方运行。
可扩展:可以增加并自动分发容器副本。
可堆叠:可以垂直和即时堆叠服务。
3.10容器小的架构体系
容器和虚拟机都具有相似的资源隔离和分配特点,但是功能不同,因为容器虚拟化了操作系统,而不是硬件,所以更加便携和高效
四、Docker和虚拟化的区别
4.1Docker和虚拟化的区别
比较点 | 容器 | VM |
特性 | Docker容器(一个进程控制) | 虚拟机虚拟化(完整的操作系统) |
操作系统 | 主要支持Linux | 几乎所有 |
运行性能 | 接近原生(直接在内核中运行)10%-20%左右的损失 | 50%左右损失(全虚拟化类型) |
抽象层 | 应用程序层的抽象,将代码和依赖项打包在一起【容器是应用层面的隔离】 | 将一台服务器转变为多台服务器的物理硬件层的抽象【虚拟化是物理资源层面的隔离】 |
OS内核 | 多个容器可以在同一台计算机上运行,并与其他容器共享OS内核 | 也允许多个VM在单台计算机上运行,但需要启动单独的虚拟机 OS |
OS数量 | 仅有一个物理机的OS,多个容器共享物理机的资源 | 多个OS(物理机一个OS,每个 VM 一个 OS),均独享资源 |
运行数 | 一台物理机可以运行数百个容器 | 一台物理机最多可以运行十来个虚拟机 |
大小 | 容器镜像的大小通常为几十 MB | 包含操作系统、二进制文件、库,至少也要几个 GB |
OS数量 | 仅有一个物理机的OS,多个容器共享物理机的资源 | 多个OS(物理机一个OS,每个 VM 一个 OS),均独享资源 |
运行数 | 一台物理机可以运行数百个容器 | 一台物理机最多可以运行十来个虚拟机 |
大小 | 容器镜像的大小通常为几十 MB | 包含操作系统、二进制文件、库,至少也要几个 GB |
容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了。
这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制
4.2为什么 docker 比 vm 快
docker 有着比虚拟机更少的抽象层
docker 不需要 Hypervisor 实现硬件资源虚拟化
运行在 docker 容器上的程序直接使用的都是实际物理机的硬件资源
4.3HostOS 和 GuestOS 的区别
GuestOS:VM(虚拟机)里的系统
HostOS:物理机里的系统
五、Docker有哪些优势?和虚拟化比有什么优势?
docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker。
使用docker有什么意义(实现了3个统一)
docker引擎统一了基础设施环境-docker环境——>image——>封装一一个简易的操作系统(3.0+G)
docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——>images
docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境)
实现了一次构建,多次、多处使用。
六、总结
6.1什么是docker?docker原理?
docker是一种封装和运行的开源平台,他统一了封装方式,统一了运行方式,开源平台指的是docker引擎,统一的封装方式指的是镜像,统一的运行方式指的是容器。
cgroup资源控制与namespaces两者构成了docker底层原理
docker是一种容器技术,把linux中的==cgroups(资源管理)和namespace(名称空间)==等容器底层技术进行完美封装,并抽象为用户创建和管理容器的便捷界面(命令行cli、api等),这种C/S架构
6.2简述Docker主要使用的技术?
Cgroups:资源控制,管理一些系统资源
Namespace:资源隔离(名称空间)
rootfs:文件系统隔离(使用内核提供的rootfs)
容器引擎(用户态工具) :生命周期控制
docker本质就是宿主机的一个进程, docker是通过namespace(命名空间)实现资源隔离,通过cgroup,实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘50og)
Namespace:资源隔离(名称空间)
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net | (网络资源) 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
6.3简述Docker体系架构
Docker客户端 - Docker
docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。
Docker服务端-Docker Daemon资源限制
docker服务端是一个服务进程,管理着所有的容器。
Docker镜像一Imagefont>
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码。运行时间,库,环境变量,和配置文件
Docker容器-Docker Container
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
Docker镜像仓库-- Registryfont>
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private、常用)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。
6.4如何把多个目录挂载到同一个目录下?
(存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加式文件系统