- 虚拟机与linux容器的区别
linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需捆绑一整套操作系统,只需要软件工作需的库资源和设置。系统因此变得更高效更轻量并保证部署在任何环境中的软件都能始终如一地运行。docker 启动快,秒级的
虚拟机是带环境安装的一种解决方案(连硬件也模拟),它可以在一种操作系统里运行另一种操作系统,比如windows下运行linux系统。而对底层系统来说,虚拟机就是一个普通文件,不需要就删掉。虚拟机启动慢,分钟级的,虚拟机缺点:占用资源多,冗余步骤多,启动慢
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便
每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源,耦合度低。
Docker带来的好处:DevOps开发自运维,一次构建,随处运行。更快速的应用交付和部署;更便捷的升级和扩缩容;更简单的系统运维;更高效的计算资源利用;
Docker 安装前提:
CentOS:CentOS6.5 64-bit 或更高的版本,内核版本:2.6.32-431或更高版本
//查看CentOS系统版本
[root@VM_IP_centos ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
//查看内核
[root@VM_IP_centos ~]# uname -r
3.10.0-957.21.2.el7.x86_64
- hello world 实例
docker run hello-world
//先本机去找hello-world镜像,用这个镜像生成一个容器。如果本地没有,从远程仓库拉取,下载到本地,然后以镜像为模板生产容器实例运行
docker run 的过程:
首先系统要有一个docker daemon的后台进程在运行,当刚才这行命令敲下时,发生了如下动作:
- docker client(即:docker终端命令行)会调用docker daemon请求启动一个容器,
- docker daemon会向host os(即:linux)请求创建容器
- linux会创建一个空的容器(可以简单理解为:一个未安装操作系统的裸机,只有虚拟出来的CPU、内存等硬件资源)
- docker daemon请检查本机是否存在docker镜像文件,如果有,则加载到容器中
- 将镜像文件加载到容器中
- 如果在第4步检查本机镜像文件时,发现文件不存在,则会到默认的docker镜像注册机构(即:docker hub网站或是指定的仓库)去联网下载,下载回来后,再进行装载到容器的动作
- Docker 为什么比虚拟机快
1.docker 有着比虚拟机更少的抽象层。docker 不需要实现Hypervisor硬件资源虚拟化,docker 容器上的程序直接使用都是实际物理机上的硬件资源
2.docker 利用宿主机的内核,而不需要guest os, docker 不需要和虚拟机一样重新加载一个操作系统内核,避免引导,加载操作系统内核比较费时资源的过程。而docker 直接利用 宿主机的操作系统,所以新建docker 比较快
- 容器虚拟化技术与虚拟机有什么不同?
Docker容器 | 虚拟机VM | |
操作系统 | 与宿主机共享OS | 宿主机OS上运行虚拟机OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk,vdi等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的CPU,内存消耗 |
移植性 | 轻便、灵活、适应于linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速,秒级 | 较慢,10s以上 |
- Docker 命令总结
- Docker 命令小结
- UnionFS(联合文件系统):Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite serveral directories into a single virtual filesystem)。Union文件系统是Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作出具体的应用镜像
- Docker镜像加载原理:
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfs 主要包含bootloader和kernel,bootloader主要引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完,整个内核就在内存中了,此时内存使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs,在bootfs之上,包含的就是典型的linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如ubuntu和centos等。