Docker 概述
本文将介绍 Docker,一个开源的应用容器引擎。
一、什么是 Docker?
- Docker 是一个开源的应用容器引擎
- 开发者可以将应用及其环境打包为容器,并通过 Docker 运行
二、容器
1. 物理机、虚拟机、容器
物理机:
虚拟机:
容器:
2. 什么是容器?
容器是一种相对于虚拟机而言更加轻量的虚拟化技术。
容器的基本思想是把程序及其环境打包,并在运行时隔离外部环境,使得不再需要关心具体的外部环境,从而实现 “一次配置,处处运行”。
容器的本质只不过在进程上加了隔离和限制。
3. 容器的实现 - 隔离
(1) 为什么需要隔离?
通过隔离技术,可以保证容器只能访问属于自己的资源,避免应用程序之间相互干扰相互影响,从而确保宿主机和应用程序的安全性及可靠性。
(2) 具体实现
操作系统提供了 PID Namespace、Mount Namespace、IPC Namespace、Network Namespace、User Namespace 等 Namespace,通过它们可以对进程做 “障眼法”,使得进程只能看到属于自己的 “视图”。
(3) 容器隔离与虚拟机隔离的区别
- 容器隔离:
- 由操作系统负责,容器只负责通知操作系统对隔离做处理
- 隔离并不彻底,容器共用宿主机的操作系统内容,并且许多资源(例如时间)是无法隔离的
- 资源消耗小,启动快
- 虚拟机隔离:
- 由虚拟机自己负责,它会虚拟出所有硬件,安装操作系统,然后再让应用程序运行在上面
- 隔离程度非常高
- 资源消耗大,启动慢
4. 容器的实现 - 限制
我们往往希望容器只能获得一定的资源(例如希望容器 A 只能使用 0.5h 1g),而不希望它无限制占用资源,否则可能影响同一宿主机上其它容器的正常运行,也会影响商业上的成本控制。
具体来说,通过 Linux Cgroups,即 Linux Control Group,其主要功能是对进程做资源限制。
此外,CGroups 还能够对进程做优先级设置、审计、挂起和恢复
三、镜像
1. 什么是镜像?
镜像与容器的关系类似类与实例,镜像是容器的静态定义,容器是镜像的运行实体。
镜像的本质是 rootfs,即文件系统快照,是对应用程序及其运行环境的所有静态文件的打包,包含操作系统相关文件、应用程序、应用程序依赖等。
每次启动容器时,会通过 Mount Namespace 将镜像挂载到容器的根目录上,作为容器的执行环境。
2. 镜像的实现 - 分层
镜像中包含大量通用且固定的内容,比如通用的系统文件、依赖等,这些东西在许多镜像中都是完全一样的,如果重复存储,对磁盘和网络都会造成巨大的浪费。
针对这一问题,Docker 想到了分层(Layer)的解法,具体来说:
- 镜像由许多镜像层组成,每层都是只读、不可修改的一组文件
- 相同的层可以在镜像之间共享
- 多个层堆叠后通过 Union FS 联合文件系统技术组合成最终的文件系统
参考
- Docker_百度百科
- Docker 教程 | 菜鸟教程
- Kubernetes 入门实战课
- 深入剖析 Kubernetes