本文为阅读笔记,原文请见什么是Docker?看这一篇干货文章就够了! - 知乎 (zhihu.com)
容器技术的起源
build once,run everyone
假设你们公司正在秘密研发下一个“今日头条”APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。
测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,“明明在人家的环境上可以运行的”。
从整个过程可以看到,不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。
有的同学可能会说:“等等,先别改变世界,我们有虚拟机啊,VMware好用的飞起,先搭好一套虚拟机环境然后给测试和运维clone出来不就可以了吗?”
在没有容器技术之前,这确实是一个好办法,只不过这个办法还没有那么好。
容器技术解决的问题
容器技术 VS 虚拟机
-
体积
-
虚拟机使用时要加载操作系统,虚拟机本身会占用很多内存,会导致不能同时部署更多应用程序。可我们要部署的是应用程序,要使用的也是应用程序而不是操作系统
-
-
容器系统更加轻量级且占用的资源更少,与操作系统动辄几G的内存相比,容器技术只需数M空间,因此我们可以在同样规格的硬件上大量部署容器
-
-
隔离实现
现代软件开发的一大目的就是隔离,应用程序在运行时相互独立不干扰
-
使用虚拟机技术实现隔离会占用大量资源在虚拟机本身
-
-
容器技术只隔离应用程序的运行时环境(程序运行以来的各种库及配置)但容器之间可以共享同一个操作系统
-
-
-
装载时间
-
使用时要加载整个虚拟机系统所有服务,耗时较长
-
不同于操作系统数分钟的启动时间,容器技术几乎瞬间启动,容器技术为打包服务栈提供了一种更加高效的方式
-
容器技术
-
Container,容器可类比集装箱,集装箱有以下优点
-
相互隔离
-
反复使用
-
快速装载和卸载
-
规格标准
-
如何使用容器
-
容器是一种通用技术,docker只是一种实现
docker
-
docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序在任何环境都会有一致的表现
-
这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只与集装箱有关(容器),与集装箱在哪个港口或货船无关
-
docker可以屏蔽环境差异,只要你的程序打包到了docker中,无论运行在什么环境下程序的行为都是一致的,只要确保一个容器中的程序正确运行,那么你就能确信无论在生产环境中部署多少都能正确运行
-
快速部署
如何使用docker
-
概念:dockerfile image container
-
简单理解为image为可执行程序,container为运行起来的进程,dockerfile为image的源代码,docker为“编译器”
-
docker build :我们需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后吧dockerfile交给docker进行“编译”,生成的可执行程序就是image
-
docker run:运行image。 image运行起来就是docker container
docker 工作原理
-
实际上docker使用常见的CS架构,docker client 负责处理用户输入的命令,真正工作的其实是server,即docker daemon
-
docker client 与docker daemon 可以运行在同一台机器上
-
docker工作流程
-
docker build
当我们学完dockerfile交给docker“编译”时使用该命令,client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出image
-
docker run
docker daemon 接收到该命令后找到具体的image,加载到内存中执行,image执行起来就是所谓的container
-
docker pull
docker registry 可以用来存放各种image,公用的可以供任何人下载image的仓库就是docker Hub
docker pull可以从从Docker Hub中下载image
docker的底层实现
-
NameSpace
-
一种资源隔离方案,Linux中PID、IPC、网络等资源是全局的。在该机制下这些资源就不再是全局的,而属于某个特定的NameSpace
-
各个NameSpace下的互不干扰,是的每个NameSpace看上去像个独立的操作系统一样
-
-
Control Groups
-
虽然NameSpace技术可以实现资源隔离,但进程还是不受控制的访问系统资源,为了控制容器中进程的资源访问,docker采用cgroup控制容器中近程对系统资源的消耗,比如限制某个容器使用内存的上限等
-
-
通过此两项,容器看起来就真的像独立的操作系统了
-