docker简介
docker的重要性不言而喻
1.1 Docker与传统虚拟化的对比
- 传统虚拟机技术是虚拟出一套硬件 后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程
直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。
容器的优势:
- 容器能提供接近宿主机的性能,而虚拟机会损害一部分宿主机的性能
- 启动快,同样虚机可能需要20s,但启动容器只需要1s
- 传统虚拟化需要硬件cpu的支持,容器不需要而且容器是基于内核的虚拟化
Docker优势:
- 解决OS和软件运行环境的依赖
- 对于开发人员来说,不用担心部署开发环境
- 开发环境、测试环境、生产环境高度一致
- Docker是C/S架构
Linux开机启动流程:
-
1)BIOS开机自检
-
2)根据BIOS设置的优先启动项
-
3)读取MBR引导
-
4)加载内核
-
5)启动第一个进程/sbin/init
-
6)执行系统初始化脚本/etc/rc.d/rc.sysinit完成系统初始化
-
7)运行相应的开机启动服务,如sshd
【注:传统虚拟化运行一个sshd服务需要完整的开机启动流程,docker是直接启动sshd服务,前面1)-6)全部略过,中间的流程全部精简】
1.2 Docker的三个概念
- 镜像( Image )
- 容器( Container )
- 仓库( Repository )
-
1)有图上可知,我们可以使用dockerfile文件用build方式构建镜像,也可以使用commit制作镜像,给镜像做镜像分层打上tag标签重命名。当然也可以在从docker registry上传或下载
-
2)有了镜像之后我们可以用run进行创建并启动一个容器,使之成为Container,对于容器的操作,我们可以stop、start、restart来控制。
-
3)最后我们也可以对镜像进行save备份或load还原
1.2.1 镜像(Image)
- 我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。
- 而Docker 镜像(Image),就相当于是一个 root 文件系 统。比如官方镜像 ubuntu:16.04 就包含了完整的一套Ubuntu 16.04 最小系统的 root 文件 系统。
- Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
- 镜像不包含任何动态数据,其内容在构建之后也不会被改变
1.2.2 分层存储
- 分层存储 因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计 时,就充分利用 UnionFS 的技术(1.2.1.1部分详解该技术),将其设计为分层存储的架构。
- 所以严格来说,镜像并非是 像一个 ISO那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成, 而是由一组文件系统组成,或者说,由多层文件系统联合组成。
- 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
- 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
- 因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
- 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
1.2.3 docker镜像构建机制
- docker镜像采用分层构建机制,最底层是bootfs,其上为rootfs。
(1)bootfs:用于系统引导的文件系统,包括boot引导、内核,容器启动完成后会被卸载以节约内存资源。
(2)rootfs:位于bootfs之上,表现为docker容器根文件系统。
- 传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式。
- docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个可写层,如下图所示。
完成