美文网首页
Docker 笔记

Docker 笔记

作者: IrvinX | 来源:发表于2019-07-08 23:07 被阅读0次

一. 什么是 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)

容器在Linux上本机运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用任何其他可执行文件的内存,使其轻量级。相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多

容器(container)和虚拟机(VM)

四. Docker 安装

太多的教程, 这里就不详细介绍每一步的安装过程了, 可以参考官方文档

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的生命周期

Docker 官方文档

《Docker 容器与容器云(第二版)》

相关文章

网友评论

      本文标题:Docker 笔记

      本文链接:https://www.haomeiwen.com/subject/blszhctx.html