Docker初回忆

从第一次接触Docker到现在大概也有两年多了, 基本上停留在用的层面.
现在是时候回顾一下这项革命式的技术了.

  • 什么是Docker?
  • 为什么是Docker?
  • Docker是如何实现的?
  • Docker的实践
  • Docker的未来

什么是Docker?


Docker是一种虚拟化技术,可以实现资源的隔离.
在我和朋友的交流中,我对Docker官方Logo挑过刺, 原因是

  • docker的英文原含义是码头工人, Docker的logo没体现这一角色
  • 这个logo上面的的集装箱代表的是一种隔离,但不能表面这是Docker,虚拟机也能隔离,也可以是集装箱啊.

历史

Docker的前身是Linux容器(LXC), 但LXC本身比较复杂,不易于管理和使用。

核心概念

Docker有三大核心概念

  • Image - 可以理解为一个文件,这个文件包含了程序,和相应的环境.
    • 一个镜像可以代表特定的目的。比如最简单的镜像就是copy文件
    • 镜像是分层次的。分层的好处就是镜像可以被复用。
  • Container - 镜像运行起来可以看作是容器。
    • 有自己的root文件系统
    • 有自己的网络配置
    • 有自己的进程空间
    • 从操作系统的角度来看, 每个容器都是docker daemon的子进程。
    • 从容器的行为来看,对于运行在容器内的进程来说,容器就是像是操作系统。 有句俗话,如果一个动物走起来像鸭子,叫起来像鸭子,游泳起来也像鸭子,那么它就是鸭子
  • Repository - 专门用来存放镜像的地方, 所以要获得一个镜像需要知道三种类型的信息
    • 仓库名
    • 镜像名
    • 镜像的版本

为什么是Docker?

Docker和虚拟机的区别


虚拟机和Docker一样可以做到资源隔离,那为什么是Docker笑到最后呢?
虚拟机模拟的是硬件,在模拟的硬件基础上,安装操作系统,运行程序。
Docker没有模拟硬件,直接依赖于宿主的内核.

  • 启动速度。Docker启动速度约等于本地进程,虚拟机起码要10几秒以上.
  • 占用资源。假设一个进程是10M, 如果用虚拟机启动,占用的内存资源起码好几百兆,因为虚拟机是整个操作系统的模拟。如果用Docker, 相当于在进程外面包了一个壳,充其量占用的是几十兆的资源.

虚拟机的优点是能提供完整的操作系统内核,但Docker没有内核,可以认为Docker没有魂,采用了某些技巧让使用者看起来像虚拟机.

根据10倍好理论,一个事物要代替另外一个事物,仅仅是好一点是不够的,要好就要10倍以上.

Docker的实际应用

  • 构建微服务
  • 让开发和运维之间职责分离和明确,不会打架.
    • 保证各地方环境的一致性
    • 不会出现那种在本地程序是好的,怎么到了开发环境就报错这种情况. 一般来说,程序员只关心代码和本地开发环境,至于怎么上QA, Staging, Live,这些事情不是程序员关心的。

Docker是如何实现的?

Docker隔离资源原理

  • Namespaces - 让进程看来拥有自己的资源。有以下6种隔离
    • 主机名和域名
    • 进程间通信
    • 进程号
    • 网络
    • 文件系统
    • 用户管理
  • CGroups - Linux Control Group. 光隔离还没有用,因为进程还是可以无限制访问宿主加上的资源
    • 限制内存
    • 限制CPU
    • 限制磁盘
    • 限制网络
    • 局限性
      • /proc目录下的文件记录的是宿主机的内核运行的信息,会造成内核信息的泄露。
  • rootfs
    • 包含了一个操作系统的文件,配置和目录,但不包含内核,内核用的还是宿主机的。
    • rootfs让环境的一致性是成为了可能.
    • Windows上的Docker和Mac上的Docker因为没有Linux内核,只能基于虚拟化技术来完成. 所以一开始在windows接触Docker的时候,不知道为什么要安装一个虚拟机.
  • 一些事实
    • 无论怎么隔离,这些进程是共享宿主机的内核。所以在windows宿主机上运行linux容器,或者在低版本的linux宿主机上运行高版本的linux容器是行不通的
    • Docker容器内修改时间,目前来看不会导致宿主机Mac的时间被修改.

所以一个容器就等于宿主机上启动了一个进程

  • 这个进程启用了多个Namespace
  • 受 CGroup控制


限制这个理念也正是我之前提到的系统的约束,戴着脚镣跳舞才能守规矩.

Docker的实践

Docker常用命令

  • 构建镜像 - 前提是有Dockerfile存在
    docker build -t ricky:0.0.1 .
  • 查看镜像
    docker image list
    或
    docker images
  • 启动镜像
    docker run -t -i ricky:0.0.1 /bin/bash
  • 查看Container
    运行中的容器
    docker ps
    或
    docker container ls
    所有容器
    docker ps -a
    或
    docker container ls -a

Docker的未来

Docker的启动速度接近于本地进程了,所以在启动速度这块未来不可能有大的进展了.
Docker需要做的是规范公用镜像,让公用镜像更小,更安全。
Docker如果运行在物理机,如何保证Docker内部的东西不暴露给外界,且不侵害到物理机呢?
Docker需要强大它的生态圈