docker容器带我入坑

Docker是啥?

Docker英文名称就是集装箱,静态而言是一个应用镜像文件;动态而言,就是一个容器。

Docker狭义上讲就是一个进程,广义上讲是一个虚拟容器,应用容器。Dcoekr进程就是一个普通的应用进程,但是用来操作镜像文件的。所以docker进程+构建的应用镜像文件就等于docker容器。

Docker后台服务进程。

docker容器带我入坑

 

KVM,Virtualbox, Vmware是虚拟出机器,让每个实例看到一个单独的机器

而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操作系统,而且彼此之间隔离

假设没有Docker,然后有进程1和进程2,它们的运行将类似下图,进程1和进程2共享kernel,它们是同一OS下2个进程,因此必须拥有不同PID,但是又共享网卡,共享IP地址,看到一样的根文件系统(不chroot的情况下)等,可以用Linux IPC手段进程间通信。

 docker容器带我入坑

有Docker的情况下,假设进程1和进程2运行于不同的容器,那么进程1和进程2都觉得自己和对方没有半毛钱关系,都觉得自己拥有自己的根文件系统,自己的网卡等,然后进程1和进程2的PID还可以一样,比如假设2个都是100。但是,此100非彼100。

docker容器带我入坑

Virtualbox等虚拟机的思路则完全不一样,如果进程1和进程2运行于不同的虚拟机,则操作系统都是双份的,它们感觉自己在不同的虚拟电脑上面跑。

docker容器带我入坑

由于可见,Docker达到了类似虚拟机的效果,但是又没有虚拟机的开销,它虚拟的层次更加高。Docker不虚拟机器,仅仅虚拟应用的运行环境

 

容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

 

容器与虚拟机

谈到容器,就不得不将它与虚拟机进行对比,因为两者都是为应用提供封装和隔离。

容器由两部分组成:

(1)、应用程序本身

(2)、依赖:比如应用程序需要的库或其他软件

容器在 Host 操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。

传统的虚拟化技术,比如 VMWare, KVM, Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十MB),还得安装整个操作系统(几十 GB)。

下图展示了二者的区别。

如图所示,由于所有的容器共享同一个 HostOS,这使得容器在体积上要比虚拟机小很多。另外,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快,开销更小,也更容易迁移。

 docker容器带我入坑

所以Docker 应用容器相对于 VM 有以下几个优点:

(1)、启动速度快,容器启动本质就是一个开启一个进程而已,因此都是秒启,而 VM 通常要更久。

(2)、资源利用率高,一台普通 PC 可以跑成百上千个容器,你跑十个 VM 试试。

(3)、性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源。

 

为什么需要容器?

为什么需要容器?容器到底解决的是什么问题?
简要的答案是:容器使软件具备了超强的可移植能力

开发人员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台配置环境

Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。

 

Docker 能干啥,总结如下:

(1)、构建容易分发简单

(2)、隔离应用解除依赖

(3)、快速部署测完就销

容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。

Docker容器底层技术是什么?

Docker技术架构图:(网上download的)

docker容器带我入坑

从Docker依赖的底层技术来看,Docker依赖linux kernel三项最基本的技术

(1)、namespaces充当隔离的第一级,是对Docker容器进行隔离,让容器拥有独立的hostname,ip,pid,同时确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程

(2)、Cgroups是容器对使用的宿主机资源进行核算并限制的关键功能。比如CPU,内存,磁盘等

(3)、union FS主要是对镜像也就是image这一块作支持,采用copy-on-write技术,让大家可以共用某一层,对于某些差异层的话就可以在差异的内存存储

Libcontainer是一个容器库,是对上面这三项技术做一个封装。

Docker engine 用来控制容器container的运行,以及镜像文件的拉取

 

接下来会详细介绍容器的底层关键技术、通过例子说明容器是如何工作的、docker容器的结构详解。