一. 什么是 Docker
介绍 Docker, 首先会有第一个问题: 什么是 Docker?
如下是官方给出的定义:
Docker 是以 Docker 容器为资源分割和调度的基本单位,封装整个软件的运行时环境,为开发者和系统管理员设计的,用于构建,发布和运行分布式应用的平台.
他是一个跨平台,可移植并且简单易用的容器解决方案. Docker 的源代码托管在 GitHub 上, 基于 Go 语言开发并遵从 Apach2.0 协议. Docker 可以在容器内部快速自动化的部署应用, 并通过 Linux 内核技术(namespace, cgroup 等)为容器提供资源隔离和安全保障. 只有的文章我会详细为大家介绍 namespace, cgroup等 Linux 内核技术.
二. Docker 架构
如图所示为 Docker 架构总览
Docker 架构总览[此图来源于 《Docker 容器与容器云(第二版)》]三. Docker 相关概念
镜像 (Image): 是一个可执行的包, 包含了应用程序运行的所有内容: 代码, 运行时, 库, 环境变量和配置文件
容器 (Container): 容器是镜像运行时的实例
Daemon: 负责维护 Docker 运行的守护进程, 担负着资源管理, 任务调度等多项功能
三者关系: Container 基于Image 被 Daemon 创建和管理, 来实现提供服务的功能
容器(container)和虚拟机(VM)
容器(container)和虚拟机(VM)容器在Linux上本机运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用任何其他可执行文件的内存,使其轻量级。相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多
四. Docker 安装
太多的教程, 这里就不详细介绍每一步的安装过程了, 可以参考官方文档
五. Docker 带来了什么
1. 持续部署与测试
2. 跨云平台支持
3. 环境标准化和版本控制
4. 高资源利用率与隔离
5. 容器跨平台性与镜像
6. 易于理解且易用
7. 应用镜像仓库
六. 生命周期(参考Docker的生命周期)
生命周期(侵删)
Docker 创建
Docker 创建一个容器有两种途径: Create 和Run
使用 Create 只会创建此容器所需要的文件系统, 而不会给其分配运行资源, 也就是不会分配CPU, Memory, Network 和Process, 因此创建的容器状态为Stopped. 只有在明确对此容器调用Start 命令之后, Docker Daemon 才会按照配置参数给其分配相应的运行资源, 而这时此容器就会处于Running 状态
Run 命令会连续调用Create 和Start 命令, 对目标容器创建文件系统和分配运行资源.
容器停止
容器会从Running 状态转换到Stopped 状态. 此种状态转移分为两种情况: 正常关闭和异常关闭.
正常关闭指的是用户调用Kill 命令或者Stop 命令, 通过Docker Daemon 对正在运行的容器进行资源回收. 经过Docker Daemon 的资源回收之后, 此容器所有内存中的数据都会被销毁, 但其文件系统仍然存在. 此时的状态与使用Create 命令之后的效果相比, 只是文件系统多了一部分数据. 此后仍然可以通过Start 再度启动, 将状态转换至Running 状态.
异常关闭发生的原因有很多, 在实际运行当中主要有 OOM, 进程意外退出两种情况.
OOM: Docker 在处理OOM 事件时采取了“熔断器”和“耐压舱”的处理机制
熔断器: 若容器耗尽已分配的内存资源, 触发的是宿主机操作系统的内核OOM 事件, 因此最终是由宿主机内核来关闭这些进程.
耐压舱: 如果用户不想关闭这个容器, 那么可以选择--oom-kill-disable 来禁用OOM-Killer. 使用此参数时要注意: 如果使用 -m 设置了此容器内存上限, 那么当容器到达内存资源上限时, 主机不会关闭容器, 但也不会继续向此容器继续分配资源, 此时容器将处于hung 状态.
进程意外退出: Docker 目前无法检测容器是正常退出还是异常退出
每个容器内部都存在一个Init 进程, 容器中其他所有进程都是此进程的子进程. 一个容器运行不退出, 表现在主机系统上面就是容器当中的Init 进程和其子进程处于运行状态. 如果一个子进程因为某种原因造成了退出, 那么其父进程也会同步退出, 直至Init 进程也退出. 当Init 进程退出时, 也就代表着此容器被关闭.
关闭的容器都会转换到Stopped. 当出现容器关闭情况时, 若设置了-restart 参数,Docker Daemon 会尝试再次重新将此容器由Stopped 状态转为Running 状态.
Docker 容器的生命周期中, 除了Running 态和 Stopped 态之外, 还有另外一种状态: Paused状态. 处于此种状态的容器, 看似存在却无法做任何事情. 究其原因, 是 Docker 剥夺了此容器的CPU 资源. 而其他资源, 如 Memory 资源, Network 资源等还保留未动. 如此一来, 失去了CPU资源的进程, 是不会被主机内核系统所调度的, 所以此容器就处于 ‘冰封’ 状态. 而为其解封只要重新赋予其CPU 资源就可以.
因此, 一个容器完整的生命周期就是在 Running→Paused→Stopped 三种状态之间相互转换. 而是否具有运行资源就是区分容器状态的唯一标准.Docker 管理容器的过程就是 Docker 重新分配主机资源的过程, 而主掌资源分配大权的角色就是 Docker Daemon.
第一篇文章, 开个好头, 文章仅概要介绍了 Docker 相关信息, 接下来的文章会针对每一个模块, 详细深入学习,希望能坚持写下去, 还请大家多多关注批评指正. 接下来立一个 flag: 本周再 完成一篇, 介绍一下当我们启动一个容器实例时, 都发生了什么?
参考文档
《Docker 容器与容器云(第二版)》
网友评论