docker
docker相关
Docker是一个基于go语言开发,用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
将项目本身以及环境打包(镜像),直接下载镜像,直接运行
核心思想:隔离
docker容器技术也是一种虚拟机技术
相对于虚拟机技术更加轻巧
核心概念
镜像:一个面向Docker容器引擎的只读模板
容器:从镜像创建的运行实例
仓库:集中保存镜像的地方;分公有和私有仓库
使用docker的意义
docker引擎统一了基础设施环境-docker环境
docker引擎统一了程序打包(装箱)方式-docker镜像
docker引擎统一了程序部署(运行)方式-docker容器
Docker的使用场景
打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
持续集成和持续交付(CI/CD):开发到测试发布
部署微服务
提供 PAAS产品(平台即服务){OpenStack的云主机类似于阿里云的ECs,属于IAAS、Docker (K8S)属于PAAS}
docker与虚拟机
虚拟机
同一个物理主机上的应用使用的是同一个库
缺点
资源占用较大
冗余步骤多
启动慢
docker
容器化技术不是一个完整的操作系统
每一个应用都有自己的库
对比
不同 | container | VM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%左右的损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更加彻底) |
操作系统 | 主要支持linux | 几乎所有 |
封装程度 | 值之打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,于宿主机隔离 |
传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件
容器内的应用直接运行在宿主机的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
docker的优势(DevOps开发、运维)
应用更快速的交付和部署
传统:需要大量的帮助文档、安装程序
docker:打包镜像发布测试,一键运行
更加便捷的升级和扩缩容
使用了docker后,部署应用更加简单(类似于搭积木)
项目打包为一个镜像,方便扩张
更简单的系统运维
在容器化之后,可以保证开发、测试环境高度一致
更高效的计算资源利用
docker是内核级的虚拟化,在一个物理机上可以运行多个容器实例,可以将服务器性能充分利用
名称空间(namespaces)
Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组名称空间。
这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
Docker Engine在 Linux上使用以下名称空间:
pid命名空间:进程隔离(PID:进程ID)。
net命名空间:管理网络接口(NET:网络)。
ipc命名空间:管理访问IPC资源(IPC:进程间通信)。
mnt命名空间:管理文件系统挂载点(MNT: mount) 。
uts命名空间:隔离内核和版本标识符。(UTS: Unix时间共享系统)。
user命名空间:操作进程的用户和用户组
只有实现了以上6种隔离,才可以认为使用容器进行了封装