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需要强大它的生态圈