目录
1、基础概念
1.1、运行环境:
系统环境、应用环境
1.2、容器:
容器可以将应用程序及其依赖项打包成一个独立的运行环境,使得应用程序可以在不同的计算机上以相同的方式运行,而无需考虑底层操作系统和硬件的差异。
1.3、容器级虚拟化:
- Docker:
基于PaaS平台为开发者提供服务,容器级虚拟化安全性会低于传统虚拟化
- CoreOS
RKT
- RedHat
podMan
- Docker 送给 CNCF
containerd
1.4、云原生:
云原生是一种新兴的软件开发和部署模式,云原生的核心理念是将应用程序设计为微服务,并使用容器、编排、自动化和持续交付等技术来实现快速部署、弹性伸缩和故障恢复等功能。
第一代paas:当用户加载PAAS时,自动触发构建脚本,从头到尾搭建环境提供给用户
第二代paas:镜像封装,类似OVF模板技术,展开后即成环境
2、Docker的发展历程
2.1、Linux container
LXC,是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源
2.2、Docker定义
docker是PaaS提供商dotcloud开源的一个基于LXC的高级容器引擎(管理工具,容器还是物理机上的一个进程),源码代码托管在GitHub上,基于GO语言并遵从apache2.0协议开源
Apache协议:开发后,可以闭源,源码售卖
GPL协议:开发后,应该用GPL开源授权;GPL2.0后可以开发后源码二次售卖
- 计算机语言分类1
- 低级:
汇编语言(贴近硬件,效率高)
- 高级:
C:语言设计、数据库、桌面操作系统、底层算法、数据挖掘、驱动
C++:C添加了语法糖,i=i+1;i++
Python(iaas):生态丰富;人工智能、爬虫(OpenStack)
Java:跨平台性强;在各种芯片架构用,JVM:(Java虚拟机)软件跑在虚拟机上(安卓)
Golang(paas):谷歌,21世纪的C语言(并发),支持CPU多核心技术(docker、kubernetes、prometheus)
R:火狐,21世纪的C语言(安全),加入到linux内核,安全性问题
- 低级:
- 计算机语言分类2
-
编译型(代码执行效率高):源码、编译器、可执行文件
- C
- Golang
- Rust
-
解释型(开发效率高): 代码、解释器、边解释边运行
- Shell
- Python
- PHP
-
半编译半解释
- Java
多级构建
-
2.3、Docker交付设想
Docker 设想是交付运行环境如同海运(互联网),0S 如同一个货轮(docker),每一个在 OS 基础上的软件都如同个集装箱(docker),用户可以通过标准化手段自由组装运行环境(系统环境+应用程序),同时集装箱的内容可以由用户自定义,也可以由专业人员制造
Docker hub(docker镜像仓库):https://hub.docker.com/
3、docker与传统虚拟化
区别
对比项 | 容器级虚拟化 | 传统虚拟化 |
---|---|---|
资源利用率 | 高 | 低 |
应用隔离性 | 差 | 强 |
安全性 | 差 | 强 |
拓展和部署 | 方便 | 不方便 |
1.容器级虚拟化没有虚拟化引擎和虚拟机,只有支撑文件;故消耗资源的地方更少,能 够让资源利用率相对传统虚拟化进一步提升
2.传统虚拟化优点在于隔离性更强更安全;容器级虚拟化消耗资源更低,安全性有所下降
3.docker封装运行环境使得用户部署更加方便且拥有一致性的运行环境;维护拓展也更加简便
namespace
namespace:(名字空间)隔离进程和资源
Namespace是Linux内核提供的一种资源隔离机制,它可以将系统中的全局资源划分为多个独立的命名空间,每个命名空间都有自己的资源副本,相互之间隔离。常见的命名空间包括:
PID Namespace:进程命名空间,用于隔离进程。
Network Namespace:网络命名空间,用于隔离网络资源,例如网络接口、IP地址、路由表等。
Mount Namespace:挂载命名空间,用于隔离文件系统挂载点。
UTS Namespace:UTS命名空间,用于隔离主机名和域名。
IPC Namespace:IPC命名空间,用于隔离进程间通信资源,例如消息队列、信号量、共享内存等。
User Namespace:用户命名空间,用于隔离用户和用户组。
使用Namespace可以实现资源隔离和容器化等功能,例如Docker就是使用Namespace实现容器隔离的。
4、docker原理
- Docker是利用LXC内核虚拟化技术隔离进程和资源,使得容器之间相互独立互不干扰。再通过共享内核,达到降低资源消耗的目的
- 容器是镜像执行的实例,容器本质上一个进程,所以容器可以被创建、杀死、重启、启动、停止等
5、docker构成
5.1、docker三要素
- 仓库:存放镜像所在的服务
docker仓库:hub.docker.com(针对大带宽镜像未来会收费,国内可用)
quay.io(开源、国内用不了)红帽
gcr.io(开源、国内用不了)谷歌
- 容器
类似传统虚拟化中的虚拟机(VM),一个虚拟机就是一个实例,一个虚拟机只能由一个镜像创建
镜像运行的实例,本质上是一个进程;一个镜像可以创建出多个容器,但是一个容器只能由一个镜像创建;容器可以封装成镜像
每一个Docker容器在运行时都是以镜像为基础层,并在镜像的基础上创建当前容器的存储层(在镜像的最上面加了一层读写层),容器存储层的生存周期与容器是一致的,因此当某一个容器删除后,该容器存储层的数据也会随之被删除掉
- 镜像
封装系统环境(去掉内核的外部生态)+应用环境(应用的可执行文件和所应用需依赖)是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),镜像不包含 任何动态数据,其内容在构建之后也不会被改变。
镜像一般命名为mysql:5.6centos、mysql:5.6ubuntu
- 系统环境
- Centos7
- ubuntu
- 应用环境
- Tomcat环境
- JDK环境
- 系统环境
分层存储
Docker镜像里包含一层层的文件系统,叫做Union File System(Union FS,联合文件系统)。
UFS(联合文件系统)可以将多个目录挂载到一起,从而形成一整个虚拟文件系统,该虚拟文件系统的目录结构就像是普通的Linux目录结构一样。
Docker通过这些文件系统,再加上宿主机的内核就构成了一个Linux的虚拟环境
5.2、docker自身组件
Docker Client:
Docker 的客户端(可本地/远程访问-需开启,一般不建议开启)
作用:下达命令
通过网络连接发送指令,基于http协议
Docker Server:
Docker daemon 的主要组成部分,接受用户通过 Docker Client 发出的请求,并按照相应的路由规则实现路由分发。
API应用程序编程接口(只要符合接口动作就能请求对应资源和动作方式)
Docker 镜像:
Docker 镜像运行之后变成容器(docker run)
C/S架构:有守护进程(docker daemon),帮我们启动容器
- (1)客户端发起下载指令,
- docker daemon本地有
- 就返回结果,
- (4)docker run启动应用,
- (5)返回结构
- docker daemon本地没有
- (2)从docker镜像仓库搜索
- (3)并下载镜像,返回给客户端消息
- (4)docker run启动应用
- (5)返回结果
- docker daemon本地有
各个linux发行版
共性:内核一样(linux魔改版,bbr除外,谷歌开发解决tcp拥堵问题)
区别:外围生态(防火墙、包管理工具、解析器等)
6、docker化应用存在的方式
6.1、linux一切皆文件,文件特性共享
6.2、会出现耦合,A不在了,B就运行不了
代码解耦,部署耦合
微服务(MS:micro service):解耦(每个服务是独立逻辑)
以前的软件:一个功能的进程崩了,整个程序会崩
part
用户管理
商品展示
库存系统
物流系统
微服务思想的软件:一个部分进程崩了,不会影响其他部分正常运行
Part1:用户管理
Part2:商品展示
Part3:库存系统
Part4:物流系统
6.3、解耦
应用镜像为只读
运行态内核(物理机提供)可以共享
linux发行版的外围生态以文件形式放在镜像中
6.4、可写层:配置不同需求的镜像
6.5、UFS(unionFS):
联合文件系统/分层文件系统
- 例如
-
mysql镜像1.0
- Centos7文件系统
- mysql文件系统
-
apache镜像1.0
- Centos7文件系统
- apache文件系统
-
清单文件(有的不下载、没有的下载、逐一按需组合)
- Centos7
- apache
- mysql
-